之前做移动端页面的时候遇到一个需求:页面有很多表单,点下面提交按钮,如果有表单为空或者填写错误,网页就滚动到错误的表单处,让用户继续填写正确。也就是表单验证。
因为页面用了Zepto,自然想到用animate,设置300ms然后scrollTop为当前表单距离网页顶部高度即可。结果发现根本不生效。问同事后一起看源码,才发现Zepto里的animate只能改变CSS,而scrollTop属于js范围,恰巧jQuery又优化过这个,所以jQuery可以这样写,Zepto不行。
想到之前移动端里写返回顶部也是没办法做页面滚动效果,所以放弃滚动效果,直接改变scrollTop算了,简单粗暴。
上周末趁着有空,用了HTML5的requestAnimationFrame来做这个动画,顺便也研究下requestAnimationFrame的工作原理。
以前我们用setInterval或setTimeout,第二个参数都会写执行时间,例如setInterval(function(){},1000),这里的1000就是每1000ms执行一次方法。而到了requestAnimationFrame就变了,requestAnimationFrame 会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率,一般来说,这个频率为每秒60帧。
通俗的讲,使用requestAnimationFrame后,无法自己设置执行时间,浏览器默认(1/60)秒执行一次方法。
而我们已经习惯了写一个时间参数,就代表方法执行一次的时间,综合返回顶部也需要这个效果,所以就写了scrolling这样一个小插件。
示例:
最新版都会在GitHub上更新,欢迎Star。
使用起来也很简单,看下DEMO就明白了。不需要js库依赖,引用后可以直接使用,js源码只有不到2kb。
如果大家有什么疑问,可以在GitHub里提Issues,也可以在本文里提问,我看到都会第一时间回复的。
就是你博客用的这个?挺简洁大方的。