iOS Safari过度滚动:下拉与弹跳
iOS Safari Overscrolling: Pulling down vs. bouncing
我和我的团队正在开发一个web应用程序,该应用程序带有固定的头,不会滚动。
为了在iOS上处理过度滚动,我们需要检测负方向的滚动,并将固定标题重新定位为静态,使其与页面的其余部分一起滚动
我们通过将jQuery滚动处理程序绑定到window
:来实现这一点
$(window).scroll(function() {
if ($(window).scrollTop() < 0) {
// position static header postioning in order
// let the header behave correctly when overscrolling
}
});
当手动向下拉(拖动)页面时,此操作效果良好。但正如每个iOS用户都知道的那样,当页面从向下的位置再次加速滚动时,一旦到达顶部,它就会反弹(过度滚动)
在这种情况下,我们的滚动处理不起作用。
目前,我可以想象出现这种不同行为的两个原因:
- 快速向上滚动和页面反弹对于Safari的JS引擎来说太快了,无法确保流畅的处理
- 从技术上讲,向上滚动时的弹跳与手动下拉网页相同吗?关于
$(window).scrollTop()
有人告诉我如何在这两种情况下都能进行滚动处理吗?
如果CSS中的position:fixed
不适合您,那么您应该尝试制作一个绘制循环,每次循环运行时,您都会放置一个水平偏移量,该偏移量等于用户滚动的距离。
基本上,如果CSS不起作用,你的JS应该是这样的:
var head = document.getElementById("header");
//head now has our header
head.style.position = "relative";
//and now, we can manipulate it's position
function draw(){
head.style.top = window.pageYOffset;
//all that's left to do is do this each and every frame.
}
如果你不知道如何进行绘制循环,下面是代码:
var frameRate = 60;
var frameCounter = (function(){
var counter = 0;
return function(){
counter ++;
if(counter > frameRate/1000){
counter -= frameRate/1000;
draw();
}
}
})();
setInterval(frameCounter, 1);
此问题已在iOS 9.3中解决新的元标记选项
<meta name="viewport"content="width=device-width,shrink-to-fit=no">
相关文章:
- Safari(Mac OS)上的jQuery平滑滚动问题
- 向下滚动时隐藏菜单,向上滚动时显示,适用于Chrome,不适用于Safari(手机)
- 滚动到顶部按钮在 chrome 或 safari 中不起作用
- 移动Chrome和Safari之间的页面滚动不一致
- 移动safari浏览器的滚动问题
- 使用D3.js生成的SVG图形在Safari中滚动时消失
- iOS Safari过度滚动:下拉与弹跳
- 滚动停止视差效果在 Safari 中不起作用
- 移动 Safari 垂直滚动 - 如何在 Javascript 中检测窗口何时停止移动
- JavaScript DOM 在 touchmove 中的更改延迟到移动 Safari 上的滚动结束
- 滚动到顶部按钮,jQuery在Safari v.7.0.5中不起作用
- Safari 中的侧边栏滚动粘性问题
- 为什么在用户滚动后,设置超时不会在触摸端处理程序中触发(iOS Safari)
- 滚动时隐藏移动Safari中的地址栏(touchOverflow)
- 在iPhone上的Safari中滚动到特定位置
- Safari滚动故障
- jQuery.remove()的Safari滚动问题
- 在javascript中实现固定位置会导致Safari滚动时抖动
- 如何检测iOS7 Safari滚动时的高度变化- JavaScript
- 移动Safari滚动到底部加载更多的内容,如Facebook