梦柯教育_技术成...吧 关注:544贴子:543
  • 1回复贴,共1

梦柯教育 一步一步实现字母索引导航栏

取消只看楼主收藏回复

DEMO
链接:在线DEMO,源代码
这个索引导航栏的效果在很多 APP 中都有应用,我也是参考了一些 APP 的效果进行实现。
不过之前接触移动端页面开发较少,所以是边学边做,也就把这个过程中的一些东西整理记录下来。
设计
这个功能的基本需求可以总结为一句话:手指在导航栏(也就是 DEMO 上页面右侧的包含字母的竖条)拖动时,根据当前手指位置,页面主体内容列表跳转到对应字母的内容项。
当然,延伸开来,可以是对于已经排序的列表,导航栏显示对应的索引字符列表,支持快速跳转到对应的索引位置。
这里主要介绍导航栏的实现,只看导航栏的话,其实要实现的东西比较简单,只需要在手指移动时获取对应的字母即可。页面主体内容列表的跳转应该交由另一个列表组件实现。
在程序代码中,组合导航栏和内容列表两个组件,导航栏索引字母更新时,内容列表跳转到对应的位置。


1楼2016-11-16 14:35回复
    第 5 步:完善索引导航组件
    其实基本功能已经实现,不过既然是想作为开源组件发布,还是再“包装”下,主要做了以下几方面的完善:
    支持根据屏幕高度调整导航栏的高度计算屏幕高度,和组件距离屏幕顶部和底部的距离,将索引字符平均分布。
    支持组件配置选项,并提供缺省选项由于不想依赖其他库,且考虑兼容性(不能使用 Object.assign),所以自己实现了:
    JavaScript
    123456789101112131415161718192021222324 var defaultOptions = { chars: '*ABCDEFGHIJKLMNOPQRSTUVWXYZ#', isAdjust: true, // 是否需要自动调整导航栏高度 offsetTop: 70, offsetBottom: 10, lineScale: 0.7, charOffsetX: 80, charOffsetY: 20} function IndexSidebar(options) { options = options || {} // 遍历缺省选项逐一处理 for (var k in defaultOptions) { if (defaultOptions.hasOwnProperty(k)) { // 未给出选项值时使用缺省选项值 options[k] = options[k] || defaultOptions[k] } } this.options = options this.initialize(options)}
    支持不同的方式引用组件这个和一般的模块差不多,不过额外支持了一下 SeaJS(define.cmd):
    JavaScript
    1234567891011121314 (function (factory) { if (typeof module === 'object' && module.export) { module.export = factory() } else if (typeof define === 'function' && (define.amd || define.cmd)) { define([], factory) } else if (typeof window !== 'undefined') { window.IndexSidebar = factory() } })(function () { // ... return IndexSidebar})
    总结
    从看到这个需求,到查文档、设计、实现,以及作为开源工具发布,用了大概不到 1 天的时间。希望可以有同学能够从我的这个过程中收获一些东西吧。
    想关注更多的同学可以点击链接加入群【前端资料交流】:https://jq.qq.com/?_wv=1027&k=41ZOvK4


    4楼2016-11-16 14:37
    回复