Menu

CSS overflow 溢出:hidden、scroll、auto、clip 与省略号

overflow 决定放不进盒子的内容如何处理:照常显示、裁剪掉,还是加上滚动条。本文讲解 visible、hidden、scroll、auto 和 clip,overflow-x 与 overflow-y,文字省略号,以及 overflow 对布局的副作用。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

overflow 的作用

当内容比盒子大时(固定的高度、很长的单词、很宽的表格),就会溢出。overflow 属性决定多出来的部分如何处理:

值你看到的效果是否为滚动容器
visible(默认值)内容溢出盒子,盖住后面的元素否
hidden在内边距边缘裁剪,没有滚动条(脚本仍可滚动)是
clip裁剪,而且完全不能滚动,脚本也不行否
scroll总是显示滚动条,即使内容放得下是
auto只在内容放不下时显示滚动条是

在 macOS 和手机上,滚动条会叠加在内容上方并自动淡出,所以在你滚动之前,scroll 和 auto 看起来可能一模一样。

制作可滚动的盒子

只有当某个条件限制了盒子的尺寸时,它才会溢出。设置 height 或 max-height,再加上 overflow-y: auto,就能把一个很长的列表变成可滚动的面板:

这里用 max-height 比用 height 更好:短列表保持短小,只有长列表才会滚动。如果可滚动区域内没有可聚焦的内容,应该给它加上 tabindex="0",这样使用键盘的用户也能滚动它。

overflow-x 与 overflow-y

两个轴可以分别设置。常见的用法是让一个很宽的表格在容器内横向滚动,而不是把整个页面撑宽:

有一条规则要记住:如果一个轴是 hidden、scroll 或 auto,另一个轴上的 visible 值就会变成 auto。所以只写 overflow-x: hidden 可能会给你带来一个意料之外的垂直滚动条。overflow-x: clip 没有这个问题:

.a { overflow-x: hidden; }  /* overflow-y computes to auto */
.b { overflow-x: clip; }    /* overflow-y stays visible */

用省略号截断文字

text-overflow: ellipsis 会把一行文字被裁剪的末尾替换成“…”。它需要三个条件同时满足:宽度受限、文字不能换行、溢出被隐藏:

带 -webkit- 前缀的多行截断在 Chrome、Firefox 和 Safari 中都能使用。屏幕阅读器仍然会读出完整的文字,所以被裁掉的内容对他们来说并没有丢失。

overflow 的副作用

把 overflow 设为 visible 或 clip 以外的值,改变的不只是裁剪:

  • 它会包含浮动元素和子元素的外边距。 元素会形成一个新的块格式化上下文,因此会变大以包住浮动的子元素。display: flow-root 也能做到这一点,而且不会裁剪任何内容。
  • 它会让下面的 position: sticky 失效。 sticky 子元素会粘在最近的滚动容器上;如果这个容器并不滚动,就什么都粘不住。
  • 它会裁剪绝对定位的子元素(当溢出的元素同时也是它们的包含块时),包括下拉菜单和提示框,子元素的盒子阴影也会被裁剪。

隐藏滚动条

用 scrollbar-width: none 可以在保留滚动功能的同时隐藏滚动条。请谨慎使用:没有滚动条,很多读者意识不到还有更多内容。scrollbar-gutter: stable 的作用正好相反:它预留出滚动条的空间,这样滚动条出现时内容不会发生位移。

常见错误

  • 没有尺寸限制却期待溢出。 没有 height 或 max-height 的盒子会直接变大,而不是溢出。
  • 在 body 上设置 overflow: hidden 来“修复”横向滚动。 应该找出那个过宽的元素(通常是固定的 width、很长的 URL,或者在有滚动条时使用的 100vw)。
  • 使用省略号却没有 white-space: nowrap。 文字会换行,水平方向上没有任何溢出,也就不会出现省略号。
  • overflow-x: hidden 产生了垂直滚动条。 改用 clip。
  • 下拉菜单被所在的卡片截断。 是卡片的 overflow: hidden 裁剪了它;移走这条 overflow 规则,或者把下拉菜单渲染到卡片外面。

常见问题

overflow: hidden 有什么作用?

它会裁剪掉超出元素内边距盒的内容,并且不显示滚动条。被隐藏的部分仍然可以通过脚本滚动到,或者在聚焦其中的某个元素时被滚动出来。

overflow auto 和 scroll 有什么区别?

scroll 总是预留滚动条,即使内容放得下也一样。auto 只在内容大于盒子时才显示滚动条,这通常正是你想要的。

如何让 div 可以滚动?

限制它的尺寸并允许滚动:max-height: 300px; overflow-y: auto;。如果没有 height 或 max-height 的限制,div 会随内容一起变高,永远不会溢出。

为什么 overflow-x: hidden 还会多出一个垂直滚动条?

如果一个轴是 hidden、scroll 或 auto,另一个轴上的 visible 值会被计算为 auto。改用 overflow-x: clip,它不会创建滚动容器,另一个轴也保持可见。

如何给溢出的文字加上省略号(...)?

单行文字:在宽度受限的元素上写 white-space: nowrap; overflow: hidden; text-overflow: ellipsis;。多行文字:使用 display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden;。

Coddy 编程语言插图

和 Coddy 一起学编程

开始