默认情况下,iOS 上的网页具有“动量”滚动样式,其中手指轻弹会使网页滚动,并且会一直滚动,直到最终减速并停止,就像摩擦力正在减速一样。就像你把冰球推过冰面一样。你可能会认为任何具有滚动的元素都应该具有这种行为,但事实并非如此。你可以使用一个特殊的属性来添加它。
.module {
width: 300px;
height: 200px;
overflow-y: scroll; /* has to be scroll, not auto */
-webkit-overflow-scrolling: touch;
}
Check out this Pen!
嗨,Chris,
有没有办法在桌面(使用魔力鼠标或触控板)和 iOS 上都阻止动量滚动?我找了很久,但没有找到。
嗨,David,你可以实现一个滚动去抖器,它可以限制每几毫秒只运行一次滚动事件。问题是,它远非完美,在很多情况下会感觉很不自然。
也许我会为此写一个简单的教程。
为什么要这样做呢?那会是最烦人的事情。
你可以使用 Modernizr 或类似的东西检查触摸事件,然后只在某些情况下应用规则。
检查触摸事件不可靠。太多误报,即使在 Modernizr 也不建议这样做。
嘿,你可以尝试使用
@media
功能来查看屏幕的大小,如果它很小,那么代码有效,但如果它大于 x 值,那么它将无效,例如这只会应用于最大为 768px 的屏幕尺寸。这是最简单的方法,也是很多网站的做法。
如果我使用 -webkit-overflow-scrolling:touch,当页面滚动时,我点击一个按钮重置容器的 scrollTop = 0 ,在 iOS 或 Android 中,它可以停止滚动,但它无法到达容器顶部。
嗨,这似乎一直工作得很好,直到 2019 年 2 月 - 似乎出现了一些渲染问题 - 还有其他人遇到过这个问题吗?
Chris,动量滚动似乎在 iframe 内不起作用。我尝试了多种设置,也尝试在演示中嵌入 iframe,
http://playground.johanbrook.com/css/touchtest.html
但它 99% 的情况下都不会产生滚动条。正在寻找一个 hack。
Chandra,你找到解决 iframe 上触摸滚动的方案了吗?我因为同一个问题快要疯了……
是的,它在 iframe 上不起作用。如果你将 iframe 包裹在一个容器中,并在该容器上添加
-webkit-overflow-scrolling: touch
和overflow-y: scroll
,它应该可以工作。查看 这个 Codepen。Kristie,感谢你提供 Codepen 示例 - 它完全解决了我们的问题!
谢谢,这完美地工作了!
你有没有什么东西可以解决在触摸设备上点击链接时的毫秒级延迟?
我目前正在使用 webkit-touch-scrolling 来提高 iPad 和 iPhone 网页应用程序中滚动的性能。它显著提高了性能,但就像大多数使用带有图像的时间轴环境的应用程序一样,当加载了许多“图块”时,iPad 会耗尽内存。
有没有办法在动量滚动时跟踪滚动位置?就像“touchmove”和“scroll”事件一样?到目前为止,我看到很多“否”。
我目前的解决方案是在用户开始滚动时设置一个变量,并设置一个 setTimeout() 到 X 毫秒来“模拟”滚动函数。
这只是一个小的旁注,你之所以耗尽内存,是因为苹果只允许你在网页应用程序中使用 10 MB 的 RAM。他们为什么要让你在网络上创建类似本地的应用程序?如果可以的话,就没有理由为进入他们的应用商店付费。我们需要让他们承担责任。
遇到了和你一样的問題,iOS Safari 崩溃。我调试了这个问题超过一天,因为我确信内存崩溃是由于数百个 Angular hg-repeat 元素(空的元素,在滚动位置加载图像)造成的。
有趣的是,在 iOS 模拟器中调试时,它不会发生!另一个有趣的事实是,我从一个带有 position:fixed 的菜单开始,因为当输入字段被激活时菜单会弹出(在窗口调整大小时渲染会停止),但同时将输入字段更改为一个不弹出键盘的 select 字段。所以总而言之,我只是实现了一个根本不需要的 bug,哎!
对于可能搜索这个问题的其他人,我将包括浏览器在调用 $location.hash(id) 和 $anchoScroll() 时崩溃。
开心
我在 Windows Phone(IE10)上测试了你的演示,两个 div 都具有动量滚动。
这只是 iOS 的问题。Android 和 WP 都能正常工作,不需要使用荒谬的专有样式。
这正是我需要的,Chris!
而且我认为你可能来自未来,因为你似乎总是能预见我接下来需要什么。非常感谢,伙计!
太有帮助了。谢谢!
我一直想知道我是怎么不小心禁用了动量滚动的。
谢谢!真高兴 CSS 修复了这个问题!
每次我尝试这个样式时,我页面上的一些内容就会消失 - - 有其他人遇到过这个问题吗?消失的元素仍然占用空间(所以不像它们是
display:none;
)我在 Chrome 的检查器窗口中可以看到内容,黄色指示器指向我的内容应该在的位置,它基本上指向这些具有height:0px;
的不可见 div。毫无疑问,是这些“动量滚动”样式导致了这个问题。我尝试过只删除这些样式,我的内容就回来了,但当我再次添加它们时,内容又消失了。
因为我希望整个页面都有动量滚动,所以我这样编写了样式
有什么想法是我可能做错了吗?非常感谢你的任何想法。
哎呀 - 不用担心!尝试将样式添加到
html
而不是其他位置,它就像魅力一样工作。笨蛋是的,Annie 你说对了:谢谢!它就像魅力一样工作。:)
嘿!我在圣地亚哥的jQuery大会上坐在你旁边!哈哈
谢谢Annie!我已经解决了我的问题!在更改overflow为hidden之前,将-webkit-overflow-scrolling更改为none,这样我就可以防止消失 :)
谢谢,兄弟!
我注意到使用
overflow-y: auto;
(来自Chris的示例)也起作用。在三星平板电脑的原生浏览器和Chrome(Android 4.0.4)以及iPad的Safari和Chrome上进行了测试。overflow-y: auto; 对我来说在所有浏览器上都能正常工作,但在iPad上不行。我使用以下样式
.m-scrollable-filter {
overflow-x: hidden !important;
overflow-y: auto !important;
-webkit-overflow-scrolling: touch !important;
}
请给我任何回复。
谢谢
Chris在文章中说,
overflow-y
必须设置为scroll
才能使-webkit-overflow-scrolling: touch
工作。所以使用这段代码代替(不需要!important
)有没有人遇到过这个问题,并且知道如何防止它(或者我做错了什么)?...
我在一个包装 div 内有一个 div,它专门允许水平滚动,但阻止垂直滚动。一切都很正常,除了在 iPad 上,仍然可以垂直抬起整个 div,然后在释放时反弹回来。更令人恼火的是,这使得同一个 div 可以用对角线滑动进行对角线“拖动”。这是正在进行的页面...
http://raewilkinson.scratchthesky.com/
我用 JavaScript 修复了这个问题,它阻止了垂直轴上的默认滚动反弹行为。它可以工作,但不是理想的。我仍然不知道整个 div 如何能在各个方向上“拖动”。
我遇到了另一种情况,内容在垂直方向上可滚动。我应用了这种样式
即使没有水平滚动的需要,它也表现得好像你水平拖动它会使内容横向移动并反弹。我通过执行以下操作解决了这个问题
这会导致动量仅在 y 方向上使用,因为在将溢出设置为自动时,动量会被禁用。
您可以以另一种方式设置它:
overflow-y:auto
仅在 x 方向上使用动量。如果我添加这个
overflow-y: scroll; /* 必须是 scroll,而不是 auto */
到 html、body 或我网站上的任何主要块,我将不会获得任何滚动改进,也无法点击顶部栏滚动到顶部。你知道为什么吗?-webkit-overflow-scrolling: touch;
您不需要将其添加到网页上的
html
或body
上;Apple 会自动在所有页面上使用动量滚动。-webkit-overflow-scrolling: touch
只是为了在页面上滚动其他元素(例如,只能滚动p
)。此外,touch
滚动不会带来“滚动改进”——它只允许您弹动手指以快速浏览长内容。非常感谢,这正是我解决 iOS 上滚动问题所需要的。
嘿 - 我只是想花点时间说声谢谢 - 虽然这似乎是我应该已经知道的,但如果不是看到了它,我可能会走上一条黑暗的道路,试图实现 overflow-y 的 JavaScript 替代方案...真诚地感谢您
只是提醒一下那些发现这个很棒功能的人——如果你在也包含
overflow-x: hidden
的规则中使用它——小心。因为-webkit-overflow-scrolling: touch
属性将允许用户**垂直和水平**滚动,这可能会显示原本隐藏在左侧或右侧的隐藏 div。我遇到了完全相同的问题。当我向 html 和 body 标签添加
overflow-x: hidden
时,我失去了垂直动量滚动。添加-webkit-overflow-scrolling: touch
恢复了垂直动量滚动,但破坏了我的overflow-x: hidden
。有没有办法同时避免两者?我尝试将这两个样式放在不同的位置,仅在 html 标签中,仅在 body 标签中,在一个包装 div 中,但始终没有效果。我相信现在(2018 年 8 月)这不是问题。我有一个网站,它像一个全高应用程序一样工作,使用
position: fixed
来表示全高内容块,这些块相互过渡,其中一个在溢出时具有overflow-y: auto
。我添加了-webkit-overflow-scrolling: touch
属性以及overflow-x: hidden
到此块,并且它似乎很好。它绝对有助于我们解决在旧款 IOS 手机(iPhone 6)中遇到的滚动问题,而且我们没有注意到任何其他副作用(虽然我不确定我是否有任何溢出左右的内容)。我还想指出,即使使用overflow-y: auto
,这也能正常工作,尽管这篇文章中的代码示例提到它只在滚动时工作(也许现在是 2018 年,IOS 已经解决了这些问题)。有人知道如何为水平滚动条添加自动滚动功能吗?我有一些图像在表格行中,我想让该行水平自动滚动,但不能手动滚动..
请帮助我
我使用 CSS3 自定义了滚动,它在所有浏览器中都能正常工作,但在 iPhone 中无法看到 overflow-x。这是我所做的代码。http://codepen.io/anon/pen/aLwhq
在 iPad 上效果很好,感谢您的提示。
谢谢,这修复了我遇到的问题,现在 iPhone 页面看起来应该像它应该的那样!
好的,所以当我使用 overflow-y: scroll; 和 -webkit-overflow-scrolling: touch; 时,它在大多数情况下都能正常工作... 除了在我实际需要的 DIV 上。
这是一个固定的 DIV。当我在横向模式下加载页面,并且有足够的内容需要溢出时,它可以工作,但如果我随后将设备方向更改为纵向模式(此时内容不需要溢出),然后再更改回横向模式,DIV 就根本无法滚动!
请在上面评论的这条评论中回复,以便我收到通知:P(我希望这里有一种方法可以编辑此类偏好!)
嗨,Charles,
我也遇到了同样的问题,你有没有找到解决方案?
这是一个很棒的发现——按预期工作。唯一的副作用是,具有 position: fixed 的子元素现在会随着父元素的滚动而移动,直到动量停止,然后它们会弹回其固定位置。
你有没有找到解决方法?我在顶部定位的 position:fixed 导航标题 div 上遇到了同样的问题。
我遇到了类似的问题。容器内的固定子元素(具有“-webkit-overflow-scroll”)在滚动时会移动,此外,它被隐藏了(我认为后面这个问题与应用“-webkit-overflow-scroll”时 z-index 被更改有关)。
我可以确认
overflow: auto;
-webkit-overflow-scrolling: touch;
如果您不想始终显示滚动条,则有效。感谢您的提示,Chris!
感谢您的提示,Chris;
overflow: auto;
-webkit-overflow-scrolling: touch;
适用于 iPhone 媒体查询;
但我将它用于 iPad(1,2)的媒体查询时,它会导致通过 iframe 加载页面的 iOS 应用程序崩溃。
大家好,
对我来说效果很好。但我还有另一个问题。
在创建自定义滚动时,我无法获得平滑滚动。
我是不是错过了什么?
救了我!不过为什么我需要在第一位添加这个,我完全搞不懂。
救了我一星期!!!
谢谢Chris,也让我的一天变得美妙!
万分感谢!
亲爱的,你的技巧对我有用。我在触屏设备上滚动时遇到了问题,然后我把你的代码加到了“`
“`
现在我的网站滚动很流畅了。
哇,真是救命稻草。
为什么默认情况下要禁用惯性滚动?谁会想到“这个开发者显然想让这个东西可以滚动,但他可能想要它很卡顿,所以让我们把它设为默认值”?
为什么过度滚动会滚动?
感谢这个,省了我几个小时。也要感谢那些让我找到这里的关键词。
某些控件的具体性真让人发狂。
喜欢它!有效了,谢谢!:D
我爱你
你又一次省了我几个小时的瞎折腾。谢谢!
非常感谢!
继续努力,好文章!
言语无法表达我对你的感激之情。谢谢!
我遇到了一个奇怪的问题。我尝试过到处查找答案,但我找不到。
我在一个加载到网页视图中的 iOS 应用中使用了这个 CSS 属性 (
-webkit-overflow-scrolling
)。当我打开应用时,它会崩溃并关闭。崩溃报告将我带到这个页面:http://bit.ly/1GobVK2 ,它表明这是由这个 CSS 属性引起的。这是真的吗?我应该继续尝试根据这个理论来解决这个问题吗?
还有其他人遇到过与这个 CSS 属性类似的问题吗?
嗨,Chris,
只想说,它确实适用于
overflow: auto;
,我已经在几个网站上设置并使用了它。感谢这个代码片段 - 不知道为什么,但我总是忘记这个声明,每次需要它时都要回来查看。;)
嗨,Chris,
这真的很有用。我一直为这个问题苦恼,应用了 -webkit-overflow-scrolling: touch; 之后,所有东西都开始流畅移动了。感谢你分享这个代码!:)
嗨,我是一个真正的技术白痴,所以请帮我一下,用非常简单的方式解释,比如进入设置,进入x,然后x,等等。我的 iPhone 5s 屏幕一直在滚动,这让我很烦!屏幕很干净,只有一年了。我尝试过关机重启,但没有用。我该如何解决?如果这是内存问题,我应该删除一些应用吗?谢谢!:-)
是的,我没看到它在“auto”上不起作用,就尝试了...在使用 Cordova 在 iOS 上运行时,它在 auto 上对我有效,所以它可能已经改变了,提醒一下。
https://mdn.org.cn/en-US/docs/Web/CSS/-webkit-overflow-scrolling
页面上似乎有一个警告,建议不要在面向生产的网站上使用 ‘-webkit-overflow-scrolling’。
谢谢!这完美地解决了问题!
真是一个不错的解决方案,完美地解决了问题!谢谢!
嗨 - 当我在 iOS 9+ 上的 div 上使用 -webkit-overflow-scrolling 时,它只在 Cordova 应用中用两根手指拖动时才会激活滚动。有什么解决方法吗?
我知道这篇文章比较旧了,但是…
“iOS 上的网页默认情况下具有“动量”滚动样式,你轻弹一下手指就会发送网页滚动,它会一直滚动下去,直到最终减速并停止,就像摩擦力在减速一样。就像你把一个冰球推过冰面一样。”
…我认为这句话实际上是错误的。打开任何网页,包括这个网站,在移动版 Safari 上滚动它。它不会有惯性滚动。当你抬起手指时,滚动几乎立即停止。页面级的惯性滚动根本不是默认的。
除非我疯了,是我一个人得到这样的结果。我在 iOS 7、8 和 9 上的 3 台设备上进行了测试。
我发现你实际上必须在文档级别使用 webkit-overflow。因为大多数网站都没有使用它,所以它们错过了很多东西。
帮助我很多。我从滚动 div 变成了滚动页面,所以现在它在 iOS 上可以正常工作了。从一开始在 Android 上就运行得很好。
我爱你!这正是我需要的。你救了我的应用。
启用它真的会产生巨大的区别,因为它真的不是默认的。这里有更多信息
https://ferdychristant.com/the-world-s-most-overlooked-web-optimization-for-ios-d88c7517d520#.r6pijsei7
这个修复似乎不再起作用了。
– 有人遇到过同样的问题吗?
– 有人知道现在如何修复吗?
在我 iPhone SE 上似乎可以正常工作,只是在我台式机 Mac 上不行。
有没有办法让动量滚动生效,并永久隐藏滚动条?
我尝试使用 ::-webkit-scrollbar 等等 - 它们似乎与
-webkit-overflow-scrolling: touch;
有人知道如何隐藏 iPhone 的顶部和底部栏吗?在 iOS 9 中这是标准做法,但使用这种滚动,这个标准就消失了。
你又一次救了我。谢谢!
试试这个,对我来说有效
if (window.location == window.parent.location && navigator.userAgent.match(/(iPod|iPhone|iPad)/)) {
$(‘#orderpop’).attr(‘style’, ‘-webkit-overflow-scrolling: touch !important; overflow-y: scroll !important;’);
}
});
其他前缀呢,-moz-、-khtml-、-o-、-ie-,还是只针对 Safari?这需要在 Android 上也这样做吗?那些需要什么其他前缀?
这个演示和我的项目在带有 7.0.4(11B554a) 的 iPad(MD329LL/a) 上不起作用。
感谢你分享这个。我甚至很难找到正确的内容来称呼它,我差点放弃了。真让人难以置信,它在响应式菜单中几乎没有被使用。我甚至发现付费插件等等都没有使用它。
滚动起来很好,但延迟加载停止工作了。在 touchmove 事件之后,它还在滚动,无法加载图片。如何解决这个问题?
这不再*需要*
overflow-y
设置为scroll
- 它可以设置为auto,并且只有当内容超过元素边界导致出现滚动条时才会产生预期效果。overflow-y: scroll; /* 必须是 scroll,而不是 auto */
我可能错了,但我认为这并不正确?我设置了
overflow-y: auto
,并且惯性滚动似乎在 iOS 上正常工作。有些事情就是这么简单。在调试和搜索几个小时后,我找到了这个简单的解决方案……它甚至在 cordova/phonegap 中也能正常工作。下次我会先访问这个网站。谢谢。
CSS-Tricks 4TW!
完美运行,非常感谢!
这确实有效,而且更令人愉悦,但正在水平滚动的容器包含带有悬停状态的元素,这些元素在 iOS 上被触摸时会激活,现在它们不再响应触摸,所以我可能必须放弃惯性滚动,因为悬停显示的信息更重要: (
我想在 Android 设备上实现相同的滚动功能。
这里有一个 postcss 插件 https://npmjs.net.cn/package/postcss-momentum-scrolling
只是为了重申这里零星的评论
这会破坏滚动通知
我感谢这篇文章,因为它确实让惯性滚动回来了,但这里的一些开发者(Jessie、Nishant、Charles)注意到,当它被打开时,他们不再收到滚动事件。这对我们的应用程序很重要。当惯性滚动最终停止到正好为 0 时,我们会收到一个事件,但这对我们的用例没有帮助。我们需要在滚动发生时获得事件,就像当它没有启用时,或者就像我们在其他具有惯性滚动的产品上获得事件一样。Jessie,感谢 setTimeout 和 track 解决方案。我可能会用这种方式模拟它,直到我们找到另一个答案。
这个修复似乎不再起作用了。
– 有人遇到过同样的问题吗?
– 有人知道现在如何修复吗?
根据这篇文章,它不再需要:https://ferdychristant.com/why-ios-11-is-great-news-for-the-web-345c43cc55db
嗨,
感谢您的提示,它非常有效!但是我遇到了一个问题,滚动条出现了,而我设置了`::-webkit-scrollbar { display: none; }`。
您能帮我把它设置为透明,或自定义它吗?
谢谢
嗨!不错的帖子,谢谢!
在页面上使用动画时,出现了一个问题。内容在滚动开始时会“跳动”。有人遇到过吗?尝试过解决吗?
很棒。这很有用。我们在游戏中的字幕中使用它。
webkit-overflow-scrolling: auto 在我的 iPad 上现在不起作用。
“webkit-overflow-scrolling” 在 iOS 13 中不再起作用,因为 iOS 13 默认情况下在任何可滚动容器中启用了惯性滚动,但我不想那样。有人知道如何在我的网页上禁用惯性滚动吗?