圣杯布局和双飞翼布局

圣杯布局&双飞翼布局

我们能够发现,其实圣杯布局和双飞翼布局非常相像。因为圣杯布局是阿里巴巴的玉伯(Sea.js的创始人)根据圣杯布局来改造的。用于两边的子面板固定,中间区域自适应的布局。

圣杯布局存在一个缺点:就是当我们的 .middle 设置的宽度比两边小的时候,布局就会乱掉。双飞翼在中间的区域添加了一个子节点,给父节点添加margin属性来左右面板留出空间。用margin来撑开空间。

所以综合起来,双飞翼布局和圣杯布局的区别在于:

  • 双飞翼布局给主面板添加了一个父标签用来通过margin给子面板腾出空间。
  • 双飞翼布局不用设置相对布局,以及对应的left和right值。

当然,基于float布局的圣杯布局和双飞翼布局都有自己的缺陷,当前的趋势是flex和grid布局,代码更少更加灵活。圣杯布局对于我们对CSS的理解和布局的理解还是有帮助的。

圣杯布局和双飞翼布局的源码

圣杯布局的源码

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>圣杯布局</title>
 6     <style>
 7         body,header,div,h4,footer{
 8             margin: 0;
 9             padding: 0;
10             text-align: center;
11         }
12         header{
13             width: 100%;
14             height: 50px;
15             background-color: red;
16         }
17         .container{
18             height: 200px;
19             overflow: hidden;
20             padding: 0 200px;    /*利用和下面的.left{position: relative;left:-200px;}
21             以及.right{position: relative;right:-200px;}来避免中间的内容区被缩放时的左右div给覆盖*/
22         }
23         .middle{
24             width: 100%;
25             height: 200px;
26             background-color: #ECECEC;
27             float: left;
28         }
29         .left{
30             width: 200px;
31             height: 200px;
32             position: relative;
33             left: -200px;
34             margin-left: -100%;    /*紧贴左边*/
35             background-color: blue;
36             float: left;
37         }
38         .right{
39             width: 200px;
40             height: 200px;
41             position: relative;
42             right: -200px;
43             margin-left: -200px;    /*紧贴右边*/
44             background-color: yellow;
45             float: left;
46         }
47         footer{
48             width: 100%;
49             height: 50px;
50             background-color: black;
51         }
52     </style>
53 </head>
54 <body>
55     <header><h4>内容区</h4></header>
56     <div class="container">
57         <div class="middle"><h4>中间弹性区</h4></div>
58         <div class="left"><h4>左边栏</h4></div>
59         <div class="right"><h4>右边栏</h4></div>
60     </div>
61     <footer><h4>footer内容区</h4></footer>
62 </body>
63 </html>

双飞翼布局的源码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>双飞翼布局</title>
    <style>
        body,header,div,h4,footer{
            margin: 0;
            padding: 0;
            text-align: center;
        }
        header{
            width: 100%;
            height: 50px;
            background-color: red;
        }
        .container{
            height: 200px;
            overflow: hidden;
        }
        .middle{
            width: 100%;
            height: 200px;
            background-color: #ECECEC;
            float: left;
        }
        .in{
            padding: 0 200px 0 200px;
        }
        .left{
            width: 200px;
            height: 200px;
            margin-left: -100%;    /*紧贴左边*/
            background-color: blue;
            float: left;
        }
        .right{
            width: 200px;
            height: 200px;
            margin-left: -200px;    /*紧贴右边*/
            background-color: yellow;
            float: left;
        }
        footer{
            width: 100%;
            height: 50px;
            background-color: black;
        }
    </style>
</head>
<body>
    <header><h4>内容区</h4></header>
    <div class="container">
        <div class="middle"><div class="in"><h4>中间弹性区</h4></div></div>
        <div class="left"><h4>左边栏</h4></div>
        <div class="right"><h4>右边栏</h4></div>
    </div>
    <footer><h4>footer内容区</h4></footer>
</body>
</html>