溢出式菜单

如果内容延伸到其父项之外,系统会提供多种处理方式选项。您可以滚动屏幕以添加更多空间、剪裁超出边缘的内容、使用省略号指明被截断的内容,等等。在针对手机应用和多种屏幕尺寸开发时,请务必考虑溢出问题。

CSS 中有两种不同的裁剪选项:text-overflow 有助于处理单行文本,而 overflow 属性则有助于控制框模型中的溢出。

单行溢出 text-overflow

对包含文本节点的任何元素(例如段落 <p>)使用 text-overflow 属性。它用于指定当文本不适合元素的可用空间时,文本的显示方式。网页上所有可见的 HTML 文本都位于文本节点中。如需使用 text-overflow,您需要使用一行未换行的文本,因此您还必须将 overflow 设置为 hidden,并使用可防止换行的 white-space 值。

p {
   
text-overflow: ellipsis;
   
overflow: hidden;
   
white-space: nowrap;
}

使用溢出属性

在元素上设置溢出属性,以控制当其子元素需要的空间超出其可用空间时会发生的情况。这可能是有意为之,例如在 Google 地图等互动式地图中,用户可以平移剪裁为特定大小的大型图片。还可能无意间出现,例如用户在聊天应用中输入的很长的消息无法在文本气泡中呈现。

您可以将溢出分为两部分。父元素具有牢固限制的空间,该空间不会改变。您可以把它想象成一个窗户。子元素是指需要在父元素之间留出更多空间的内容。您可以将其视为您透过窗户看到的内容。管理溢出有助于指导窗口如何构建此内容。

在纵轴和横轴上滚动

overflow-y 属性用于控制设备视口垂直轴的实际溢出,从而实现上下滚动。

overflow-x 属性用于控制设备视口的水平轴上的溢出,从而实现左右滚动。

滚动方向的逻辑属性

浏览器支持

  • Chrome:不支持。
  • Edge:不支持。
  • Firefox:69。
  • Safari:不受支持。

来源

overflow-inlineoverflow-block 属性会根据文档方向和写入模式设置溢出。

overflow 简写形式

overflow 简写形式可在一行中同时设置 overflow-xoverflow-y 样式:

overflow: hidden scroll;

如果指定了两个关键字,第一个关键字会应用于 overflow-x,第二个关键字会应用于 overflow-y。否则,overflow-xoverflow-y 使用相同的值。

我们来详细了解一下 overflow 媒体资源可用的值和关键字

overflow: visible(默认)
如果不设置此属性,overflow: visible 便是网站的默认值。这样可以确保内容不会无意中被隐藏,并遵循“绝不隐藏内容”或“精确布局的安全布局”等核心原则。
overflow: hidden
使用 overflow: hidden 时,系统会沿指定方向剪裁内容,并且不会提供滚动条来显示内容。
overflow: scroll
overflow: scroll 会启用滚动条,以便用户滚动浏览内容。即使内容目前没有溢出,滚动条也会显示。如果容器将来可能会根据(例如)大小调整而可滚动,这种方法非常适合减少未来的布局偏移,并在视觉上为用户准备好可滚动区域。
overflow: clip
overflow: hidden 一样,带有 overflow: clip 的内容会被裁剪到元素的内边距框中。cliphidden 之间的区别在于,clip 关键字还禁止所有滚动,包括程序化滚动。
overflow: auto
最后是最常用的值,即 overflow: auto。这尊重用户的偏好设置,并根据需要显示滚动条,但默认情况下会隐藏滚动条,并由用户和浏览器负责滚动。

滚动和溢出

其中许多 overflow 行为都会引入滚动条,但有一些特定的滚动行为和属性可以帮助您控制溢出容器上的滚动。

滚动和无障碍功能

请务必确保可滚动区域可以接受焦点,以便键盘用户可以按 Tab 键找到该框,然后使用箭头键滚动。

如需允许滚动框接受焦点,请添加 tabindex="0"、一个具有 aria-labelledby 属性的名称,以及相应的 role 属性。例如:

<div tabindex="0" role="region" aria-labelledby="id-of-descriptive-text">
    content
</div>

然后,可以使用 CSS 来指示该框具有焦点,并使用 outline 属性给出一个视觉线索,表明该框现在可滚动。

Using CSS to Enforce Accessibility 中,Adrian Roselli 演示了 CSS 如何帮助防止无障碍功能回归。例如,仅在使用了正确的属性时才开启滚动并添加焦点指示器。只有当框具有 tabindexaria-labelledbyrole 属性时,以下规则才会使其可滚动。

[role][aria-labelledby][tabindex] {
 
overflow: auto;
}

[role][aria-labelledby][tabindex]:focus {
 
outline: .1em solid blue;
}

框模型中的滚动条定位

滚动条会占用内边距框内的空间,如果为 inline(而非 overlaid),则可能会争夺空间。盒模型模块详细介绍了此可能导致布局偏移的原因。

根滚动条与隐式滚动条

您可能会注意到,有些滚动条具有下拉刷新行为和其他特殊行为,尤其是在针对移动应用和混合应用进行开发时。这种滚动行为发生在根滚动条上。一个网页上只能有一个根滚动条。默认情况下,documentElement 是页面的根滚动条,不过,通过更改哪个元素作为根滚动条,特殊行为可应用于 documentElement 以外的滚动条,我们将这种新的滚动条称为隐式根滚动条。

如需创建根滚动条,您可以使用所谓的滚动条提升功能,方法是将容器定位为固定,确保其覆盖整个视口,并且 z-index 位于滚动条之上。如需了解根滚动条与嵌套隐式滚动条的比较情况,请点击此处

该视频展示了具有弹跳行为和新样式设置的根滚动条
(与没有增强型滚动行为的隐式滚动条滚动相比)。

scroll-behavior

浏览器支持

  • Chrome:61.
  • Edge:79。
  • Firefox:36。
  • Safari:15.4。

来源

借助 scroll-behavior,您可以选择启用浏览器控制的元素滚动。这样,您就可以指定如何处理 .scrollTo() 或链接等页内导航。

当与 prefers-reduced-motion 结合使用时,这特别有用,可以基于用户偏好设置指定滚动行为。

@media (prefers-reduced-motion: no-preference) {
 
.scroll-view {
   
scroll-behavior: auto;
 
}
}

overscroll-behavior

浏览器支持

  • Chrome:63.
  • Edge:18。
  • Firefox:59.
  • Safari:16.

来源

如果您曾经到达模态叠加层的末尾,然后继续滚动,并使叠加层后面的页面移动,这就是滚动链接,或向上冒泡到父级滚动容器。借助 overscroll-behavior 属性,您可以防止溢出滚动泄漏到父级容器中(称为滚动链)。

检查您的理解情况

测试您对溢出相关知识的掌握情况

文字溢出和元素溢出是一样的吗?

false
true

overflow 属性接受 2 个关键字,第一个关键字是用于哪个轴?

类别
横向

滚动条在显示和内嵌时会占用盒模型中的哪些空间?

内容框
边距盒
内边距框
边框

如需捕获嵌套隐式滚动器中的滚动额外动量,您将使用哪个属性?

scroll-behavior
overscroll-effect
scroll-hint
scroll-padding
overscroll-behavior

资源

《Smashing 》杂志在 CSS 中的溢出和数据损失