我正在使用 jQuery、greensock 和 scollorama 开发一个单页网站。
它并不完全需要支持移动浏览器,但如果它能在 iPad 上运行就更好了——考虑到这一点,我开始在各种手机和平板电脑上进行测试。
我遇到的问题是 scrollorama 依赖于相当频繁地触发滚动事件,因为这是动画所 Hook 的 - 但是,当使用触摸屏时,浏览器似乎只在您开始时触发滚动事件拖动和停止 - 这在 Opera Mini、Chrome、Safari、FF Mobile 中是一致的。
为了让我的页面至少部分工作,我需要想出一些能让我更频繁地触发滚动事件的东西 - 有人知道怎么做吗?
P.S 我试过按照 scrollorama 文档的建议使用 iScroll,但是那没有用,反而破坏了动画并使滚动变得不可能 - 我确信插件本身可以工作,但它似乎不能很好地与我已经得到了什么。我正在寻找比插件更少涉及的东西,只是理想地触发滚动事件的 fragment 。
长话短说
带有触摸屏的设备在拖动过程中似乎只会触发一次或两次 javascript 滚动事件。有没有我可以在 JS 或 jQuery 中做的简单补丁,它会更频繁地触发滚动事件?
更新:我试过 Hook 触摸事件并触发浏览器滚动,如下所示:
$(document).on('touchstart touchend touchmove', function(){
$(window).trigger('scroll');
});
这似乎让我在使用 Firefox 的 Android 上获得了更好的结果,尽管我认为它的触发频率不如我希望的那样总比没有好。
我会在其他浏览器中进行测试,看看是否有帮助。
更新 2:
上面的代码对 Android 上的 FF 有很大帮助,但对 iPhone 没有帮助。我尝试为 iPhone 触发的手势事件添加处理程序,但没有任何变化。
$(window).on('touchstart touchend touchmove mousewheel touchcancel gesturestart gestureend gesturechange orientationchange', function(){
//alert($(window).scrollTop());
$(window).trigger('scroll');
});
最佳答案
iOS 8 之前的版本:
这不是滚动事件被触发足够多的问题。相反,iOS 上的浏览器会在滚动手势中间停止刷新(即“重新绘制”)屏幕。
Safari WebKit 是根据 Apple 的政策在所有 iOS 浏览器中强制使用的 HTML 呈现组件,它会在滚动手势期间停止重新绘制以节省电池生命周期并减少热量。请注意,在滚动手势期间,JavaScript 确实会继续在后台正常运行,即使屏幕无法反射(reflect)在滚动手势期间对 DOM 所做的任何实时更改。一旦手势结束,就会立即触发一个绘画事件,并且屏幕会更新。但是,计时器循环(例如通过 setInterval
设置的那些)不会在滚动手势期间触发。
还值得注意的是,如果您在启动滚动时移动手指的速度非常慢,则滚动手势只有在您将手指从其起始位置移动大约 10 个像素后才会生效。在这 10 像素半径内移动时,屏幕会持续瞬间刷新。当 WebKit 确定您的手指移动得足够远以启动滚动时,屏幕刷新将被禁用,直到滚动手势结束。
这个问题不影响“某些”网页或 JavaScript 库的原因是它们有效地“卡住”了页面的滚动,而是通过拦截触摸事件然后调整 body.scrollTop来模拟滚动
相应的属性。它们通过将事件处理程序附加到 onscroll
事件来卡住页面的滚动,并从事件处理程序中发出 event.preventDefault()
命令。
iOS 8 及更高版本:
Apple 正在使 iOS 8 中的滚动事件更加流畅:
http://developer.telerik.com/featured/scroll-event-change-ios-8-big-deal/
关于javascript - 浏览器滚动事件在 iOS 和 Android 设备上触发不够频繁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21524839/