冒着重复自己的风险:**网页设计中的每个元素都是一个矩形框。** 这是我的 顿悟时刻,它帮助我真正开始理解基于 CSS 的网页设计并实现我想要的布局。我们已经 讨论过这些框的位置 一点,以及 关于它们的行为。
我们没有过多讨论的是盒子本身。盒子的尺寸究竟是如何计算的?
这是一个图表
如果您是 Firebug 用户,您可能习惯了这样的图表,它可以很好地向您展示影响页面上任何框的数字
请注意,在两个示例中,外边距都是白色的。外边距的独特之处在于它本身并不影响盒子的大小,但它会影响与盒子交互的*其他*内容,因此是 CSS 盒模型的重要组成部分。
盒子本身的大小是这样计算的
宽度 | width + padding-left + padding-right + border-left + border-right |
高度 | height + padding-top + padding-bottom + border-top + border-bottom |
如果这些值未声明怎么办?
如果未声明内边距或边框,则它们要么为零(如果您使用的是 css 重置),要么为浏览器默认值(可能*不是*零,尤其是在通常不会重置的表单元素上)。
如果未声明框的宽度(并且该框是块级元素),事情会变得有点奇怪。让我们先从这开始,然后再继续了解一些关于盒模型的其他好东西。
块级盒子的默认宽度
如果您未声明宽度,并且该框具有静态或相对定位,则宽度将保持 100%,并且内边距和边框将向内而不是向外推。但是,如果您*明确设置*框的宽度为 100%,则内边距将像往常一样向外推动框。
这里的教训是,盒子的默认宽度实际上不是 100%,而是一个不太明显的*“剩下的任何东西”*。这一点尤其重要,因为在很多情况下,*设置*或*不设置*宽度都非常有用。
我总是发现这方面最大的问题是 textarea 元素,它们非常需要设置宽度来对抗必需的“cols”属性,并且不能有子元素。因此,您通常需要将 textarea 显式设置为 100%,但也需要内边距,这会使其太大而无法容纳。在静态宽度环境中,我们经常求助于适合的像素宽度,但在流体宽度环境中就没有这种运气了。
没有宽度的绝对定位盒子
未设置宽度的绝对定位盒子的行为有点奇怪。它们的宽度仅与其容纳内容所需的宽度一样宽。因此,如果该框包含一个单词,则该框的宽度仅与该单词呈现的宽度一样宽。如果它增长到两个单词,它就会增长到那么宽。
这种情况应持续到该框的宽度达到其父级宽度(最近具有相对定位的父级或浏览器窗口)的 100%,然后开始换行。盒子垂直扩展以容纳内容感觉自然而然,但当它水平发生时,感觉很奇怪。这种奇怪的感觉是有道理的,因为不同浏览器处理此问题的方式存在很多怪癖,更不用说文本在不同平台上的渲染方式不同了。
没有宽度的浮动盒子
没有宽度的浮动元素也表现出完全相同的行为。盒子的宽度仅与其容纳内容所需的宽度一样宽,最大可达其父元素的宽度(不需要相对定位)。由于这些无宽度盒子的脆弱性,这里要吸取的教训是不要在关键任务场景中依赖它们,例如在整体页面布局中。如果您浮动一个列用作侧边栏并依靠内部的某个元素(例如图像)来保持其宽度,那么您就是在自找麻烦。
内联元素也是盒子
我们在这里一直将盒子作为块级元素来关注。很容易将块级元素视为盒子,但内联元素也是盒子。可以将它们视为非常非常长且细的矩形,它们恰好在每一行换行。它们能够像任何其他盒子一样具有外边距、内边距、边框。
换行是它令人困惑的地方。如上所示的左外边距会按预期将盒子向右推,但仅限于第一行,因为那是盒子的开头。内边距按预期应用于文本的上方和下方,并且当它换行时,它会忽略其内边距上方的行,并从行高指示它应该开始的地方开始。背景应用了透明度,以便更清楚地了解其工作原理。
亲眼看看
想看看构成页面的每个“盒子”吗?尝试将此临时添加到样式表中
* {
outline: 1px solid red !important;
}
哇,这太好了!很多我以前不知道的简洁小知识。:)
很好的解释。我会指点人们到这里来。
我认为在 IE 中,浮动盒子仍然具有 100% 或“剩下的任何东西”的宽度,因此如果您希望它与其他东西并排放置,则需要设置宽度。我通常会在将导航浮动在站点标题旁边时遇到这种情况。
是的,最好的做法是**始终为任何浮动、绝对定位或固定定位的元素设置宽度**,以避免跨浏览器问题。
另一个修复 IE 浮动元素的方法是在 CSS 标签中添加“display: inline”。
好主意,我没有意识到这一点! :-)
–给自己留个便笺–
在尝试调整边距之前,请确保设置 display:inline。哦,有一次我因为缺少那个微小(但很重要)的细节而玩得很开心。
是的,将宽度设置为 100% 比用像素固定要棘手。因为像素在不同的浏览器上会有所不同。
我讨厌在 CSS 方面处理 IE,因为它将所有内容都渲染得如此错误。为什么微软不能让他们的浏览器符合 W3C 标准?
非常酷!非常适合刚开始学习 CSS 的人。
所有内容上的边框都是一个简单的测试工具,可以非常 revealing。
Firefox 的 Web 开发者工具栏向您展示了所有盒子.. :)
下载链接
再一次,你用简洁而翔实的文字超越了自己。继续努力!
非常酷。这正是我作为兼职业余爱好者的水平。以前完全不知道这些,现在都明白了。
哇,你真的把“用填充来填充,而不是定位”这条推特认真对待了。有点惊讶你会在2009年中期做一个盒子模型教程,但基础知识永远不会嫌晚。一如既往地出色地展示了信息。
我不想成为一个拼写纳粹,但它是“per se”,而不是“per say”。
那就别当。
这篇关于“溢出”的文章真的很有帮助。学到了一些可以节省时间和避免挫折的东西。
谁在乎拼写是什么,如果你明白他的意思就继续往下看。读你愚蠢的回复只是浪费我的时间。
哇... 你真是个混蛋。
舔我的毛茸茸的蛋蛋吧,迈克和本杰明
不正确。读他的回复是有教育意义的。读你的帖子才是浪费大家的时间。成熟点,“jh”。
嘿,阿菲,你做得很好,谢谢你的小提示。
很棒的文章,谢谢!
读了这篇文章,我发现为什么在你的截屏视频和文章中,你总是将边距和填充重置为0。你能给我们一些关于其他标记标签(如p、ul、li等)的提示和技巧吗?我知道这很大程度上取决于你想做什么,但也许有一些你可以向我们展示的通用规则。
谢谢!
克里斯,好帖子!
顺便问一下,文本框是如何计算的,以及如何删除默认情况下围绕文本的空间?就像你举的例子,它说“hello”,顶部有1px,底部有5px,如果你增加字体大小,它也会增加。
我试着减少行高,但周围总有一些额外的空间。
我想你的意思是字体渲染方法的情况,在每个浏览器中都不同。有些字体在跨浏览器中渲染的方式相同,有些则不同(例如Arial)。我觉得这很烦人。
1像素边框从1997年开始就是默认的测试工具……更早……无论何时引入表格……。
感谢你对盒子模型的复习!!!
我非常喜欢使用背景颜色进行测试,因为它不会破坏你的宽度/布局。Aardvark 已成为我的首选工具之一,它有一个非常好的着色功能,你可以在其中突出显示元素,它会为其分配一个随机的背景颜色。
将其与带有背景颜色的css调试部分结合起来,是我每天在调试布局时都会使用的东西。
无论如何,这又是一篇很棒的文章,我喜欢你对很多事情的返璞归真的方法。
附言:刚刚注意到你的链接附录注释有多酷……渐进增强 FTW!
啊……酷链接附录从未出现过:(
所以默认情况下填充在框内,但是当你设置宽度为100%时,填充在框外??? :-(
当宽度为100%时,填充仍在框内。在这个例子中,父元素的宽度为300px。将子元素设置为100%,填充为20px,使框的宽度为340px(父元素的300宽度+ 20px左填充+ 20px右填充)。我认为是父元素的静态宽度让你感到困惑。
为什么我的Page Down键在你的博客上不起作用?在XP上使用Firefox 3
盒子盒子盒子! :-)
很棒的文章。CSS技巧网站一直都有内容丰富的文章!
写得很好,内容非常丰富,克里斯。
谢谢。
当我感觉有点失控的时候,我也经常使用边框技巧。我算是自学了这个技巧(没有在任何地方读到/看到过)——很高兴读到更多的人也是这样做的 :)
请注意,内联“盒子”不能有高度或宽度。
请参阅此处的示例。
向内联元素添加填充充其量也是一件麻烦事。我认为某些版本的IE允许这样做。如果我没记错的话,Firefox会填充左右两边,但不会填充上下两边。
不过,无论浏览器支持如何,根据规范,内联元素实际上不是盒子。它们没有宽度,没有高度,没有填充等等。(当然,除非你添加 display:block ;) )
好吧……谢谢你帮我澄清!我已经使用Firebug一段时间了,只是看了看盒子。:)
我一直在Web开发工具栏中使用“轮廓”>“轮廓块级元素”。
是的,在我看来,轮廓技术比使用边框更好。
如果你没有Web开发工具栏,这里有一个快速代码片段可以做一些等效的事情。
* { outline: 2px dotted red }
* * { outline: 2px dotted green }
* * * { outline: 2px dotted orange }
* * * * { outline: 2px dotted blue }
* * * * * { outline: 1px solid red }
* * * * * * { outline: 1px solid green }
* * * * * * * { outline: 1px solid orange }
* * * * * * * * { outline: 1px solid blue }
哇!这真是太有用了!感谢你提供这么棒的信息,以及你解释它的方式,即使是一个5岁的孩子也能清楚地理解它。我一定会推荐别人来看!
好帖子,CSS新手,帮助我很好地理解了。
你做得很好,伙计。谢谢你的所有好建议。
很棒的文章。对盒子模型的工作原理有一个非常清晰的理解,可以消除很多猜测。
感谢你解释了设置无宽度和100%宽度之间的区别——我以前从未完全理解这一点。它的工作方式很奇怪——你会认为无论哪种方式都是一样的,但事实并非如此。
另外,提醒大家声明一个正确的文档类型可能是个好主意(无论如何你都应该这样做);否则,IE会回到怪异模式,并使用它自己(不正确)的盒子模型实现。
从以前的麻烦中,我已经了解了这些东西,我通常会设置所有东西的宽度,但很高兴知道有不同的方法来处理这些东西。
我想我应该看看这个到处都被提到的Firebug,我喜欢Web开发工具栏中的功能,并且没有看到查看Firebug的必要。但是那个盒子模型的显示看起来非常有用。
说得很好。
图形表示有助于更容易理解CSS
这篇文章很棒,让人耳目一新。写得非常好。感谢您持续提供高质量的内容!
谢谢你的讲解。虽然是基础知识,但没有基础就无法建造房屋。
刚刚通过 Stumble 发现了这个网站。
很棒的技巧。一直在寻找管理页面布局的不同方法。
期待未来的文章。
嗯,我不明白为什么 Denis Onichshenko 会说这样的话: _“有点惊讶你会在 2009 年年中做一个盒模型教程……”_ 请解释一下你的评论,Denis。你难道没有意识到每年都有人从头开始学习这些东西吗?基础知识始终是相关的(并且正确理解非常重要)——是的,每年都是如此!看看其他从这篇“对你来说太基础”的文章中受益的人的评论。
感谢分享,Chris!
像这样的文章比枯燥的教程更能帮助人们理解基础知识。它非常有价值。如果你想“跳出框框”地进行设计,那么回顾一下这个框是如何工作的总是有好处的。
至于旧浏览器如何处理这个框……brrr,shudder……也许可以考虑写一篇新的教程……尽管我们可能想抛弃 ie6 的双倍边距等错误,但我们仍然需要处理这些问题,而盒模型的细节以及针对旧浏览器修复它的方法可能会让许多灰心丧气的、有潜力的优秀设计师望而却步……
这是一篇很棒的文章,谢谢 chris
值得注意的是,当你为精心排列的盒子应用宽度时,添加红色边框(或任何颜色)进行测试等操作会增加 2px 的宽度和高度,这足以在测试时破坏你的布局。
我通常会临时更改背景颜色,看看发生了什么,这样你的尺寸就不会改变。
不完全正确。例如,你可以设置 80% 的宽度和 10% 的填充,它将很好地适应 100%。唯一的问题是,如果由于某种原因你不希望填充使用百分比。
一个大问题是边框不能采用百分比度量。但我认为 ems 也是一个不错的选择。0.1em 通常适合 1px。
像这样
margin:0.5em auto; border: 0.1em solid #000000; width:80%; padding:5%;
以及 display:block; 因为它在这种情况下是一个 em 元素
另一个需要注意的有趣的事情是,具有相对位置的元素(很像具有固定位置的元素)会自动获得比后面具有静态位置的元素更高的 z-index。但这可以通过将 z-index 属性设置为适当的值来抵消。
好吧……脚本从 em 元素中剥离了内联样式,所以没关系
解释得很好。有很多书籍等等,但这篇文章真的很有信息量,也很有描述性。
很棒的文章。你在这里提出了一些有趣的观点。关于默认值的部分让我思考了一些东西。了解不同浏览器处理这些模型的不同方式对于减少不必要的、耗时的 hack 至关重要,这里就不点名了,……IE。
将来一定会再来这里阅读更多文章。
对于像我这样的新手来说,这很酷的基础知识 :D。谢谢。
非常有用的信息,Chris……Stumbled!
虽然我不再像以前那样是新手了,但阅读 CSS 基础知识和基本原理总是值得的,可以让我温故知新。
此外,内容丰富的评论部分也充满了意想不到的有用技巧和窍门。
哇,我从来没有让所有这些盒子按照我想要的方式工作。
现在我知道为什么了。
解释得很好。
感谢分享
谢谢,这帮助我更好地理解了 CSS,每天我都能理解更多一点。
感谢分享 :)
不错,伙计,感谢分享,这真是一个很酷的描述
关于边框的简洁想法。真希望我能想到这一点。这会让我的生活更轻松。
解释得很好。有很多书籍等等,但这篇文章真的很有信息量,也很有描述性。
非常感谢你的帖子!最近开始使用 CSS 样式表,你的帖子对我帮助很大 :)
这篇文章让我大开眼界。非常感谢你 :)
这可能是一篇很好的文章。但我正在寻找一篇关于如何使用这些愚蠢的 div 的文章。也就是说,我根本不把它们看作是盒子,我是一个平面设计师。画圆角的盒子很容易,即使是圆形的盒子。盒模型的概念仅仅是定义一个空间,一个可以是圆形的空间。“盒模型”这个名称本身就非常不利于理解。
但我的问题是,我试图用与以前使用表格相同的方式定义一个具有多个空间的布局,只是更好。所以如果有人知道在哪里可以找到一个关于如何使简单的 div 布局正常工作的不错的教程或讨论,请联系我并指点我。