禁用下拉刷新:CSS的overscroll-behavior方法

禁用下拉刷新用overscroll-behavior实现。讲解contain与none的区别、body与滚动容器、滚动链、Safari支持和手机测试。

目录

禁用下拉刷新,需要在页面的滚动元素(通常是body或html)上设置overscroll-behavior-y: contain:

body {
  overscroll-behavior-y: contain;
}

这是Chrome关于该属性的文章中的单行示例。文章称,它可以禁用下拉刷新,同时保留过度滚动的光效(Chrome for Developers,2017年)。该属性控制滚动到达滚动容器边缘时的行为,MDN将去除浏览器的“下拉刷新”类行为列为其用途之一(MDN,2026年10月)。支持情况并不统一:MDN将overscroll-behavior标记为非Baseline功能,而且Safari的支持是部分的,因此请在你要支持的手机上测试。

overscroll-behavior的作用

overscroll-behavior决定滚动到达边界后,是否继续传递给父元素,以及浏览器是否显示自己的过度滚动效果。根据MDN,移动端浏览器默认在页面或滚动区域的顶部或底部会产生回弹效果,甚至刷新页面。该属性有四个关键字(MDN定义):

值 向父元素的滚动链 回弹效果
auto 允许(默认) 允许
contain 阻止 仍可能出现
none 阻止 阻止
chain 允许 阻止

滚动链是浏览器的默认行为:子元素到达边界时,把滚动传给父元素。Chrome的例子是应用抽屉滚动到底部后,它后面的页面开始滚动。overscroll-behavior是overscroll-behavior-x和overscroll-behavior-y的简写,两个关键字按x、y的顺序分别设置。

滚动链:overscroll-behavior 为 auto 时,面板滚动到底后背后的页面会开始滚动;设为 contain 时,背后的页面保持不动

下拉刷新用contain还是none

如果你想阻止刷新,但保留平台的过度滚动反馈,请用contain;如果还想去掉这种效果,请用none。Chrome的文章将contain描述为阻止滚动链,同时仍显示Android过度滚动光效等局部效果;none则是在此基础上去掉这些效果。要在页面本身阻止下拉刷新:

/* 阻止下拉刷新,保留光效 */
body { overscroll-behavior-y: contain; }

/* 同时去掉光效和橡皮筋效果 */
body { overscroll-behavior-y: none; }

Chrome的文章还指出,在html上设置contain可以阻止过度滚动导航;横向的none原本用于阻止左右滑动导航,但在该文章于2017年撰写时,Chrome尚未实现这一点。在依赖它来处理滑动手势之前,请先确认当前的行为。

禁用下拉刷新会去掉人们用来重新加载的手势。如果页面显示的是实时数据,请为用户提供刷新按钮或你自己的下拉手势,因为浏览器的手势将不复存在。

body还是滚动容器

该属性只对滚动容器生效,因此要设置在真正滚动的元素上。对于整个页面,就是决定视口的元素,即html或body。对于内部面板、抽屉或聊天列表,请设置在该面板上:

.chat-list {
  height: 12em;
  overflow: auto;
  overscroll-behavior: contain;
}

这样,当用户滚到列表末尾时,面板后面的页面就不会跟着滚动;MDN的示例对对话框也使用了同样的模式。MDN提到两个细节:

  • 没有可滚动溢出内容的滚动容器,例如设置了overflow: hidden的元素,总是处于其滚动边界,因此在它上面设置非默认的overscroll-behavior,会阻止向祖先元素的滚动链。MDN指出,这可以在对话框或覆盖层打开时阻止背景滚动。
  • <iframe>不是滚动容器,因此该属性对iframe元素本身没有效果。要在iframe内部控制滚动链,请同时在iframe文档的html和body上设置它。

2026年的浏览器支持

根据MDN browser-compat-data 8.1.7(2026年10月),关键字auto、contain和none分别自Chrome 63、Firefox 59和Safari 16(Safari iOS 16)起受支持。Safari的支持被标记为部分支持:该属性对没有可滚动溢出内容的滚动容器没有效果,Samsung Internet也有同样的部分支持说明。chain关键字较新:BCD将其列为自Chrome 150和Firefox 157起支持,而Safari不支持。BCD还为该属性设有单独的顶层条目,自Chrome 144和Firefox 150起。因此,web-features 3.44.0没有将overscroll-behavior列为Baseline,MDN也称其“非Baseline”,因为它在一些使用最广泛的浏览器中无法工作。

这对下拉刷新意味着什么:Chrome的文章使用的是带contain或none的长写形式overscroll-behavior-y,Safari 16加入了该属性(WebKit,2022年9月)。但WebKit的发行说明和MDN都没有说明,iPhone上的Safari是否会阻止页面级的刷新手势,因此请在iPhone上验证。

如何在手机上测试

下拉刷新是触摸手势,请在真机或模拟器上测试。

  1. 在手机上加载页面,滚动到最顶部,然后向下拖动。没有CSS时,浏览器可能会刷新或回弹。给body设置overscroll-behavior-y: contain后,任何内容都不应重新加载。
  2. 将嵌套面板滚动到末尾,并继续拖动。如果面板设置了contain,后面的页面应保持不动。
  3. 在你支持的每种浏览器中重复测试。Android上的Chrome、iPhone上的Safari和Samsung Internet各自的说明见上文。
  4. 如果你发布了已安装的Web应用,请在其中也重复测试;不同平台上的安装方式有何差异,见什么是渐进式网页应用。

如果要从桌面端测试Android,见从桌面端在Android上测试网站。如果没有手机,要测试iOS,见没有iPhone如何测试iPhone;移动端测试的其他部分,可参考移动网站测试清单。

Mobile View Extension会以手机的用户代理、屏幕尺寸和像素比重新加载标签页,因此它可以显示你的布局以及实际返回的页面,但它使用鼠标操作。它不会发送触摸事件,所以你无法在其中下拉刷新页面;而且它运行的是桌面版Chrome引擎,无法复现Safari的行为。可以用它检查自定义刷新按钮的布局,而手势测试请使用设备或模拟器。

常见问题

如何用CSS禁用下拉刷新?

在body或html上设置overscroll-behavior-y: contain。Chrome的文章把它称为一行代码,可以在保留过度滚动光效的同时禁用下拉刷新;如果也要去掉光效,请使用none。

overscroll-behavior的contain和none有什么区别?

contain阻止滚动链,但仍可能显示回弹效果;none同时阻止滚动链和回弹(MDN)。对于页面上的下拉刷新,根据Chrome的文章,两者在Chrome中都能阻止刷新。

overscroll-behavior在Safari中有效吗?

Safari 16及更高版本支持该属性,但实现是部分的:它对没有可滚动溢出内容的滚动容器没有效果(MDN browser-compat-data 8.1.7)。要看页面级手势会如何,请在iPhone上测试。

什么是滚动链?

滚动链是指子容器到达滚动边界后,浏览器把滚动传给父容器。例如,对话框滚动到末尾时,它后面的页面开始滚动。overscroll-behavior: contain可以阻止这种情况。

用手机视图查看你的下一个网站。

添加扩展,在你正在使用的标签页中直接打开设备预览。