Skip to content

CSS 溢出(Overflow

CSS 中,溢出(Overflow) 指的是当元素的内容超出其容器(widthheight 限制)时,如何处理这些超出的内容。


1. overflow 的基本属性

语法

css
/* Keyword values */
overflow: visible;
overflow: hidden;
overflow: clip;
overflow: scroll;
overflow: auto;
overflow: hidden visible;

/* Global values */
overflow: inherit;
overflow: initial;
overflow: revert;
overflow: revert-layer;
overflow: unset;

该属性可以控制元素内容在 水平方向(x 轴)垂直方向(y 轴) 的溢出情况。


2. overflow 取值及效果

visible 内容不能被裁减并且可能渲染到边距盒(padding)的外部。

hidden 如果需要,内容将被裁减以适应边距(padding)盒。不提供滚动条,也不支持允许用户滚动(例如通过拖拽或者使用滚轮)。内容_可以_以编程的方式滚动(例如,通过设置 scrollLeft 等属性的值或 scrollTo() 方法), 因此该元素仍然是一个滚动的容器。

clip 类似于 hidden,内容将以元素的边距(padding)盒进行裁剪。clip 和 hidden 之间的区别是 clip 关键字禁止所有滚动,包括以编程方式的滚动。该盒子不是一个滚动的容器,并且不会启动新的格式化上下文。如果你希望开启一个新的格式化上下文,你可以使用 display: flow-root 来这样做。

scroll 如果需要,内容将被裁减以适应边距(padding)盒。无论是否实际裁剪了任何内容,浏览器总是显示滚动条,以防止滚动条在内容改变时出现或者消失。打印机可能会打印溢出的内容。

auto 取决于用户代理。如果内容适应边距(padding)盒,它看起来与 visible 相同,但是仍然建立了一个新的块级格式化上下文。如果内容溢出,则浏览器提供滚动条。

overlay 已弃用 行为与 auto 相同,但是滚动条绘制在内容之上,而不是占据空间。


3. 控制单独方向的溢出

除了 overflow 统一控制两个方向(水平 & 垂直),你也可以分别控制:

css
overflow-x: auto;  /* 只控制水平方向 */
overflow-y: hidden; /* 只控制垂直方向 */

实例

css
.box {
  width: 200px;
  height: 100px;
  border: 2px solid black;
  overflow-x: scroll;  /* 水平方向滚动 */
  overflow-y: hidden;  /* 垂直方向隐藏 */
}

效果

  • 水平方向 可滚动,垂直方向 超出部分隐藏。

4. text-overflow 处理文本溢出

如果是单行文本超出,可以用 text-overflow: ellipsis; 省略号显示:

css
.text-box {
  width: 150px;
  white-space: nowrap;  /* 强制文本不换行 */
  overflow: hidden;      /* 超出部分隐藏 */
  text-overflow: ellipsis; /* 超出部分显示省略号 */
}

效果

  • 超出的文本会变成 "...",防止溢出影响布局。

5. overflow: hidden + scroll 解决子元素溢出

有时,子元素可能超出父元素,你可以使用:

css
.container {
  width: 300px;
  height: 150px;
  overflow: hidden;
}

配合 position: absolute

如果子元素是 absolute 绝对定位overflow: hidden; 也能防止溢出:

css
.container {
  width: 300px;
  height: 200px;
  overflow: hidden;
  position: relative;
}

.child {
  position: absolute;
  top: 250px;
  left: 50px;
  width: 100px;
  height: 100px;
  background: red;
}

效果

  • overflow: hidden;.childcontainer 之外的部分被裁剪掉。

6. overflow: hidden + position: sticky 兼容问题

在某些情况下,如果 overflow: hidden; 作用于父容器,子元素的 position: sticky; 可能会失效:

css
.parent {
  width: 100%;
  height: 200px;
  overflow: hidden; /* 可能导致 sticky 失效 */
}

.child {
  position: sticky;
  top: 10px;
  background-color: yellow;
}

解决方案

  1. 去掉 overflow: hidden;
  2. 使用 clip-path 代替
css
.parent {
  clip-path: inset(0 0 0 0);
}

这样不会影响 sticky 但仍然隐藏溢出部分。


总结

属性作用
overflow: visible默认值,内容溢出仍可见
overflow: hidden溢出内容被裁剪
overflow: scroll始终 显示滚动条
overflow: auto仅在溢出时才显示滚动条
overflow-x / overflow-y控制水平方向或垂直方向
text-overflow: ellipsis省略文本溢出

评论区

欢迎留言、补充或勘误。

xiaoba.blog