【发布时间】:2023-03-17 08:27:01
【问题描述】:
关于 SO 上的溢出/橡皮筋滚动主题已经有多个问题,但是
- 它们都没有提供适用于 iOS 9.3.2 上所有情况的解决方案
- 它们都没有提供有关问题本身的广泛而完整的信息
这就是我创建这篇文章作为知识体系的原因。
问题:
在任何其他帖子中从未提到过的是,iOS 溢出滚动实际上是一个两部分的行为。
1。使用overflow: auto/scroll 溢出滚动内容
这是-webkit-overflow-scrolling: touch 元素的众所周知且最需要的行为,其中连续/动量滚动行为越过元素容器以平滑滚动内容。
当您以足够高的动量滚动元素的内容以使动量滚动超过滚动内容的长度时,就会发生这种情况。
通过这种行为,element.scrollTop 属性会根据元素滚动位置而变化,并且小于 0 或大于最大滚动 (element.scrollHeight - element.offsetHeight)。
2。 <body>的溢出滚动
如果您尝试滚动任何已经位于其最小/最大滚动位置的元素甚至比该位置更远(顶部向上的元素或底部向下的元素),则会发生此行为。然后滚动似乎“冒泡”到<body> 标签,整个视口都被滚动了。
与上面的相反,element.scrollTop 属性不会改变,但document.body.scrollTop 会改变。
焦点锁定和行为之间的切换(1.5s 延迟)
在这种情况下最烦人的是,上述两种类型之间的切换不会立即切换。
在您输入两者之一后,您无法将焦点切换到任何其他元素(可滚动元素、按钮、链接等),因此滚动行为也不会改变。
例如:如果您向上滚动一个元素已经在其顶部位置,您输入
overflow scrolling type 2,用户最自然的反应是然后尝试向下滚动。因为焦点锁定在正文滚动而不是转到overflow scrolling type 1,所以它停留在type 2,并且整个正文向下滚动。然后,典型用户开始随意开始频繁地上下滚动,而从未中断过type 2。
焦点的切换和滚动行为的改变只能在溢出动画完成并且元素静止(甚至比这长一点[大约0.5s])之后发生。
因此回到前面的示例,用户的正确反应是停止触摸屏幕大约 1 秒到 1.5 秒,然后再次尝试向下滚动。
【问题讨论】:
标签: html ios css scroll overflow