三列布局

中间三列布局想要的效果如图

上、下为头部和底部,中间分成3列,左右两列为固定宽度中间的宽度随着浏览器窗口变化而变化

按下面三个步骤顺序写这个布局,最后会有一个完整的代码

1. 基本的布局结构(html代码)

要把middle部分调整到left上,因为一般middle比较重要,所以让它先进行渲染加载

<header>头部</header>
<article>
    <div class="middle">中间</div>
    <div class="left">左边</div>
    <div class="right">右边</div>
</article>
<footer>底部</footer>

2. 设置尺寸、背景颜色

3. 调整布局位置:4种不同的方案

关键点:

  • 为了让left可以回到middle的左侧,需要让它们脱离文档流,以便重新布局
  • 为了让几个div不会发生垂直方向的重叠,需要利用margin、padding等来预留空间
  • 当然,用flex弹性盒子就不用考虑上面问题~
实现方法 涉及到的重要属性设置
圣杯布局 float: left postion: relative right/left: -50px 负margin
双飞翼布局 float: left

middle放在一个div中,

padding+box-sizing或margin

   
用absolute实现 position: absolute

top, left, right: 0;

正margin值   
用flex实现 display: flex order: 2/1/3    

源码

<!DOCTYPE html>
<html>
<head>
    <title>test</title>
    <meta charset="utf-8">
    <script src="./custom.modernizr.js"></script>
    <style type="text/css">
    *{
        margin: 0;
        padding: 0;
    }
    #grail, #wing, #flex, #absolute{
        width: 100%;
        height: 300px;
    }
    #grail header{
        width: 100%;
        height: 20%;
        background-color: grey;
    }
    #grail    article{
        height: 60%;
    /*这个不用设置宽度*/
        padding: 0 50px 0 50px;
        position: relative;
    }
    #grail    article .middle{
        height: 100%;
        width: 100%;            
        background-color: green;
        float: left;

    }
    #grail    article .left{
        width: 50px;
        height: 80%;
        background-color: red;
        float: left;
        margin-left: -100%;
        position: relative;
        left: -50px;
    }
    #grail    article .right{
        width: 50px;
        height: 80%;
        background-color: blue;
        float: left;
        margin-left: -50px;
        position: relative;
        right: -50px;
    }
    #grail    footer{
        width: 100%;
        height: 20%;
        background-color: gray;
    }
    #wing header{
        width: 100%;
        height: 20%;
        background-color: gray;
    }    
    #wing article{
        width: 100%;
        height: 60%;
    }    
    #wing .middle0{
        height: 100%;
        width: 100%;
        float: left;    
        /*用padding的方法给两侧留出位置
        需要设置box-sizing,因为默认设置的width是内容,padding会让盒子向外扩展,并不能满足要求*/            
        /*padding: 0 50px 0 50px;
        box-sizing: border-box;*/
    }
    #wing .middle0 .middle{
        height: 100%;
        background-color: green;
        /*用margin的方法给两侧留出空间*/
        margin: 0 50px 0 50px;
    }
    #wing .left{
        width: 50px;
        height: 80%;
        background-color: red;
        float: left;
        margin-left: -100%;
    }
    #wing .right{
        width: 50px;
        height: 80%;
        background-color: blue;
        float: left;
        margin-left: -50px;
    }    
    #wing footer{
        width: 100%;
        height: 20%;
        background-color: gray;
    }
    #flex header{
        width: 100%;
        height: 20%;
        background-color: gray;
    }    
    #flex article{
        display: flex;
        width: 100%;
        height: 60%;
    }    
    #flex .middle{
        order: 2;/*设置子元素的排列位置*/
        background-color: green;
        width: 100%;
    }
    #flex .left{
        order: 1;
        background-color: red;
        width: 50px;/*不设宽度,由内容撑开*/
        /*不设置高度默认为充满整个父元素高*/
        height: 80%;
    }
    #flex .right{
        order: 3;
        background-color: blue;
        width: 50px;
        height: 80%;
    }
    #flex footer{
        width: 100%;
        height: 20%;
        background-color: gray;
    }
    #absolute header{
        width: 100%;
        height: 20%;
        background-color: gray;
    }    
    #absolute article{
        width: 100%;
        height: 60%;
        position: relative;
    }    
    #absolute .middle{
        background-color: green;
        /* 100%;*/
        height: 100%;
        /*两侧 position 设置为absolut,脱离文档流*/
        /*当前元素的两侧就变成了article边框*/
        margin-left: 50px;
        margin-right: 50px;
    }
    #absolute .left{
        background-color: red;
        width: 50px;/*不设宽度,由内容撑开*/
        /*不设置高度默认为充满整个父元素高*/
        height: 80%;
        position: absolute;
        top: 0;
        left: 0;
    }
    #absolute .right{
        background-color: blue;
        width: 50px;
        height: 80%;
        position: absolute;
        right: 0;
        top: 0;
    }
    #absolute footer{
        width: 100%;
        height: 20%;
        background-color: gray;
    }
    </style>
</head>
<body>
<div id="grail">
<header>圣杯布局</header>
<article>
    <div class="middle">中间</div>
    <div class="left">左边</div>
    <div class="right">右边</div>
</article>
<footer>底部</footer>
</div>
<div id="wing">
<header>双飞翼布局</header>
<article>
    <div class="middle0">
    <div class="middle">中间</div></div>
    <div class="left">左边</div>
    <div class="right">右边</div>
</article>
<footer>底部</footer>
</div>
<div id="flex">
<header>用flex来实现三列布局</header>
<article>
    <div class="middle">中间</div>
    <div class="left">左边</div>
    <div class="right">右边</div>
</article>
<footer>底部</footer>
</div>
<div id="absolute">
<header>用absolute来实现三列布局</header>
<article>
    <div class="middle">中间</div>
    <div class="left">左边</div>
    <div class="right">右边</div>
</article>
<footer>底部</footer>
</div>
</body>
</html>
View Code

遇到两个ie的问题

1. 怎么模拟低版本的ie

    F12—访真—文档模式—10、9、8...代表了版本号

2. 解决低版本ie中不能使用h5标签,如header、article、footer等

在script中引用一个js,链接地址:http://haiqiancun.com/file//demo/custom.modernizr.js

flex布局在低版本ie中不可用~

参考

网上有不少圣杯布局、双飞翼布局相关的内容。后面两个应该也有,没有认真找过,写前两个的时候自己再考虑出来的

原文地址:https://www.cnblogs.com/coolqiyu/p/7262312.html