页面上的每个元素都是一个矩形框。这些框的大小、位置和行为都可以通过 CSS 控制。行为指的是当框内和框周围的内容发生变化时,框如何处理。例如,如果您不设置框的高度,则该框的高度将根据需要增长以容纳内容。但是,当您对框设置特定高度或宽度,而内部内容无法容纳时会发生什么?这就是 CSS overflow 属性发挥作用的地方,它允许您指定希望如何处理这种情况。
overflow 属性有四个值:**visible**(默认)、**hidden**、**scroll** 和 **auto**。还有 overflow-y 和 overflow-x 这两个姊妹属性,它们的应用范围较窄。
让我们分别看看它们,然后讨论一些常见用法和特性。
可见 (Visible)
如果您根本没有设置 overflow 属性,则默认为 visible。因此,通常情况下,没有必要显式地将此属性设置为 visible,除非您要覆盖从其他地方设置的值。
这里要记住的重要一点是,即使内容在框外可见,该内容也不会影响页面的布局流。例如
通常,您不应该对包含网页文本的框设置静态高度,因此这种情况不应该出现。
隐藏 (Hidden)
默认 visible 的反面是 **hidden**。这会隐藏超出框的任何内容。
这在处理动态内容以及溢出可能导致严重布局问题的情况下特别有用。但是,请记住,以这种方式隐藏的内容是完全无法访问的(除非查看源代码)。因此,例如,如果用户将其默认字体大小设置为大于您预期的值,您可能会将文本推到框外并将其完全隐藏在其视图之外。
滚动 (Scroll)
将框的 overflow 值设置为 scroll 将隐藏框外部的内容渲染,但会提供滚动条来滚动框内部以查看内容。
需要注意的是,无论如何,您都会获得水平和垂直两个滚动条,即使内容只需要其中一个。
自动 (Auto)
自动溢出 (Auto overflow) 与 scroll 值非常相似,只是它解决了在不需要时出现滚动条的问题。
浮动清除 (Float Clearing)
奇怪的是,设置 overflow 的另一种流行用法是浮动清除。设置 overflow 不会在元素处清除浮动,而是自身清除。这意味着应用了 overflow(**auto** 或 **hidden**)的元素将根据需要扩展以包含内部浮动的子元素(而不是折叠),假设没有声明高度。就像这样
有关此内容以及浮动的更多详细信息,请参阅文章 关于浮动的一切。
跨浏览器问题 (Cross Browser Concerns)
与 CSS 中的大多数内容一样,overflow 也有很多跨浏览器特性。它们如下所示
滚动条在框内还是框外?
Firefox 将它们放在外部,IE 将它们放在内部。我认为只有 IE 实际上正确地做到了这一点(它应该在内部)。
确保考虑这种重大差异。
IE 8 扩展框错误
IE 有很多有趣的新错误,包括一些非常严重的错误,会隐藏整个网页。 更多详细信息请参见此处。
破坏浮动布局 (Breaking floated layouts)
IE 6、7 和 8 都会破坏默认的 overflow visible,并会水平扩展框以适应内容(可能是图像)。这对于基于浮动列构建的布局尤其痛苦,单个扩展列可能会将其他列向下推并导致一些非常严重的布局损坏。
可以使用 CSS 样式化滚动条吗?
IE 曾经允许在旧版本的 IE 中使用此功能,但后来已停止。WebKit/Blink 浏览器允许使用它,这里有一些相关信息。但这并非标准,目前尚不清楚标准机构是否对标准化它感兴趣。如果您绝对需要自定义的跨浏览器滚动条,则需要使用 JavaScript 自定义处理。这里有一个 简单的开始,这里还有一个 StackOverflow 线程,其中包含一些建议。
IE 技巧
IE 始终显示垂直滚动条,无论是否需要。这对于 防止水平跳跃 很有用,但并不总是理想的。要在 IE 中删除它,您可以在 body 元素上将 overflow 设置为 auto。
演示 (Demo)
本文的演示来自 此示例页面。
不错,伙计,一直很感谢!
我希望有一天我们可以有关于样式切换器(它们切换 CSS 文件)的教程。
Chris的文章很棒,谢谢!祝你假期愉快!
Chris,文章读起来很不错,真的,非常感谢。你能多写一些关于jQuery的内容吗?现在这方面有点“落后”了 :)
Chris,再次感谢你写了这么棒的文章!
没想到是这样!
我只是想提一下——Firefox、IE和Chrome在我这里看起来表现都一样……
IE 8 – 8.0.6001.18702
FF 3.0.9 – rv1.9.0.9
Chrome 2.0.181.1
不错。
你可以通过使用“overflow-y:scroll;” “overflow-x:scroll;”来强制开启垂直或水平滚动。
滚动条可以用CSS样式化吗?
使用CSS是不可能的,但是你可以使用js来实现。
http://www.kelvinluck.com/assets/jquery/jScrollPane/jScrollPane.html
jquery
谢谢Chris,好文章。我特别喜欢“自动清除”的部分!
这太棒了,感谢你澄清了这一点!
不错的文章,谢谢……
我每天的第一站……
使用jQuery来设置滚动条样式 http://www.kelvinluck.com/assets/jquery/jScrollPane/jScrollPane.html
最新的WebKit nightly版本也支持自定义滚动条样式。
http://webkit.org/blog/363/styling-scrollbars/
Safari 4 Beta也支持滚动条样式……
我以前不知道这个,很有趣……我有点惊讶。对于苹果来说,允许修改界面元素(这些元素从一致性中获益良多)似乎很不寻常。尽管我知道WebKit≠Apple。
你说Firefox将滚动条放在盒子外面,而IE将它们放在里面。
当你访问文章中IE 8扩展盒子bug链接时,你会发现情况正好相反:IE 8将滚动条放在盒子外面(使盒子变高),而其他所有浏览器则不会。
我昨天碰巧正在构建一个网站,overflow:hidden在IE中不起作用。我该如何解决?
我认为滚动条在盒子内/外取决于你的盒子模型——border-box或padding-box。
IE的默认值是border-box(盒子位于其边框之间),FX和其他大多数浏览器的默认值是padding-box(盒子位于文本可以到达的地方,即边框减去填充等)。这可以更改和统一。
附注:bug报告:回复预览不显示换行符,但实际回复显示。
哥们,你真是个好老师!非常感谢
Chris,
干得好,请继续努力。我非常感谢你花时间和精力阐述了“那些”CSS属性之一,这些属性可能会给网页设计师带来很多麻烦——特别是如果网页布局需要跨浏览器兼容。
也许你已经在其他地方介绍过这个了,但我最近不得不解决一些由DOCTYPE声明引起的CSS错误(主要是IE6相关问题)。(顺便说一句,我甚至有一些因为UTF-8 Content-Type而停止工作的JavaScript)。
我只想说,有时一些小事情会妨碍我们。根据读者的一些评论,即使是一些看起来像OVERFLOW一样良性的CSS属性,也经常会出现怪癖。
再次感谢你的辛勤工作!
我也使用垂直滚动和水平滚动。只需设置“overflow-y:scroll;” “overflow-x:scroll;”。有时内容必须为95%才能解决IE问题。但它确实有效。只需为IE设置属性(例如:*width:95%用于IE7或*width:95%用于IE6)
此页面在IE 8中存在错误
我从未注意到IE和FF在overflow属性方面的这些差异……除了IE在overflow:visible;下会拉伸盒子,这让我头疼不已。
关于使用overflow清除浮动的信息很好。我一定会用到它。
是的,这个网站在IE 8中崩溃了。我根据你提供的那个很棒的链接了解了IE 8中的错误。但我想看看在
Firefox、Opera、Chrome、Safari
中,浮动和清除方面存在哪些错误。
这是我读过的关于“overflow”最好的解释,感谢你如此详细地解释。
只是好奇,截图中使用的红色字体是什么名称?
Chris,这篇评论不错。几点说明
首先,IE7允许更改滚动条的颜色。我最近做过。不过我不确定IE8是否可以。
此外,我发现非常令人恼火的是,几乎没有办法让块级元素自然扩展并包含浮动对象——除非浮动容器或添加“overflow: hidden”。
CSS中应该有一个名为“contain: all”或类似的属性。“overflow: hidden”在大多数情况下都能正常工作,所以这很好。但有时你希望容器内的内容从边缘伸出来,也许使用负边距或绝对定位。但很自然地,这会被“hidden”值搞乱。
试试这个,Louis
/* IE6/7 */
div.container {
zoom: 1;
}
/* IE8 & 其他浏览器 */
div.container:after {
content: ‘.’;
display: block;
height: 0;
clear: both;
visibility: hidden;
}
是的,谢谢,这确实有效,然而这仍然是一个凌乱的解决方案:7行额外的CSS,在大多数情况下,可以用简单的“overflow: hidden”来解决。如果“zoom”能解决所有浏览器的兼容性问题就好了,这样会更简洁。
Chris,这篇关于overflow的文章非常棒且全面。我喜欢overflow:hidden而不是display:none的一点是,隐藏的内容仍然可以通过屏幕阅读器访问,所以如果你正在做一些隐藏/显示交互,那些无法看到显示器或不使用鼠标的用户仍然可以访问隐藏的内容。
真的有“有趣”的错误吗?它们只会让我们的生活更痛苦。啊,微软,如果你能再努力一点就好了……
感谢你发表这篇精彩的文章。
我有一个关于浏览器的小问题。我们如何使overflow属性在不同的浏览器中保持一致?
非常感谢。
你能制作关于以下内容的教程吗:自定义字段、垂直和水平下拉菜单?
附注:精彩的文章
全面,伙计。这是一篇非常全面的文章。干得好,继续努力!
Chris,
你是否做过任何关于固定标题表格的工作,以配合你在overflow属性方面出色的内容?
出于某种原因,Safari 3+和Firefox 3+在滚动表格主体时无法保持标题在固定位置,而表格主体在y方向上会溢出?
对此有什么想法吗?
Richard
根据设计,表格单元格不尊重fixed/relative/absolute定位,因此固定位置的表格标题必须使用不同类型的元素来模拟,使其看起来像表格标题。
Chris,
CSS是否有计划进行任何更改以使其能够修复thead元素?
文章不错。
但是,关于它的姊妹属性,即“overflow-y”和“overflow-x”以及它在不同浏览器中的行为,还没有进一步解释。如果能解释一下就太好了。
Chris,我非常喜欢你的移动网站。请问你能在归档中添加搜索功能吗?
对刚开始学习的内容进行了很好的解释。我尤其感谢阻止水平跳跃的IE技巧。谢谢!
很棒的解释,Chris。谢谢!
多年来我一直使用清除div来清除浮动。从不知道可以简单地将overflow:auto设置为包含元素。谢谢你,Chris!
“我个人对这是否是一件好事没有特别的看法,但我可以肯定地说,在网站内容中到处都是滚动条是丑陋且糟糕的。”
网站是一回事。但网络应用程序(雅虎邮箱、谷歌阅读器、一些未来的基于网络的Photoshop/GIMP等)呢?
……在我看来,“auto”是最佳选择。感谢Chris又一篇精彩的文章。这些属性非常容易理解,但确切地了解它们总是好的,而你总是能出色地解释这些东西。
嗨,我在Firefox中遇到一个问题,一个绝对定位的图像,父div没有隐藏内部内容,也就是说,即使我设置了overflow: hidden和-moz-overflow: hidden属性,图像仍然与div重叠。