实现三栏水平布局,其中left、right分别位于左右两侧,left宽度为200px,right宽度为300px,main处在中间,宽度自适应。

第一种方法:弹性布局

<!DOCTYPE html>
<html>
<head>
    <title>圣杯布局</title>
    <style type="text/css">
        .container{
            padding: 0;
            margin: 0;
            display:flex;
            min-height: 300px;
            /*flex-direction: column;         */
        }
        .main{
            flex-grow: 1;/*数字,规定项目将相对于其他灵活的项目进行扩展的量*/
            background: purple;
        }
        .left{
            background-color: green;
            order:-1;/*设置或检索弹性盒模型对象的子元素出现的顺序*/
            width: 200px;
        }
        .right{
            background-color:green;
            width:300px;
        }


    </style>
</head>
<body>
   <div class="container">
       <div class="left">left</div>
       <div class="main">main</div>
       <div class="right">right</div>
   </div> 
</body>
</html>

第二种方法:圣杯布局

 <!DOCTYPE html>
 <html>
 <head>
     <title>圣杯布局</title>
     <style type="text/css">
         *{
             margin: 0;
             padding:0;
         }
         body{
             background-color: #FFFFE0;
         }
         
         .main,.left,.right{
             float: left;/*main占了100%,宽度不够left,right被挤到下一行。*/
             min-height: 200px;
         }
         .main{
             width: 100%;
             background-color: purple;
         }
         .left{
             position: relative;
             left:-200px; 
             width: 200px;
             background-color: green;
             margin-left: -100%;
         }
         .right{
             position: relative;
             right: 200px;
             width: 200px;
             background-color: red;
             margin-left: -200px;
         }
         .container{
             padding:0 200px;/*给左右让空间,但left、right也跟着过去了。

*/
         }

     </style>
 </head>
 <body>
    <!--包裹middle、left、right的container容器-->
    <div class="container">
        <div class="main">
            我是中间区域<br>
        </div>
        <div class="left">我是左侧</div>
        <div class="right">我是右侧</div>
    </div>
    

 </body>
 </html>

圣杯布局的思路:

1. container包裹的:header、footer加:width:100%,height:30px。



2. container包裹的:中间区域(middle)宽度设置100%;middle,left均给200px;middle,left,right均左浮动,此时middle占了100%,宽度不够left,right被挤到下一行。



3. left设置margin-left:-100%,right设置margin-left:-200px;此时left区域上去了,并靠左,right上去了,靠右;但是left遮挡住了middle的左侧部分。



4. 设置container的padding:200px,让左右让出200px区域给left和right,但left、right也跟着过去了。



5. 给left和right加relative相对定位,然后left区域:left:-200px;然后right区域:right:200px;为了效果给middle、left、right都价格高度,中间正常显示,圣杯布局完成。



备注:为了观看清晰,body加了一个浅黄色背景,header和footer加了文字居中等样式。

处理等高问题:当左侧内容很多时,header、right区域会不与left等高,如下图:



利用magrin为负处理这个问题,给left、right、middle都加上padding-bottom:10000px,同时设置margin-bottom:10000px,将父容器container边缘推上去,同时父容器container设置overflow:hidden,达到如下效果:

 第三种:双飞翼布局:

 <!DOCTYPE html>
 <html>
 <head>
     <title></title>
     <style type="text/css">
         *{
             margin: 0;
             padding: 0;
         }
          .first{
            float: left;
            width: 200px;
            height: 200px;
            background: green;
        }
        .second{
            float: left;
            width: 200px;
            height: 200px;
            background: red;
            margin-left: 70%;
        }
     </style>
 </head>
 <body>
    <div class="first">宽为200,无margin</div>
    <div class="second">宽为200,margin-left为20%;</div>
 </body>
 </html>

双飞翼布局思路(前三步与圣杯相同)

1. header、footer宽度100%,同圣杯布局第一步;

2.left、right、middle三个区域全左浮动,同圣杯布局第二步;

3.left、right设置margin-left,让左靠左,右靠右,此时left、right遮挡了middle区域同圣杯第三步;

4.将被middle包裹的inside设置margin:0 200px; 给左右留出空间;



5.给左侧设置:margin-left: -100%; 给右侧设置:margin-left: -200px; 让左靠左,右靠右,完成双飞翼布局。

三、圣杯和双飞翼布局的区别

其实简单来说二者的区别就在:解决中间区域被遮挡问题的方式上。

在最开始用容器包裹了:左、中、右,随后通过设置包裹容器container的padding,让中间区域左右留白,也就是说圣杯布局的左、中、右是完全独立的,他们之间是有缝隙的(如果缝隙可见的话),例如我们接下来:

1. 给container加一个蓝色背景色,并且设置高一些的高度。

2. 去左、中、右的等高布局,给middle再加一行文字。

则从在空间立体视图上,左、中、右位置如下图:

可以看出,左、中、右是独立的三个区域,都处于一个层级,都由container这个容器(蓝色)承接,左右两侧是靠container的padding留出来的。

2.双飞翼解决被遮盖的方式:

双飞翼采用只处理中间解决遮盖问题,先给中间的包裹器middle加margin,让出左右空间,然后给left、right设置margin为负,把自己推上去,空间侧视图如下:

 

可以看出,左、中、右是独立的三个区域,中间区域属于最上面的层级(inner那个div),左右两侧和middle容器一个层级

各个布局的优缺点:

 

 


原文链接:https://blog.csdn.net/zhangtianyu5177/article/details/80889429

posted on 2019-10-10 18:15  嗯嗯呢  阅读(568)  评论(0编辑  收藏  举报