9.8 盒子模型与bounds模型的关系

一个inline元素既有盒子,又有bounds,盒子模型与bounds模型同时存在生效。


9.8.1 两者关系

一个inline元素既有盒子,又有bounds,盒子模型与bounds模型同时存在生效。

img

(1)占位。bounds模型用于垂直占位,盒子模型用于水平占位;

(2)显示。盒子模型用于水平与垂直的显示。

(3)公用区域。两者的内容区域content是同一块区域。

(4)盒子模型在内容区域的基础上,加padding与border。

inline元素的box总高度=border-top + padding-top + content-height + padding-bottom + border-bottom

(5)bounds模型在内容区域的基础上,上下各加L/2的间距。

inline元素的bounds高度 = line-height绝对值 = L/2(顶部) + content-height + L/2 (底部)

(6)bounds高度可能大于、等于或小于盒子高度。

(7)开发者工具选择元素时,页面显示的盒子尺寸是border及内部的宽高。

示例代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小步教程</title>
    <style>
        body{
            margin: 20px 5px;
        }

        .div1{
            padding: 0 30px;
            border: 1px solid #ddd;
        }

        .span1{
            color: #666;
        }

        .span2{
            color: #0aaa76 ;
        }

        .span3{
            color: #4aa6fc;
        }

        .span4{
            color: #ed7d31;
        }

        .span5{
            color: #0aaa76;
        }

        .span1{
            padding-top: 2px;
            padding-bottom: 2px;
            border-top: 20px solid #7030a0;
            border-bottom: 20px solid #7030a0;
        }
    </style>

</head>
<body>
    <div class="div1" style="font-family: Arial;font-size: 30px;line-height: 50px;">
        <span class="span1">xiaobuteach is a </span>
        <span class="span2"> good teacher.</span>
        <span class="span3">x</span>
        <span class="span4">xiaobuteach.com is </span>
        <span class="span5">good.</span>

    </div>
</body>
</html>

运行效果

img

删除span1的垂直方向的padding、border设置,不影响所有元素的垂直位置,只是不显示边框。

        .span1{
            /* padding-top: 2px;
            padding-bottom: 2px;
            border-top: 20px solid #7030a0;
            border-bottom: 20px solid #7030a0; */
        }

运行效果

img


9.8.2 利用盒子模型验算bounds模型的L值

浏览器开发者工具目前无法直接查看bounds尺寸,可通过盒子模型间接验算。

img

当父元素div1的上下border(桔色边框)与子元素span1的上下border(蓝色、待调节值)亲密接触,则子元素的上下border等于上下L值。

条件要求:div内只有一个line box,且没被撑高。

示例代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小步教程</title>
    <style>
        body{
            margin: 20px 5px;
        }

        .div1{
            padding: 0 30px;
            border-top: 1px solid #ed7d31;
            border-bottom: 1px solid #ed7d31;
        }

        .span1{
           border-top: 8px solid #4aa6fc;
           border-bottom: 9px solid #4aa6fc;
        }
    </style>

</head>
<body>
    <div class="div1" style="font-family: Arial;font-size: 30px;line-height: 50px;">
        <span class="span1">xiaobuteach.com is good </span>
    </div>
</body>
</html>

则好相等、超出、不足时运行效果如下图所示。

img

调整span的border-top与border-bottom的值分别是8px、9px,使border与父div的border亲密接触,则两值等于上下L值。

验算。Arial的bounds内容高度比1.12,font-size30px,则内容高度33.6取整33px,line-height即bounds高度50px,L=50-33=17px,上下各分配8px、9px。与显示结果一致。


9.8.3 line-height等于height进行垂直居中

实际项目经常使用line-height与height进行单行文本在块容器的垂直居中。实际上在bounds模型,bounds内容区在bounds高度内天然就是垂直居中,因为上下各L/2,不需要设置height属性就是垂直居中。

示例代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>小步教程</title>
    <style>
        body{
            margin: 8px 20px;
            font-family: Arial;
            font-size: 14px;
            line-height: 1.5;
        }

        .div1{
            border: 1px solid #ed7d31;
            line-height: 50px;
        }
    </style>

</head>
<body>
    <div class="div1">
        <span>xiaobuteach.com is good </span>
    </div>
</body>
</html>

运行效果

img

span的bounds高度等于line-height值50px,div1内容区高度等于bounds高度50px。上述代码,没有设置div1的height属性就实现垂直居中。

实际项目场景,通常需要先固定height值然后再调整垂直居中,所以将line-height设置相同即可。

box-sizing默认值content-box,height表示内容区高度;如果box-sizing值border-box,height表示含border高度。严格来说,需要调整值保证内容区高度与line-height值相同。

示例代码

        .div1{
            border: 10px solid #ed7d31;
            box-sizing: border-box;
            height: 50px;
            line-height: 30px;
        }

height与line-height相等实现垂直居中,本质属于父div的盒子模型与内部IFC模型的结合使用。

height与line-height的常见场景。单行文本时,当父div内容区高度等于内部单行line box高度,实现垂直居中;单行文本时,当父div内容区高度大于内部单行line box高度,父div在line box下方多出空白,效果表现为文本偏上;单行文本时,如果div内容区高度小于内部单行line box高度,超出高度部分溢出显示。多行文本时,当父div内容区高度等于内部单行line box高度,则小于多个line box高度之和,超出部分溢出显示。