javascript - iOS Safari 过度滚动 : Pulling down vs. 弹跳

标签 javascript jquery html ios mobile-safari

我和我的团队正在开发一个带有固定 header 的网络应用程序,该 header 不会滚动。

为了处理 iOS 上的过度滚动,我们需要检测负向滚动,并将固定标题再次重新定位为静态,使其与页面的其余部分一起滚动。
我们通过绑定(bind) jQuery 来实现这一点将处理程序滚动到窗口:

$(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);

关于javascript - iOS Safari 过度滚动 : Pulling down vs. 弹跳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36179721/

相关文章:

javascript - 当 alpha 小于 1 时,HTML Canvas 不准确地设置像素颜色

html - 导航未与父 Div 垂直对齐

javascript - 缩放jqplot后获取 Canvas 中的数据点列表

javascript - Uncaught ReferenceError : body is not defined

javascript - vue-tables-2 中未考虑自定义模板

javascript - 删除 javascript 函数覆盖

javascript - 我无法让 Slickgrid 显示 mySql 数据

html - 页面顶部的透明背景图像

javascript - jQuery 选项卡标题

javascript - 如何给已有的js代码添加淡入淡出效果