# 三栏布局

  • 圣杯布局和双飞翼布局是经典的三栏式布局,两者的布局效果基本相同,都是两边两栏宽度固定,中间宽度自适应

  • 在 HTML 结构上中间栏在最前面保证了最先渲染中间提升性能,并且兼容性良好。

# 圣杯布局

  • 使用 padding 属性,中间栏为两边腾出位置。

  • 圣杯布局会有一个问题:它存在一个最小宽度,当页面小于这个最小宽度时,布局就会乱掉。

  • 解决方法是给 body 设置一个 min-width,min-width 的值为 左侧宽度 * 2 + 右侧宽度

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>圣杯布局</title>
    <style>
        body {
            min-width: 600px;
        }

        .bd {
            padding: 0 200px 0 200px;
        }

        .main {
            float: left;
            width: 100%;
            height: 200px;
            background-color: #ddd;
        }

        .left {
            float: left;
            width: 200px;
            height: 200px;
            background-color: #da4242;
            /* 产生布局效果的属性 */
            margin-left: -100%;
            position: relative;
            left: -200px;
        }

        .right {
            float: left;
            width: 200px;
            height: 200px;
            background-color: #4ddef1;
            /* 产生布局效果的属性 */
            margin-left: -200px;
            position: relative;
            left: 200px;

        }
    </style>
</head>

<body>
    <div class="bd">
        <div class="main">
            main
        </div>
        <div class="left">
            left
        </div>
        <div class="right">
            right
        </div>
    </div>
</body>

</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

# 双飞翼布局

  • 使用 margin 属性,中间栏不变,将内容部分为两边腾出位置。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>双飞翼布局</title>
    <style>
        .main {
            float: left;
            width: 100%;
            height: 200px;
            background-color: #ddd;

        }

        .main-content {
            margin: 0 200px;
        }

        .left {
            float: left;
            width: 200px;
            height: 200px;
            background-color: #da4242;
            /* 产生布局效果的属性 */
            margin-left: -100%;
        }

        .right {
            float: left;
            width: 200px;
            height: 200px;
            background-color: #4ddef1;
            /* 产生布局效果的属性 */
            margin-left: -200px;
        }
    </style>
</head>

<body>
    <div class="bd">
        <div class="main">
            <div class="main-content">main</div>
        </div>
        <div class="left">
            left
        </div>
        <div class="right">
            right
        </div>
    </div>
</body>

</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

# BFC

# 如何创建 BFC

  • float 为 left | right

  • overflow 为 hidden | auto | scroll

  • display 为 inline-block | flex | table-cell | table-caption | inline-flex

  • position 为 absolute | fixed

  • 根元素

# BFC 布局规则

  • 内部的 box 会在垂直方向上,一个接一个的放置(即块级元素独占一行)。

  • BFC 的区域不会与 float box 重叠,利用这点可以实现自适应两栏布局。

  • 内部 box 垂直方向上的距离由 margin 决定。属于同一个 BFC 的两个相邻 box 的 margin 会发生重叠。

  • 计算 BFC 高度时,浮动元素也参与计算。

  • BFC 就是页面上一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然。

# BFC 的特性

  • BFC 会阻止垂直外边距折叠。

  • BFC 不会重叠浮动元素。

  • BFC 可以包含浮动——清除浮动。

# Flexbox 布局

# Grid 布局

上次更新时间: 2023年12月27日 17:01:16