当前位置: 首页 > 图文教程 > 网页制作 > CSS样式表 > CSS模型教程:boxes,borderes,margins和padding
CSS样式表 中的 CSS模型教程:boxes,borderes,margins和padding
乍看之下, CSS 布局模式简单明了。盒子,边框和边距都是相当简单的对象, CSS 语法对它们的特性描述并不复杂。
然而, 浏览器渲染引擎遵循着 CSS 2.1 推荐中所规定的一大堆规则,此外还有一些自己的规则。因此,对设计师而言,在将某个高级技巧添加到自己的技术集之前,需要先了解大量细节问题。
在本文中,我们将对那些控制 HTML 元素的布局的 CSS 属性进行介绍,这些 CSS 属性包括 HTML 元素的边框,边距和许多其它属性。本文所涵盖的范围还包括上面提到的一些规则。高级的栏式布局以及栅网聚焦技术将在后面的文章中讨论,这些文章将更加详细地对布局,浮动,清除,以及定位进行探讨。
在默认情况下,许多 HTML 元素如 div 元素和标题会渲染到占据浏览器画布的全部宽度,并且会强制实行末端断行,因此成串的这种元素的渲染效果在文档画布上会处于从上到下的堆叠中。
但是,HTML 元素和其通常的浏览器样式并不能满足开发员想达成的所有用途。把 CSS 与 HTML 合在一起用来“弥合差距”,从而 class 和 id 给标签添加语义,而样式表规则可以精确地改变布局和页面内容外观——甚至可能通过抵消掉浏览器默认样式的大部分效果来实现这一点。
对空白的细致控制是设计者最重要的工具之一——笔者认为它是重中之重。然而,尽管对空白的控制度能给网站设计带来高产品价值,但在默认的浏览器样式表中却缺乏这种控制,这就意味着设计师会频繁用到本文所说的边距,边框,填充距, 和其它 CSS 布局属性。
边距,边框和填充距的分布如图1所示。

图1:一个元素盒中各组成成分的详细图示,标有相关CSS属性。
边距可单独指定,也可在一条缩写规则中加以指定。另外缩写规则还可以对某个对象周围的各个边框进行控制。合法的值通常是用 px 或 em 单位指定的(像素或字体高)。而在 print-specific 样式表单中会相反用 in、cm 或 pt 单位(英寸、厘米或点)。
在所有情况下 %(百分比)值都是合法的,但须谨慎使用;此类值是按照父元素宽度的比例来计算的,漫不经心的赋值会造成意外的后果。这一问题将会在下面对 CSS 盒模型的讨论中加以详述。
除图像外所有内联元素都没有边距,因而无需边距值。关于这些元素的列表,请参阅下面的表2.
依据不同的情况,auto 的赋值会指示浏览器按照自己样式表中的值来渲染边距。但是,在将这样的边距应用到某个元素上,而该元素的宽度具有意义时,auto 边距会将所有可用空间渲染成空白。
看看下列规则:
.narrowWaisted { width: 16.667em; margin: 1em auto 1em auto;
}
…class narrowWaisted 的块元素会将自身对齐到可用画布的中心。
…或可将某个适当元素的右边距设成某个相对较小的值,而左边距设为 auto 值。
设置完成后,这样的元素就会接近于右对齐。
所有边距属性都可以设为 negative。进行这种设置之后,就能以任意程度“抵消”相邻的边距。如果将一个足够大的负边距应用到一个足够大的元素上,受其影响的相邻元素甚至可以被重叠。
例如,看看下面简单的 div 元素(取自示例文件 negativemargin1.html。)
<div id="header"><h1>Lovely header</h1></div>
<div id="content"><p>Overlapping text is entirely unreadable</p></div>
如果用下面的CSS来样式化
body {background-color:white font-family:Geneva, Arial, Helvetica, sans-serif;}
#header { background-color:yellow }
h1 { color:red; font-size:2em; }
就会产生如图 2 所示的效果:

图2:这个简单示例中的两个元素。看起来很普通。
有意思的是下面这部分。现在我们要通过下面的规则给位于下边的元素的顶部添加一个相当大的负边距:
#content {margin-top:-3em;}
这样我们就会看到该元素上移了,重叠在标题上,如图3所示(实际例子参见negativemargins2.html 示例文件)。

图 3:应用了负边距之后,下边的元素上移并重叠在标题上。
两个相似并相邻的块元素都有正边距时,两个边距中只有较大那个才会得以应用。如,试试下面的规则:
p { margin: 1em auto 1.5em auto;
}
如果按照字面含义对含有这种样式规则的文件进行渲染,连续的两个段落之间的最终边距应该是 2.5em ,即段落 1(1.5em)的底部边距与段落 2(1em)的顶部边距之和。但是,由于合并边距的应用,它们之间的边距只有 1.5em。
在块元素中列表和标题是特例,它们的边距不会与其它块元素的边距相合并。
在文本样式化一文中,F. Scott Fitzgerald 作品的开头部分的排版是由CSS做成的。本文中的示例用的是同一篇文章,只是对这片文章做了些小改动(主要是在正文周围加上一个容器元素)。没有对其文本式样作改动,只是去掉了该示例中用到的一些布局样式。
首先,我们将边距加到所有需要边距的元素上。
body { margin: 0; } #main { margin: 0 auto 0 auto; } h1 { margin: 0 0 1em 0; } .pullQuote { margin: auto 0 1em 1em; } p { margin: 0; } .attribution { margin: 0 0 1.5em 0; }
border 缩写属性有是有的, 但是只有在给一个元素四边都加上完整一致的边框时才能用到它。通过下列属性的任意有意义的组合,可以给一个元素的四个边框之一设置粗细(宽度)、样式和颜色:
这些属性的作用与人们所预期的一致:它们给一个或多个边框指定明确的粗细.
border-width 缩写属性可支持的属性值表示法与 margin 缩写属性的一样,只是不支持百分比值。你可以像下面这样写规则:
td { border-width: 1px 0 0 1px;
}

图 4:八个常见的边框样式的运行效果。
border-style 属性通常接受下列这些值:
应用border-style 缩写属性时,一次至多可写四个值,其形式与 margin 缩写形式一样。
边框的淡化(而不是省略边框)处理是由 -color 属性进行的。
最后,我们可以对任何一个边框设置任意颜色,这种操作可以通过单独对上面所列出的属性进行设置来完成,也可以通过 border-color 缩写属性来完成。对于在缩写属性中给出的值少于四个时会产生的效果,详见 margin 缩写属性说明。
像 background-color 一样,border-color 可以取 transparent。这一点在对付要求组合一致但不要求边框使用一致的边缘情况时会很有用。
和各种 -width、-style 和 -color 属性不同,你可以用这五个属性来定义某个对象的四侧边框的三个特征,或每次定义任一边框的三个特征。合法的 border(等等)缩写值包含所有或任一应用于此边框的宽度,样式和颜色属性;唯一的限制是你必须要么一次只提交某个元素的一侧边框,要么四侧边框全部提交。
看看下列 border 规则:
#borderShorthandExample { border: 2px outset rgb(160,0,0); padding: .857em; background-color: rgb(255,224,224);
}
应用了上面规则的元素会产生与此处相同的效果。
如果在 border 缩写规则中省略某个值时,渲染出来的元素就会表现出对应的默认效果;
这里所说的“rules”是指划过某个布局的线条,而不是要遵从的指令。这样的线条可以增强一个元素与它旁边的空白的对比度,在许多情况下,它们有助于制作一个布局中的立体感效果。inset 和 outset 边框样式就是这种效果的例子。
对一个元素的四边都加上边框可以得到相同的效果,而这种在布局上划出精确界定的线条的技能可以使设计者对细节有相当大的控制权。
如果一个布局的创建要求设计师具备高超的技艺,这就需要对边缘情况进行处理;这个问题已在早先讨论边距时提出了。
因为网站设计方式的缘故,你会遇到许多这样的情况,同一 HTML 文档中的某个元素与其它元素结构属性相似,却要求有不同的外观。在这些情况下,对大多数元素编写写一种规则,而对每个边缘情况编写附加规则就会非常有用。这就是auto和inherit值存在的原因:将默认样式作为边缘情况处理。
对边框来说,边缘情况很可能要求对某个元素某侧的边框的某个属性进行改变¬——如果某个人明智地选择遵从 KISS 法则,最好坚持只改变需要变动的细枝末梢。
文件中的某些部分需要以规则和边框的形式进行修饰。
h1 { border-bottom: 1px solid rgb(153,153,153); }
.pullQuote { border: 1px solid rgb(153,153,153); }
你可能会遇到背景颜色处于次要地位或带有需要在内容和边距之间留出缝隙的强调色的元素。你也可能遇到需要在边框和靠近边框的文本之间留出空隙的情况。
在如此种种情况下,padding、padding-top、padding-right、padding-bottom 和 padding-left 属性就可以大显身手。这些属性用于在元素和其内容的边距或边框之间插入负间距。边距,边框和填充距之间关系的明确图解请参见上面的图1。
这些属性的运作方式与边距属性完全相同,除了以下例外:
应当在之前已经添加了边框的元素上添加间隙。
body { padding: 0; } h1 { padding: .5em 0 .5em 0; } .pullQuote { padding: .5em; }
通常大部分元素的尺寸可以被更改。这种性质已在前面讨论 auto 边距时说明过了。
用来控制元素尺寸的CSS属性包括 width、height、min-width、max-width、min-height 和 max-height。这些属性可通过 overflow 属性与元素内容的尺寸相分离(或连接)。
此外还有 clip 属性,用于将元素的一部分隐藏于其边距中。但由于并不常用,所以在本文中就不详述了。
通常,人们可以预见 width 和 height 的效果。但是,使用时也有些地方需要注意。
有时,你会遇到这种情况:你需要对一个元素的大小进行约束——通常是为了保证一个大小为比例值的列能够保持在一个易于阅读的宽度上。各种 min- 和 max- 属性正是作用于此。与 width 和 height 情况一样,通常这些属性的使用效果是可以预见的。
但是以笔者的经验来看,这些属性的用途有限(尽管替他一些作者持异议)。像以前简单的 width 和 height 一样,它们也受到取整误差的困扰,这种误差很能会导致完全意外的后果。 更重要的是,IE 6 完全不支持它们。到2008年七月为止,IE 6 在市场上仍占有很大份额。
auto 边距是放在页面容器的左侧和右侧的。现在为了使这些边距值有意义,我们来为其设置 width。此外,还要给格言引用设置一个 float 值,使它也获得宽度。
#main { width: 42em; }
.pullQuote { width: 14em; }
设定元素的 width 或 height 时,有时会需要考虑在该元素的内容占据的空间超过了严格意义上可获得的空间时,我们期望得到什么样的效果。在那些既有用户生成内容,又有严格布局规范的网站上尤其需要注意这一点。
overflow 属性和它的四个有效值——visible、hidden、auto 和 scroll ——可用于处理这种情况。图 5 展示了将这几个属性值应用到一个内容超出其边界框的元素上所产生的效果。

图 5: CSS overflow 属性的效果。
既然我们已经讲完了基本的布局属性,接下来我们就来看看浏览器是如何按照一个元素的 CSS 属性来渲染它的宽度的——以及避免你的元素从布局中溢出。有些效果非常好,而另一些似乎毫无道理可言。麻烦的是有两种布局算法需要考虑:在 CSS 2.1 推荐中,由万维网联盟(W3C)所指定的模型,和较早版本的 IE 中所用的模型。
对于文本来说,元素的大小可以用比例单位 % 或 em,或者像 px 这样的静态单位来设置。需要考虑的还有浏览器画布的大小永远是静态值,如果不用客户端 script 代码,是不可能恢复这个尺寸或调整窗口大小的——这种情况对于可访问性,可用性和媒体便携性的要求来说很不合适。
默认的 width 和 height 值是 auto,这在标准英语中意即“使用所有可用空间”的指令 。对块元素来说其效果是,计算出的 width 占完了所有可用空间。对 height 来说,默认情况下元素会扩展来容纳它们的所有内容。
改变 width 和 height 值时,必须小心确保元素的内容(带有边距,边框和填充距)与你所指定的宽度相适应。为了实现这一点,最简单的办法就是进行下列步骤:
| 单位 | 优点 | 缺点 |
|---|---|---|
| em |
|
|
| 百分比 |
|
|
| px |
|
|
表格 1: 设置布局属性时,百分比,em 和像素单位的优缺点
盒模型实际上只是一系列指令,用来定义元素的种种布局规范如何相互作用。盒模型涵盖的组件有:
上面的最后一项依次包含了其它5项。但是为简明起见,这一部分将集中讨论简单的父元素-子元素关系,多级盒模型交互作用将保留到后面详谈页面布局的文章中再做深入讨论。
基本规则就是一个元素的宽度或高度计算值等于:
margin + border + padding + (width|height)
在许多情况下,width 和/或 height 都设置的是其默认的 auto 值,这就是说为页面内容预备的画布区域等于:
available_canvas ? margin ? padding ? border
在这样的等式中,available_canvas 本身是一个离散值(如果是自动计算的话), 用它来减去边距,边框和填充距。 这个数字对元素的宽度极为重要,设计者的计算错误将会导致在浏览器窗口上出现水平滚动条这种让人头疼的结果。另外,浏览器通常会将元素置于浏览器画布的左边,但它可能会溢出浏览器窗口的右边,除非有其它命令来限定。
看看下面的样式表规则:
#myLayoutColumn { width: 50em; margin: 1.5em auto 1.5em auto; border: .1em; padding: .9em;
}
如前面在讨论边距属性时说过的那样,#myLayoutColumn 会将自身对齐到其容器元素的中心,无论其容器是 body,还是由开发团队做出的其它东西。
另外,如果“严格模式”的激活(通过一个适当的 !DOCTYPE 声明)应用了 W3C 的盒模型的话,也可估算出非边距 al宽度是:
0.1em + .9em + 50em + .9em + .1em = 52em
在 screen 媒体上,浏览器会采用此值,将所有属性值分别取整为最接近的像素值,并按照这些值来进行最终效果渲染。
使用 W3C 盒模型时,百分比的边距和填充距是相对于其包含元素的 width 计算值来计算的。例如,如果为一个包含在 800 像素宽的元素中的元素指定 margin: 20%,该元素周围的边距就是每边 160 像素(800 的 20% 是 160)。
如果对这个元素指定 padding: 5%,它的内容宽度计算值就是400像素:
20% + 5% + 5% + 20% = 50%
0.50 × 800 = 400
800 ? 400 = 400
由于后面的教程要讨论多栏式布局的制作,本文下面将介绍三个 CSS 属性:display、float 和 clear。
除 html、body 和 table 部分之外,在 HTML 4.01 推荐中与主要内容有关的所有元素都有一种相关联的类型:内联或块。每种类型以不同方式决定了默认布局表现:
display 属性有三个常用的值¬——block、inline 和 none——其中两个是指对应的元素类型。改变元素的 display 值可以使内联元素的表现方式像块元素那样,也可以使块元素的表现方式像内联元素那样,还可以改变文件的渲染效果,使之看起来就像元素(和它的所有内容)根本不存在一样。
一般来说,了解默认情况下哪些元素与哪些类型相对应是很关键的,其关系简列于表2中:
| 元素 | 类型 | 子类型 | 说明 |
|---|---|---|---|
| a | inline | special | |
| abbr | inline | phrase | |
| acronym | inline | phrase | |
| address | block | 一般与p的行为方式类似 | |
| blockquote | block | 在!DOCTYPE声明为Strict时,必须包含至少一个块元素 | |
| body | 封装了整个文档画布;一般会有 10px 的边距(在 IE, Firefox 和 Safari中)或是填充距(在Opera中),像素大小视所用的 screen 媒体而定 | ||
| cite | inline | phrase | |
| div | block | ||
| em | inline | phrase | |
| fieldset | block | 默认情况下一般按照 border: 1px black; 渲染 | |
| form | block | ||
| h1 … h6 | block | heading | |
| input | inline | formctrl | |
| img | inline | special | |
| label | inline | formctrl | |
| li | block | 文档类型定义中没有指明该元素的类型,但该元素可包含块元素和内联元素;完成版的 CSS2.1 推荐为列表项留出了 display 值 | |
| ol | block | list | |
| p | block | 只能包含内联元素;一般会渲染有顶边距和底边距 | |
| span | inline | special | |
| strong | inline | phrase | |
| table | block | ||
| ul | block | list |
表2: 常用 HTML 元素和它们的类型。只有具有相同子类型的相邻块元素之间的边距才会合并。
只是为了做个演示,将标题中的 “Prologue” 注释掉怎么样?
.sectionNote { display: none; }

本段左边放了一张照片。当然你们都会看到后面的文本自然地环绕于其周围,尽管有人得先停止琢磨为什么著名的科幻小说家要在他的猫身上绑块儿熏肉——即使今天是他的慢调生活日。我们可以用 HTML 属性来指定你所看见的布局表现,但在这个例子中该效果是由 CSS 完成的。
可以猜到,这个戏法是由 float: left; 这一属性/值组完成的。在后面的文章中将会介绍运用浮动这个好点子,但有必要在这里谈谈它的基础。float: right 是极有用的属性/值组。如果你要取消一个引用了 float 的 class 赋值,你可以指定 float: none。
float 属性有一些用法说明:
之前已经谈过了在格言引用上赋 float 值的问题。那么完成之后,我们就可以来看看效果。我们可以添加一些背景颜色使它与主要内容区别开来。
.pullQuote { float: right;
background-color: rgb(204,204,204); }
像 float 属性一样,可指定 clear 属性为 left、right 或 none 三者之一。清除属性也支持 both 值。
float 属性指令其它元素的内容如何环绕浮动元素,clear 属性则规定了元素如何环绕其相邻元素¬——在许多实例中,是规定不要浮动。
图 6 显示了 clear: left; 的表现;此布局中两个原来连在一起的元素被指定了相同的 height 值,而 float 值分别设为 left 和 right:

图 6:因为高度相当,clear:left 使底部盒子清除了两列的浮动。
前一示例中 #cLeftWidget 的默认环绕会将它置于希腊语文本下面¬——即,#fLeftWidget 和 #fRightWidget 之间 。
想想看,如果这一组元素中前一个元素比其右对齐的同僚短,会出现什么效果?如图7所示:

图 7: 当右列比左列长时,clear:left 不会清除两列,所以必须用 clear:both。
在前一个例子中,后续元素的 clear 值设为 left 是为了表明一个观点:因为两个 float 的元素等高,clear 的元素会被推到两者下面。但是,第二个例子证明为了从高度不等的 float 元素取得相同的结果,必须用到 clear: both;。
这里对 clear 属性的探讨可看做其效果的简单介绍,后面的文章会更深入地对该属性的用途和技巧进行讨论。
由于渲染引擎的种种差异,对全面涵盖传统的定义基础的需要,对浏览器窗口大小预计的无能为力,对 Web 文档的布局都充满了困难和限制。但是,一般的 CSS 支持水平已经可以轻易地使 Web 文档在浏览器上得到满意的效果。
评论 (0) All