前端两种布局(双飞翼和圣杯)

1,954 阅读5分钟

 前言:说到这两种布局大家首先想到的就是,三个盒子要让他们并列排在一行,其中中间的盒子自适应。说道这里大家心里肯定会有想象到的事物。我就根据圣杯布局想到的就是奖杯,大家看过奖杯,会发现奖杯中间的躯干很大,两边各自都有一个耳朵。是不是和人的头也很像。今天我重新看了一下这两种布局,并且对比一下他们的不同之处。

1. 圣杯布局


大家都知道圣杯布局就是三个盒子并列的问题,下面首先来写三个盒子

  <div class="box">        <div class="main">main</div>        <div class="left">left</div>        <div class="right">right</div>    </div>


.main,.left,.right{                   min-height: 100px;        }        .main{            width: 100%;            background-color: red;        }        .left{            background-color: yellow;            width: 300px;                   }        .right{            background-color: blue;            width: 200px;                   }

大家都可以看到盒子是用块级元素div定义的,这样久会形成三个盒子各自独占一行。



看到这里对css有点基础的朋友,就会想到display:flex ,弹性布局是可以让盒子在一盒展示,但是没有办法让左边的固定在左边,右边的固定在右边。下面还是看看在最外层容器加上display:flex会产生什么效果。

 .box{        display: flex;        }


大家会发现盒子是按照结构写的先后顺序排列的,所以display:flex还是没有办法达到理想的效果。

下面我们来看看怎样让left在左边,right在main的右边


首先我们在最大盒子在左右两边留出一定的内边距,这个内边就是待会放left和right盒子的宽度

.box{                padding: 0 200px 0 300px;        }


看到左边和右边各留出内边距,下面我们就想办法让盒子去占据Main左右两边的空白处。首先我们会想到浮动,左浮动,我们都知道浮动会脱离文档流。

   .main,.left,.right{            float: left;            min-height: 100px;        }

我们会发现好像只有right上到left的右边去了。


我们怎样才能让第二行跑到第一行去呢?这个时候我们就会想到定位,还是相对定位,因为相对定位,相对定位是相对于元素在文档中的初始位置

 .main,.left,.right{            position: relative;            float: left;            min-height: 100px;        }


会发现还是没有任何变化。这个时候我们会想到还有maigin-left

 .box{                padding: 0 200px 0 300px;        }        .main,.left,.right{            position: relative;            float: left;            min-height: 100px;        }        .main{            width: 100%;            background-color: red;        }        .left{            background-color: yellow;            width: 300px;             margin-left: -100%;                 }        .right{            background-color: blue;            width: 200px;            margin-left: -200px;          }


我们发现他们都在一行了,但是细心地你们肯定发现main这个单词不见了,这是因为被left遮住了,除了main之外,还会发现左边和右边都有空袭,这个时候我们就可以想到把他们往左边和右边各挪多少,其实在就是自己各自的宽度也就是最大容器的内边距的距离

  .box{                padding: 0 200px 0 300px;        }        .main,.left,.right{            position: relative;            float: left;            min-height: 100px;        }        .main{            width: 100%;            background-color: red;        }        .left{            background-color: yellow;            width: 300px;             margin-left: -100%;            left: -300px;         }        .right{            background-color: blue;            width: 200px;            margin-left: -200px;            right: -200px;         }


这就是圣杯布局,中间内容自适应,两边各自固定。下面上完整的代码

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>圣杯布局</title>    <style>        .box{                padding: 0 200px 0 300px;        }        .main,.left,.right{            position: relative;            float: left;            min-height: 100px;        }        .main{            width: 100%;            background-color: red;        }        .left{            background-color: yellow;            width: 300px;             margin-left: -100%;            left: -300px;         }        .right{            background-color: blue;            width: 200px;            margin-left: -200px;            right: -200px;         }    </style></head><body>    <div class="box">        <div class="main">main</div>        <div class="left">left</div>        <div class="right">right</div>    </div></body></html>


2. 双飞翼布局

<div id="container">
    <div id="main" class="col">
        <div id="main-wrap"></div>
    </div>
    <div id="left" class="col"></div>
    <div id="right" class="col"></div>
</div>

从结构就可以看出,在main里面比圣杯多了一个盒子,这是为了解决后面内容被遮盖的情况。

.col {float: left;}

#main {width: 100%;height: 400px;background-color: yellow;}

#main-wrap {margin: 0 190px 0 190px;}

#left {width: 190px;height: 400px;margin-left: -100%;background-color: #0000FF;}

#right {width: 190px;height: 400px;margin-left: -190px;background-color: #FF0000;}

对比发现,圣杯布局是在最外面的容器设置内边距,而双飞翼布局是在main里面的盒子设置外边距,还有可以发现对三个盒子没有定位了,更没有左浮动。

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>双飞翼布局</title>    <style>        body {            min-width: 550px;        }        .col {            float: left;        }        #main {            width: 100%;            height: 400px;            background-color: yellow;        }        #main-wrap {            margin: 0 190px 0 190px;        }        #left {            width: 190px;            height: 400px;            margin-left: -100%;            background-color: #0000FF;        }        #right {            width: 190px;            height: 400px;            margin-left: -190px;            background-color: #FF0000;        }    </style></head><body>    <div id="container">        <div id="main" class="col">            <div id="main-wrap"></div>        </div>        <div id="left" class="col"></div>        <div id="right" class="col"></div>    </div></body></html>


总结:对比于两种布局我们可以发现,双飞翼布局比圣杯布局相对简单点,还有双飞翼布局的兼容性更好