【发布时间】:2017-07-22 14:17:24
【问题描述】:
考虑以下场景:
你有 2 个可滚动的元素。
- 附加到 $(document).scroll() 的一长串项目
- 监听 $(".class").scroll() 的单独容器/覆盖层
具有以下 CSS 属性。
body {
overflow-y: scroll;
height: 100%;
}
.class {
height: 100%; /* 50% 20% 200px whatever you may */
position: fixed;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
换句话说,一个非常标准的设置,在 2017 年应该可以在任何设备上正常工作。错误。
以下是我多年来在使用这种简单设置时遇到的问题,从未找到一个好的、可靠的解决方案:
- 当滚动到覆盖层的 顶部 或 底部(高度为 100%)时,覆盖层开始从轻微到极端闪烁,无论所有 iDevice 的 HTML 复杂性如何。 (因为过度滚动的 z-index 问题,或者硬件加速问题,我不知道)。
- 在顶部或底部时,覆盖完全停止滚动,以等待 body-scroll 停止过度滚动。
当容器的滚动错误停止时(同时出现过度滚动),并且用户继续滚动,正文将改为滚动,导致用户体验非常不一致,因为用户现在最终会出现在某个地方正文滚动中的其他内容比打开叠加层之前的内容。为了等待过度滚动停止而不得不停止滚动也很烦人。
如果容器是 100% 高度,并且没有滚动 - 如果用户启动 滚动,正文将滚动并且滚动条将可见,但是 页面似乎没有滚动,导致用户不一致 经验。
我尝试过的一些解决方案没有成功。
- iScroll。 iScroll 通过阻止文档上的任何触摸事件来停止过度滚动问题。但是提供了不一致和糟糕的滚动体验恕我直言。此外,它甚至不再需要了。
- 所有其他可以想象的滚动插件。
- 事件委托 - 尝试仅为正在交互的元素启用滚动。在桌面上工作。不是移动 Safari。
- 可以想象到的每一个 jQuery 滚动辅助工具。轻微的成功,但非常不一致。
似乎过去提出的任何解决方案都以某种方式因“各种原因”而被贬值(听起来不是阴谋。)
几周前我读到,Apple 正在为 滚动 webkit 以使其在所有类型的 在 iPhone 上提供的内容类型。但在那之前,这种简单的设置在移动 Safari 上仍然存在很大问题。
我可能最终想出了一个解决方案。但我很想知道其他人在 2017 年是如何解决这个问题的……
2018 年 WebView 应用更新 虽然 Apple 并未努力解决此问题,但如果您正在构建 webview 应用程序,彻底消除任何问题的绝对最佳解决方案是直接在 Swift 中完全禁用浏览器滚动 (webview)。
当您的 WebView 已加载时,只需使用:
override func viewDidLoad() {
super.viewDidLoad()
wkWebView1.scrollView.isScrollEnabled = false
wkWebView1.scrollView.bounces = false
}
然后在你的 CSS 中为每个需要滚动的容器单独设置滚动。
请注意,此解决方案将完全禁用 $(document).scroll()。
我希望它对某人有所帮助。
【问题讨论】:
-
如果您添加了随附的 HTML,那将非常有用。考虑添加一个 sn-p。谢谢
-
你真的认为有必要吗?就我而言,这是一个广为人知的问题。让我知道你的想法。
-
是的,我认为。 (3 小时后,你还没有答案..)但我现在要出去了,所以我没用了.. 稍后!
-
你解决过这个问题吗?我也有同样的问题?
-
我最终输入了溢出:无;在弹出窗口打开时在 body 和 html 上,并在弹出窗口关闭时保存滚动顶部以将其动画到该滚动顶部。
标签: css swift webview webkit mobile-safari