输入处理程序可能会发生抖动

避免长时间运行输入处理程序

1 .输入处理程序可能是应用出现性能问题的原因,因为他们可能阻止帧完成,并且可能导致额外的布局工作
2 .理想情况下,当用户在设备屏幕上触摸了页面的某个位置时,页面渲染层合并线程将接收到这个触摸事件并做出响应,比如移动页面元素。这个响应过程是不需要浏览器主线程参与的,也就是说不会导致js,布局,绘制过程的发生,不会导致卡顿
3 .但是如果对某个被触摸的元素绑定了输入事件处理函数,比如touchstart,touchmove,touchend,那么渲染层合并线程必须等待这些被绑定的处理函数执行完毕之后才能被执行。因为你可能在这些处理函数中调用了类似preventDefault的函数,这将会阻止输入事件touch.scroll等默认处理函数的运行。
4 .实际上,即使你没有在事件处理函数中调用preventDefault,渲染层合并线程也依然会等待,也就是用户的滚动页面操作被阻塞了,表现的行为就是滚动出现延迟或者卡顿
5 .基于这种机制,必须要保证对用户输入事件绑定的任何处理函数都能快速的执行,一定要节省出时间来渲染
6 .输入时间处理函数,比如scroll,touch事件的处理,都会在requestAnimationFrame之前调用执行。如果在上述输入事件的处理函数中做了修改样式属性的操作,那么这些操作都会被浏览器暂存起来,然后在调用requestAnimationFrame的时候操作,但是如果你在一开始做了读取样式的操作,那么将会立马触发浏览器的强制同步布局过程
7 .解决方法就是,对样式修改去抖动,控制其仅在下一次requestAnimationFrame中发生
8 .始终对除下一个requestAnimationFrame回调的视觉更改

function onScroll (evt) {

  // Store the scroll value for laterz.
  lastScrollY = window.scrollY;

  // Prevent multiple rAF callbacks.
  if (scheduledAnimationFrame)
    return;

  scheduledAnimationFrame = true;
  requestAnimationFrame(readAndUpdatePage);
}

window.addEventListener('scroll', onScroll);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,907评论 1 32
  • 1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi阅读 10,623评论 3 23
  • 介绍 应用正在改变世界,丰富人们的生活,使开发人员喜欢你前所未有的创新。其结果是,在应用程序商店已经发展成为数以百...
    弗利撒阅读 8,623评论 0 3
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 28,419评论 1 45
  • 阿黄是我曾经养过的一只狗,皮毛是黄色的,我就给它起名阿黄 阿黄是大姨送给我的,刚抱来时才一个月大,萌萌的...
    jy海阔天空阅读 4,160评论 16 21

友情链接更多精彩内容