Home  >  Q&A  >  body text

javascript - 前端: 移动端onscroll事件在部分浏览器内不能实时触发

开发情景如下:

出现问题:

希望懂的朋友能帮忙解决下,万分感谢!

ringa_leeringa_lee2749 days ago2023

reply all(5)I'll reply

  • 怪我咯

    怪我咯2017-04-10 17:10:31

    根据多方面的测试及咨询UC浏览器方的工程师,出现该问题的原因可以参考这个链接:http://andyshora.com/mobile-scroll-event-problems.html,个人不才,没有能找到好的兼容方案,下面是对自己这几天做的尝试的一个总结:

    原因分析:

    • ios的webview 内核 设定了其在进行momentum scrolling(弹性滚动)时,会停止所有的 事件响应DOM操作引起的页面渲染 (亲测),故 onscroll 不能实时响应

    曾做兼容方案:

    1. 使用 ontouchmove 去替代 nscroll ,虽然能更频繁的触发事件,但是这边的项目需求是实时响应滚动事件的同时,还要对页面元素进行重定位的DOM操作,由上述原因可知,在滚动过程中,页面会停止一切关于DOM方面的操作,所以若使用 ontouchmove 去实现的话,在按住屏幕进行滑动的时候,屏幕会出现元素抖动的情况(事件触发与DOM操作间具有几十毫秒的时间差),兼容失败

    2. 使用 iscroll 的probe版本,该版本能实时探查到滚动的距离,但该钩子函数是实时去关注 requestAnimationFrame 下的状态,所以对浏览器的版本性能消耗很大,加上 react 的 DOM 操作,安卓机根本动不了,兼容失败

    3. 使用 swiper 插件,在启动 freeMode 模式时模拟原生的弹性滚动( swiper 模拟原生滚动的方案能兼容较多的安卓机型不出现bug,推荐), 因为 swiper 没有实时监听滚动位置的功能,故我监听滚动开始及结束后的事件,通过 setInterval 及一些计算去实现滚动条的监听,但因为 react 元素的变化量比较大,导致 swiper 在移动端时对父容器的计算速率达到了一个瓶颈,依旧出现很卡顿的现象,兼容失败

    4. fallback方案,安卓端使用原生onscroll实现,ios直接加载全部子元素,毕竟ios的性能方面还是比较好的,有更好的方案后续再更.

    该回答如有错误,望请各位多多指正.

    reply
    0
  • 阿神

    阿神2017-04-10 17:10:31

    这个没有办法,移动端浏览器内核限制了onscroll事件的触发频率。需要用iScroll.js。本质其实就是自己实现滚动。

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 17:10:31

    手机京东的顶部 搜索条 就可以实时监听scroll 实现滚动变色

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 17:10:31

    监听body 的scroll 事件来代替window.onscroll。

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 17:10:31

    可能需要换方案了

    reply
    0
  • Cancelreply