iOS 上的 Safari 仅在滚动停止后显示固定元素

Posted

技术标签:

【中文标题】iOS 上的 Safari 仅在滚动停止后显示固定元素【英文标题】:Safari on iOS only showing fixed elements after scroll stopped 【发布时间】:2015-10-20 14:39:48 【问题描述】:

我正在编写一个“返回顶部”按钮,该按钮应仅在用户向下滚动我的网页时可见,并在用户向上滚动时隐藏。

规则是这样的:

如果页面 scrollTop > 100px 则显示按钮 如果页面 scrollTop 为

ios9 (iPad mini) 上使用 Safari 运行该页面时,该按钮在滚动动画结束时显示,但在向上滚动达到滚动限制时立即隐藏。

您可以在此处查看我的操作示例: http://jsfiddle.net/jkwqq59a/

html

<div class="container">
   <div class="box"></div>
</div>

CSS:

.container 

    position: relative;
    height: 3000px;
    background-color: blue;    

.box

    display: none;
    position: fixed;
    left: 50px;
    top: 50px;
    width: 50px;
    height: 50px;
    background-color: yellow;    

JS:

$(window).on('scroll', function()

     if ($(window).scrollTop() > 100 && !$('.box').is(':visible'))
         $('.box').show();
     else if ($(window).scrollTop() <= 100 && $('.box').is(':visible'))
         $('.box').hide();
);   

我的问题是:在 iPad 上,为什么按钮只在向下滚动完成后才显示,而它在向上滚动时立即隐藏?我怎样才能让它立即显示,就像在我的 Mac 上使用任何网络浏览器一样?

【问题讨论】:

我认为这是因为事件在滚动停止之前不会触发。请参阅“浏览器兼容性”部分 here:“在 iOS UIWebViews 中,滚动事件不会在滚动发生时触发;它们仅在滚动完成后触发。请参阅 Bootstrap 问题 #16202。Safari 和 WKWebViews 不受这个错误。” 滚动事件实际上在滚动过程中被触发了多次,我做了一些console.log,它在滚动过程中记录了一千次。此外,该按钮在向上滚动后也会隐藏,但是当 scrollTop 达到 100px 时它会立即隐藏,这意味着该事件被触发了很多次。 @Voxen 你用什么浏览器记录滚动事件? 我在 Mac 上使用 Safari,使用 iPad 的远程控制台 【参考方案1】:

我之前遇到过同样的问题,我的解决方法是没有将固定位置的容器放入固定位置的容器中。这意味着单独的固定元素可以正常工作,但不能嵌套。

【讨论】:

以上是关于iOS 上的 Safari 仅在滚动停止后显示固定元素的主要内容,如果未能解决你的问题,请参考以下文章

iOS 9 Safari:滚动时将元素更改为固定位置在滚动停止之前不会绘制

仅在滚动到底部时将页脚固定到底部

在 iOS Safari 中输入焦点后无法滚动的模式(固定元素)

iOS 10 Safari:防止在固定覆盖层后面滚动并保持滚动位置

jQuery 在第一次切换后仅在 Safari iOS5 中单击 3 次后触发

你能测试一下 Safari 和 Chrome (iOS) 上的滚动差异吗?