iScroll 学习小结
In 未分类 on 2015年03月29日 by view: 1,406
1

前言

最近项目需要实现一个 fixed 标题栏的功能,很普通的功能,实现核心也是在 sroll 事件中切换到 fixed 状态即可,但是在某些版本 ios 的某些内核中,在惯性滚动过程中不执行任何 js 代码,亦即不会触发 scroll 事件,基本任何事情都做不了,为了解决这个问题不得不使用 div 内滚动,然后使用 iscroll 库实现滚动逻辑。

基于使用过程中的一些问题,抱着学习的态度,稍微看了一下源代码,现把学习所得记录如下。

源代码学习

核心实现

滑动相关组件(如 swipe 库)的实现基本都是类似的,就是通过 3 个核心事件:touchstart,touchmove,touchend 完成操作。

注:下面的源码只罗列核心部分,而且只展示 y 轴方向

touchstart 需要做的事情有:

touchmove 需要做的事情有:

touchend 需要做的事情有:

基本所有滑动相关的组件所做的事情都是这些,都可以借鉴一二的。

特殊 css prefix 缓存

用 js 处理特殊 css 的时候,可以先缓存 prefix,这样就不用每次都操作所有的内置属性

事件绑定

addEventListener 绑定事件可以传入一个对象而不是一个 cb 函数,事件触发的时候,就会调用该对象的 handleEvent 方法来处理事件。例如:

这种绑定方式的优点有:

  1. 删除事件方便
  2. 事件集中处理
  3. 程序结构清晰

还记得那种绑定事件时 bind(this) 的日子吗。。。
这种方式也方便了实现事件代理

事件触发频率调整

对于一些触发频率较高的事件,我们通常会控制一下事件处理的频率,例如 scroll,resize 事件。
另一方面,在实现一个公共组件的时候可以考虑从组件本身来解决这个问题,iScroll 通过配置来设置 scroll 事件的触发频率

缺点与使用问题

下面是针对版本 5.1.3 的 iscroll 使用过程中的一些问题

1. 没有插件版

iScroll 没有 zepto/jquery 插件版本,一些基础方法都需要自己实现,导致了库的体积偏大。

2. 没有暴露停止滑动(惯性滑动)的接口

通过查看源代码找到了停止滑动的方法,如下:

3. 调用 scrollTo 方法不会触发 scroll 事件

可以通过 scrollTo 方法来手动滑动,但是这样的滑动过程是不会触发 scroll 事件的。

总结

在使用 iScroll 的过程中遇到不少坑,但使用起来还是比较容易的,文档也比较齐全。
iScroll 在实现上也非常成熟,里面许多实现细节都是值得学习的

原创文章转载请注明:

转载自AlloyTeam:http://www.alloyteam.com/2015/03/iscroll%e5%ad%a6%e4%b9%a0%e5%b0%8f%e7%bb%93/

  1. rookiebob 2016 年 8 月 3 日

    楼主,这篇文章贴的代码变成乱码了。最近你们这边很多文章的代码都有着问题,麻烦看下哈

发表评论