CSS 播客 - 034:溢出
如果内容延伸到其父项之外,系统会提供多种处理方式选项。您可以滚动屏幕以添加更多空间、剪裁超出边缘的内容、使用省略号指明被截断的内容,等等。在针对手机应用和多种屏幕尺寸开发时,请务必考虑溢出问题。
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
属性用于控制设备视口的水平轴上的溢出,从而实现左右滚动。
滚动方向的逻辑属性
overflow-inline
和 overflow-block
属性会根据文档方向和写入模式设置溢出。
overflow
简写形式
overflow
简写形式可在一行中同时设置 overflow-x
和 overflow-y
样式:
overflow: hidden scroll;
如果指定了两个关键字,第一个关键字会应用于 overflow-x
,第二个关键字会应用于 overflow-y
。否则,overflow-x
和 overflow-y
使用相同的值。
值
我们来详细了解一下 overflow
媒体资源可用的值和关键字。
overflow: visible
(默认)- 如果不设置此属性,
overflow: visible
便是网站的默认值。这样可以确保内容不会无意中被隐藏,并遵循“绝不隐藏内容”或“精确布局的安全布局”等核心原则。 overflow: hidden
- 使用
overflow: hidden
时,系统会沿指定方向剪裁内容,并且不会提供滚动条来显示内容。 overflow: scroll
overflow: scroll
会启用滚动条,以便用户滚动浏览内容。即使内容目前没有溢出,滚动条也会显示。如果容器将来可能会根据(例如)大小调整而可滚动,这种方法非常适合减少未来的布局偏移,并在视觉上为用户准备好可滚动区域。overflow: clip
- 与
overflow: hidden
一样,带有overflow: clip
的内容会被裁剪到元素的内边距框中。clip
和hidden
之间的区别在于,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 如何帮助防止无障碍功能回归。例如,仅在使用了正确的属性时才开启滚动并添加焦点指示器。只有当框具有 tabindex
、aria-labelledby
和 role
属性时,以下规则才会使其可滚动。
[role][aria-labelledby][tabindex] {
overflow: auto;
}
[role][aria-labelledby][tabindex]:focus {
outline: .1em solid blue;
}
框模型中的滚动条定位
滚动条会占用内边距框内的空间,如果为 inline
(而非 overlaid
),则可能会争夺空间。盒模型模块详细介绍了此可能导致布局偏移的原因。
根滚动条与隐式滚动条
您可能会注意到,有些滚动条具有下拉刷新行为和其他特殊行为,尤其是在针对移动应用和混合应用进行开发时。这种滚动行为发生在根滚动条上。一个网页上只能有一个根滚动条。默认情况下,documentElement 是页面的根滚动条,不过,通过更改哪个元素作为根滚动条,特殊行为可应用于 documentElement 以外的滚动条,我们将这种新的滚动条称为隐式根滚动条。
如需创建根滚动条,您可以使用所谓的滚动条提升功能,方法是将容器定位为固定,确保其覆盖整个视口,并且 z-index 位于滚动条之上。如需了解根滚动条与嵌套隐式滚动条的比较情况,请点击此处。
scroll-behavior
借助 scroll-behavior
,您可以选择启用浏览器控制的元素滚动。这样,您就可以指定如何处理 .scrollTo()
或链接等页内导航。
当与 prefers-reduced-motion 结合使用时,这特别有用,可以基于用户偏好设置指定滚动行为。
@media (prefers-reduced-motion: no-preference) {
.scroll-view {
scroll-behavior: auto;
}
}
overscroll-behavior
如果您曾经到达模态叠加层的末尾,然后继续滚动,并使叠加层后面的页面移动,这就是滚动链接,或向上冒泡到父级滚动容器。借助 overscroll-behavior
属性,您可以防止溢出滚动泄漏到父级容器中(称为滚动链)。
检查您的理解情况
测试您对溢出相关知识的掌握情况
文字溢出和元素溢出是一样的吗?
overflow
属性接受 2 个关键字,第一个关键字是用于哪个轴?
滚动条在显示和内嵌时会占用盒模型中的哪些空间?
如需捕获嵌套隐式滚动器中的滚动额外动量,您将使用哪个属性?
scroll-behavior
overscroll-effect
scroll-hint
scroll-padding
overscroll-behavior