CSS3盒模型——边界

课后整理 2020-12-9

元素的外部空隙被称为盒模型的边界,也就是元素与元素之间的间距。边界是网页布局中另一个重要要素,恰当设置边界可以使网页布局疏朗有致,整体看起来优美得体。

定义边界

设置边界可以使用margin属性,例如:

margin可以使用任何长度单位,如像素、磅、英寸、厘米、em、百分比等。margin默认值为0,如果没有定义margin的值,则意味着元素没有边界。

在实际使用中,各种浏览器都会为一些元素预定义边界样式,如p、h1~6、ul等,在显示时浏览器也会自动显示一定的边界。因此一些元素虽然没有定义margin,但并不意味它们没有边界。

边界应用

网页居中

aotu是一个自动计算的值,这个值一般为0,也可以为其他值,这主要由具体浏览器来确定。

【示例1】auto有一个重要作用就是用来实现元素居中显示,下面示例演示了如何设计页面居中显示,效果如图11所示(test.html)。

<style type="text/css">
body { text-align:center; }                          /*在IE浏览器下实现居中显示*/
div#page {
    margin:5px auto;                               /*在非IE浏览器下实现居中显示*/
    width:910px;
    height:363px;
     background-image:url(images/1.png);
    border:solid red 1px;}
</style>
 
<div id="page">模拟页面</div>

图11 居中显示效果

要实现CSS平行居中,首先应在父元素中定义text-align:center;,这个规则在IE早期版本浏览器中可以实现父元素内的所有内容,包括文本、行内元素和块状元素居中显示。但在其他浏览器中只能实现文本、行内元素居中显示。而要在标准浏览器中实现块状元素居中显示,解决方法就是为显示元素定义margin-right:auto;margin-left:auto;属性。      

如果想用这种方法使整个页面居中,建议不要把所有模块都套在一个div元素里,可以根据上面示例CSS布局代码定义,然后为每个模块的包含框元素div定义margin-right:auto;margin-left:auto;就可以实现该元素居中显示。

在实际使用中,可能希望页面布局居中显示,但内部文本以左对齐,这时就需要为子元素定义text-align:left;属性,使其内部文本向左对齐。否则文本也会居中显示,显然这不是所希望的结果。

设计弹性页面

边界可以设置为百分比,百分比的取值是根据父元素宽度来计算的。使用百分比的好处能够使页面自适应窗口大小,并能够及时调整边界宽度。从这点考虑,选用百分比具有更大灵活性和更多使用技巧。但是,如果父元素的宽度发生变化,则边界宽度也会随之变化,整个版面可能会混乱,因此在综合布局时要慎重选择。不过在结构单纯、内容单一的布局中,适当使用会使页面更具人性化和多变效果。

【示例2】下面示例通过margin取值百分比定义弹性布局页面,效果如图12所示(test1.html)。

<style type="text/css">
#box {/*定义文本框属性*/
    margin:2%;                                       /*边界为body宽度的2%*/
    padding:2%;                                      /*补白为body宽度的2%*/
    background:#CCCC33;}
#box #content {                                        /* 定义文本框内文本段的属性 */
    margin:4%;                                       /* 边界为文本框宽度的4% */
    line-height:1.8em;                              /* 定义行高为字体高度的18倍 */
    font-size:12px;                                  /* 定义字体大小 */
    color:#003333;                                  /* 定义字体颜色 */}
#box .center {/* 居中加粗文本 */
    margin:4%;                                       /* 边界为文本框宽度的4% */
    text-align:center;                               /* 文本居中显示 */
    font-weight:bold;                               /* 定义标题为粗体 */}
</style>
 
<div id="box">
    <p  class="center">将进酒</p>
    <p  class="center">李白</p>
    <p  id="content"> 君不见,黄河之水天上来,奔流到海不复回。<br />
        君不见,高堂明镜悲白发,朝如青丝暮成雪。<br />
        人生得意须尽欢,莫使金樽空对月!<br />
        天生我材必有用,千金散尽还复来。<br />
        烹羊宰牛且为乐,会须一饮三百杯!<br />
        岑夫子,丹丘生,将进酒,君莫停!<br />
        与君歌一曲,请君为我侧耳听!<br />
        钟鼓馔玉不足贵,但愿长醉不愿醒!<br />
        古来圣贤皆寂寞,惟有饮者留其名!<br />
        陈王昔时宴平乐,斗酒十千恣欢谑。<br />
        主人何为言少钱?径须沽取对君酌。<br />
        五花马,千金裘,呼儿将出换美酒,与尔同消万古愁! </p>
</div>

图12 弹性布局效果

在上面示例中,把所有边界都设置为百分比,这样当窗口发生变化时,显示内容也比较得体的成比例变化,不至于当窗口很小时,段落文本所占区域比例很大,当窗口很大时,段落文本所占区域比例又显小气。边界的随机应变使页面更显机灵。

调整栏目显示顺序

边界可以取负值,负值边界会给的设计带来更多创意,在网页布局中经常应用该技巧。

【示例3】下面示例模拟一个页面栏目,该栏目包括左右两个分栏,显示效果如图13所示(test2.html)。

<style type="text/css">
#wrap {/* 设置栏目包含框样式 */
    width: 997px;                                    /* 固定栏目总宽度 */
    margin: 12px auto;                            /* 定义栏目居中显示 */}
#box1, #box2 {/* 设置左右模块共同属性 */
    float: left;                                         /* 向左浮动 */
    height: 376px;                                   /* 固定高度 */
    background-position: center  center;     /* 背景居中 */
    background-repeat:  no-repeat;}           /* 背景禁止平铺 */
#box1 {/* 定义左侧模块 */
    width: 408px;                                    /* 固定宽度 */
    background-image:  url(images/22.png);}/* 定义模拟子栏目效果图 */
#box2 {/* 定义右侧模块*/
    width: 589px;                                    /* 固定宽度 */
    background-image:  url(images/23.png);}/* 定义模拟子栏目效果图*/
</style>
 
<div id="wrap">
    <div  id="top"><img src="images/21.png" /></div>
    <div  id="box1"></div>
    <div  id="box2"></div>
</div>

图13  默认布局效果

这是一个很普通的两栏布局示意图,如果想把把左右两栏位置换一下,似乎很简单,只需要把HTML结构调整一下即可:

<div  id="wrap">
    <div id="top"><img  src="images/21.png" /></div>
    <div id="box2"></div>
    <div id="box1"></div>
</div>>

但是,当页面很复杂时,各种标签相互嵌套,代码成百上千行,这个看似简单的位置调换,可能需要牵一发动全身,麻烦不说,甚至破坏布局。

其实,只需要在CSS样式表中添加如下2个样式即可,则演示效果如图14所示(test3.html)。

#box1 {
    margin-left:589px; /*左栏左边界取正值,值为右栏总宽度的和*/}
#box2 {
    margin-left:-997px; /*右栏左边界取负值,值为左右栏总宽度的和*/}

图14 百分比取负值布局效果

在浮动布局时,当窗口缩小到一定宽度,如小于或等于左右模块宽度总和时,右边模块就会错行,通过边界取负值能够很好的解决这个问题,且各种浏览器都能够支持。

【示例4】可以使用边界取负值来对段落文本的行距进行一些补偿和修整,下面示例通过margin取负值来调整列表项目之间的行距,比较效果如图15所示(test4.html)。

<style type="text/css">
ul {
    margin: 20px;
    font-size: 16px;}
li { margin-top: -2px; /*压缩列表项之间的空隙*/ }
</style>
 
<ul>
    <li>人生得意须尽欢,</li>
    <li>莫使金樽空对月!</li>
    <li>天生我材必有用,</li>
    <li>千金散尽还复来。</li>
</ul>

压缩前

压缩后

图15 压缩前后比较效果

负边界对文本编排有影响,会间接缩短行距,影响段落的显示效果。另外,通过边界与补白的取负配合实现栏目背景色自动向下延伸,利用边界取负实现动态导航效果,通过边界取负隐藏不需要的内容等。

边界重叠

在网页排版中,通过margin调整栏目之间、对象之间的间距,但是元素之间的margin值会发生重叠,影响布局效果,使用时应该小心。简单概括如下:

边界重叠问题由于受各种结构关系的干扰,并非总是按预想的那样显示效果,下面结合示例分别进行讲解。

上边元素不浮动,下边元素浮动

【示例5】当上边元素不浮动,下边元素浮动时,上下元素的margin不会发生重叠(test.html)。

<style type="text/css">
/* [边界重叠1:上边元素不浮动,下边元素浮动] */
body {/* 清除页边距 */
    margin: 0;                                         /*适用IE*/
    padding: 0;                                       /*适用非IE*/}
div {/*设置上下元素共同属性*/
    width: 100px;
    height: 100px;
    clear: both;                                       /* 清除并列浮动显示 */
    margin: 20px;
    padding: 20px;}
#box1 {/* 定义上边元素不浮动 */ border: solid 20px red;}
#box2 {/* 定义下边元素浮动 */ float: left; border: solid  20px blue;}
</style>
 
<div id="box1">上边元素</div>
<div id="box2">下边元素</div>

上边元素浮动,下边元素不浮动

【示例6】与示例1相比,这是一个相反的布局,但渲染的效果却截然不同,如图16所示(test1.html)。

<style type="text/css">
body {/*清除页边距*/
    margin:0; /*适用IE*/
    padding:0; /*适用非IE*/}
div {/* 定义上下元素共同属性 */
    width:100px;
    height:100px;
    clear:both;
    margin:20px;
    padding:20px;}
#box1 {/* 定义上边元素浮动 */
    float:left;
    border:solid 20px red;}
#box2 {/* 定义下边元素不浮动 */border:solid 20px blue;}
</style>
 
<div id="box1">上边元素</div>
<div id="box2">下边元素</div>

在IE中浏览,上下元素边界发生重叠现象。这与上边元素不浮动,下边元素浮动所讨论的结论是不同的,在其他浏览器中也具有相同的显示效果。

未重叠效果

重叠效果

图16 margin重叠比较效果

一个元素包含另一个元素

一个元素包含另一个元素从结构上讲属于嵌入或包含关系,它们不属于同一级别的相邻关系,外边的元素可以称为父元素,里面的元素可以称为子元素。

【示例7】下面示例设计当定义了父元素的边框或补白后,会看到子元素自动停靠在父元素内容框的左上角,如图17所示(test2.html)。如果内容框内前面包含其他对象,则自动向下分布。子元素的边界、边框和补白都被包含在内容框里。不管父、子元素是否或独立浮动显示,这种效果在不同浏览器中显示是相同的。

<style type="text/css">
body {margin: 0; /*适用IE*/padding:  0; /*适用非IE*/}/*清除页边距*/
div {/*定义父子元素共同属性*/
    margin: 20px;
    padding: 20px;
    float: left;}
#box1 {/*定义父元素的属性*/
    width: 500px;
    height: 300px;
    float: left;
    background-image:  url(images/1.jpg);
    border: solid 20px red;}
#box2 {/*定义子元素的属性*/
    width: 150px;
    height: 150px;
    float: left;
    background-image:  url(images/2.jpg);
    border: solid 20px blue;}
</style>
 
<div id="box1">
    <div  id="box2">子元素</div>
</div>

图17 IE下演示效果

【示例8】如果取消父元素的边框和补白,并取消浮动显示,这时会发现子元素的边界越过父元素的边界,实现了叠加,其中较大边界会覆盖掉较小边界,如图18所示(test3.html)。

<style type="text/css">
body {margin:0; /*适用IE*/  padding:0; /*适用非IE*/}/*清除页边距*/
#box1{ /*不定义父元素的边框、补白,仅设置边界*/
    margin:20px; /*父元素的边界为20px*/
    background-image:url(images/1.jpg);}
#box2 { /*定义子元素的属性*/
    margin:60px; /*子元素的边界为60px*/
    border:solid 20px red;
    padding:20px;
    width:150px;
    height:150px;
     background-image:url(images/2.jpg);}
</style>
 
<div id="box1">
    <div id="box2">子元素</div>
</div>

图18 包含元素之间的margin重叠现象

【提示】

边界重叠是网页布局中经常遇到的问题,也是布局中要重点考虑因素。边界重叠多发生在流动显示的块状元素的上下边界之间,但是如果对象是行内元素、绝对定位的元素,它们的边界一般是不会重叠的。浮动元素一般也不会发生重叠现象,但它的情况比较复杂,需要结合具体情况进行处理。

在布局中,最好设置上下元素的显示性质相同,例如,如果浮动,则都浮动;如果不浮动,则都不浮动。

如果实际需要,上下元素的显示属性(display)不相同,或者必须设置不同的显示性质。如上边元素浮动,下边元素不浮动,或者相反,此时要保证设置浮动元素的清除属性,即clear:both;。也可以单独设置下边元素的清除属性,但不能只设置上边元素为左右清除,否则对下边元素无效。因为该属性作用对象为后面解析的元素。

当上下元素显示性质不同时,请务必计算好边界问题,保证版面布局的统一协调。由于不同浏览器对此解释不一,不妨通过Hack技术来解决,即通过为不同浏览器设置不同的边界值来实现显示的统一。

行内元素边界

根据盒模型基本规则,任何元素都应有边界。关于行内元素的边界问题比较简单,它没有块状元素那样复杂多变。而且各种浏览器对行内元素的解析效果空前的统一。

与边框一样,行内元素的边界不会改变行高,行高只能由line-height、font-size和vertical-align属性来改变。与边框一样,行内元素的边界会挤占左右相邻文本的位置,因此使用边界可以调整相邻元素的距离,实现空格。另外,左右边界不会产生断行,边界被浏览器看作一个整体嵌入行内元素的两端。

【示例9】下面示例演示了当行内元素定义margin之后,它会对左右两侧的间距产生影响,如图19所示。

<style  type="text/css">
p {/*影响行高的属性*/
    line-height: 28px;
    font-size: 16px;
    vertical-align: middle;}
span {/*行内元素的边界*/
    margin: 100px;
    border: solid 1px blue;
    color: red;}
</style>
 
<p> 五月草长莺飞,窗外的春天盛大而暧昧。这样的春日,适合捧一本丰沛的大书在阳光下闲览。<span>季羡林的《清塘荷韵》</span>,正是手边一种:清淡的素色封面,一株水墨荷花迎风而立,书内夹有同样的书签,季羡林的题款颇有古荷风姿。 </p>

图19 IE下预览效果