Skip to content

常规流

盒模型:规定单个盒子的规则

视觉格式化模型(布局规则):页面中的多个盒子排列规则

视觉格式化模型,大体上将页面中盒子的排列分为三种方式:

  1. 常规流
  2. 浮动
  3. 定位

常规流布局

常规流、文档流、普通文档流、常规文档流

所有元素,默认情况下,都属于常规流布局

总体规则:块盒独占一行,行盒水平依次排列

包含块(containing block):每个盒子都有它的包含块,包含块决定了盒子的排列区域。

绝大部分情况下:盒子的包含块,为其父元素的内容盒

块盒

每个块盒的总宽度,必须刚好等于包含块的宽度(content-box)

宽度的默认值是auto

margin的取值也可以是auto,默认值0

auto:将剩余空间吸收掉

width吸收能力强于margin

若宽度、边框、内边距、外边距计算后,仍然有剩余空间,该剩余空间被margin-right全部吸收

在常规流中,块盒在其包含快中居中,可以定宽、然后左右margin设置为auto。

每个块盒垂直方向上的auto值

height:auto, 适应内容的高度

margin:auto, 表示0

百分比取值

padding、宽、margin可以取值为百分比

以上的所有百分比相对于包含块的宽度。

高度的百分比:

1). 包含块的高度是否取决于子元素的高度,设置百分比无效 2). 包含块的高度不取决于子元素的高度,百分比相对于父元素高度

上下外边距的合并

两个常规流块盒,上下外边距相邻,会进行合并。

两个外边距取最大值。

合并包括相邻和父子元素

去除合并的原理就是让两个盒子不相邻即可:

  1. 去除父子塌陷:让父亲和子元素隔开就行:border padding(建议) overflow

最佳实践

实现一个盒子内部元素超出盒子,类似新闻header的效果。

html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            margin: 0;
            padding: 0;
            background-color: #eee;
        }

        .container{
            width: 1200px;
            padding: 20px 0;
            background-color: #fff;
            margin: 0 auto;
        }

        .title{
            height: 50px;
            line-height: 50px;
            text-align: center;
            background-color: skyblue;
            
            /* 实现超出父盒子 */
            width: auto;/*可省略,默认值*/
            margin: 0 -20px;
        }

        /*原理: 左右margin设置-20,相当于盒子变大了,而width:auto吸收剩余空间,所以title的宽度会变大*/
    </style>
</head>
<body>
        <div class="container">
            <div class="title">我是title</div>
        </div>
</body>
</html>

MIT License