三栏宽度自适应布局

左中右三栏布局,左右两栏宽度固定(要想不固定将宽度值改为百分值即可),中间栏宽度自适应。

方法一(圣杯布局)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>圣杯布局</title>
    <link rel="stylesheet" href="">
    <style>
        body {
            margin: 0;
            min-width: 550px;   
        }
        #header,#footer {
            width: 100%;
            height: 40px;
            background: #666;
        }
        #container {
            padding-left: 200px; 
            padding-right: 150px;
        }
        #container .column {
            position: relative;
            float: left;
            height: 200px;
        }
        #center {
            width: 100%;
            background: orange;
        }
        #left {
            width: 200px;
            right: 200px;
            margin-left: -100%;
            background: green;
        }
        #right {
            width: 150px;
            margin-right: -150px;
            background: pink;
        }
        #footer {
            clear: both;
        }
    </style>
</head>
<body>
    <div id="header"></div>    
    <div id="container">
        <div id="center" class="column">center</div>
        <div id="left" class="column">left</div>
        <div id="right" class="column">right</div>
    </div>
    <div id="footer"></div>
</body>
</html>

 

圣杯布局的原理就是当子元素处于浮动状态时,设置负margin,子元素会叠盖到兄弟元素之上。

代码分析

步骤1: 创建框架

<div id="header"></div><div id="container"></div><div id="footer"></div>

为容器container添加左内边距为左栏的宽度,右内边距为右栏的宽度

#container {
  padding-left: 200px;   /* LC width */
  padding-right: 150px;  /* RC width */
}

 布局看起来会是这个样子:

 

 

步骤2: 添加列

    <div id="header"></div>    
    <div id="container">
        <div id="center" class="column">center</div>
        <div id="left" class="column">left</div>
        <div id="right" class="column">right</div>
    </div>
    <div id="footer"></div>

 接下来添加宽度和浮动,且为footer清除浮动

#container .column {
  float: left;
}
#center {
  width: 100%;
}
#left {
  width: 200px;  /* LC width */
}
#right {
  width: 150px;  /* RC width */
}
#footer {
  clear: both;
}

 center宽100%是指容器container的宽度(不包括padding),三列现在按顺序排队,因为center占用100%的可用空间,left和right只能被换到下一行。效果如下:

步骤3: 将左栏left推进center左侧区域

#left {
  width: 200px;        /* LC width */
  margin-left: -100%;  
}

把left拉到最容器最左边,使用margin-left:-100%

#container .columns {
  float: left;
  position: relative;
}
#left {
  width: 200px;        /* LC width */
  margin-left: -100%;  
  right: 200px;        /* LC width */
}

  将left推到容器左内边距区域,使用相对定位

步骤4: 将右栏right推进center右侧区域

#right {
  width: 150px;          /* RC width */
  margin-right: -150px;  /* RC width */
}

 也可以利用步骤3的方法

#right {
    width: 150px;
    margin-left: -150px;
    right: -150px;
}

 

步骤5:设计优化

如果调整浏览器窗口的大小使center小于left,在标准浏览器中布局会被破坏。在body上设置一个min-width来解决这个问题。

最小宽度为 2倍的left宽度+right宽度

body {
  min-width: 550px;  /* 2x LC width + RC width */
}

利用padding和margin正负相消实现多列等高(padding补偿法)

首先把列的padding-bottom设为一个足够大的值,再把列的margin-bottom设一个与前面的padding-bottom的正值相抵消的负值,父容器设置超出隐藏,这样子父容器的高度就还是它里面的列没有设定padding-bottom时的高度,当它里面的任一列高度增加了,则父容器的高度被撑到它里面最高那列的高度,其他比这列矮的列则会用它们的padding-bottom来补偿这部分高度差。因为背景是可以用在padding占用的空间里的,而且边框也是跟随padding变化的,所以就成功的完成了一个障眼法。

#container {
  overflow: hidden;
}
#container .column {
  padding-bottom: 20010px;  /* X + padding-bottom */
  margin-bottom: -20000px;  /* X */
}
#footer {
  position: relative;
}

方法二:(box-sizing法)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>圣杯布局</title>
    <link rel="stylesheet" href="">
    <style>
        .content {
            width: 80%;
            margin: 0 auto;
        }
        .main {
            width: 100%;
            height: 200px;
            float: left;
            background: orange;
            box-sizing: border-box;
            padding-left: 200px;
            padding-right: 200px;
        }
        .left {
            width: 200px;
            height: 200px;
            background: red;
            float: left;
            margin-left: -100%;
        }
        .right {
            width: 200px;
            height: 200px;
            background: blue;
            float: left;
            margin-left: -200px;
        }
    </style>
</head>
<body>
    <div class="content">
        <div class="main">Main</div>
        <div class="left"></div>
        <div class="right"></div>
    </div>
</body>
</html>

 

方法三(双飞翼布局

增加一个div,不用相对布局,只用到了浮动和负边距,这就是我们所说的双飞翼布局。

去掉了左右栏的相对定位,去掉包裹层padding,以中间栏新增div的margin代替

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>双飞翼布局</title>
    <link rel="stylesheet" href="">
    <style>
        body {
            margin: 0;
        }
        .header, .footer {
            width: 100%;
            height: 40px;
            background: #666;
        }
        .container {
            padding-left: 200px;
            padding-right: 150px;
        }
        .left {
            width: 200px;
            float: left;
            margin-left: -100%;
            background: green;
            height: 200px;
        }
        .center {
            width: 100%;
            float: left;
            height: 200px;
        }
        .right {
            width: 150px;
            float: left;
            margin-left: -150px;
            background: pink;
            height: 200px;
        }
        .inner {
            margin-left: 200px;
            margin-right: 150px;
            background: orange;
        }
        .footer {
            clear: both;
        }
    </style>
</head>
<body>
    <div class="header"></div>
    <div class="container">
        <div class="center">
            <div class="inner">Center</div>
        </div>
        <div class="left">Left</div>
        <div class="right">Right</div>
    </div>
    <div class="footer"></div>
</body>
</html> 

 

方法四(浮动法)

左右两列分别左浮动和右浮动并给一个固定宽度,中间不浮动,也不设定宽度。

中间那列需要把左右两个外边距分别设为左右两列的宽度,center要放到left和right的后面

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>宽度自适应布局</title>
    <link rel="stylesheet" href="">
    <style>
        body {
            margin: 0;
        }
        .left {
            width: 200px;
            height: 200px;
            float: left;
            background: pink;
        }
        .center {
            background: #ccc;
            height: 200px;
            margin-left: 200px;
            margin-right: 100px;
        }
        .right {
            width: 100px;
            height: 200px;
            background: orange;
            float: right;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="left">Left</div>
        <div class="right">Right</div>
        <div class="center">Center</div>
    </div>
</body>
</html>

 方法五(绝对定位法)

实现要点:左栏left、右栏right设为绝对定位,分别设置width。左栏设置left和top,右栏设置right和top。自适应的中间栏设置为相对定位,设置margin:0 200px。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title></title>
    <link rel="stylesheet" href="">
    <style>
        body {
            margin: 0;
        }
        .header {
            height: 42px;
            background: #666;
        }
        .left {
            width: 200px;
            height: 200px;
            background: orange;
            position: absolute;
            top: 42px;
            left: 0;
        }
        .center {
            height: 200px;
            background: #ddd;
            margin-right: 200px;
            margin-left: 200px;
            position: relative;
            top: 0;
        }
        .right {
            width: 200px;
            height: 200px;
            background: red;
            position: absolute;
            top: 42px;
            right: 0;
        }
    </style>
</head>
<body>
    <div class="header"></div>
    <div class="container">
        <div class="center">Center</div>
        <div class="left">Left</div>
        <div class="right">Right</div>
    </div>
</body>
</html>

 方法六(flex布局)

容器displsy:flex; left,right栏定宽,center栏flex:1;自适应

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>js</title>
    <link rel="stylesheet" href="">
    <style>
        body {
            margin: 0;
        }
        header, footer {
            width: 100%;
            height: 40px;
            background: #eee;
        }
        .container {
            display: flex;
        }
        .center {
            flex: 1;
            background: rgb(33,111,11);
        }
        .left, .right {
            flex: 0 12em;
        }
        .right {
            background: rgb(111,22,33);
        }
        .left {
            background: rgb(11,11,123);
        }
    </style>
</head>
<body>
    <header>Header</header>
    <div class="container">
        <div class="left">Left</div>
        <div class="center">Center</div>
        <div class="right">Right</div>
    </div>
    <footer>Footer</footer>
</body>
</html>

 

 

参考:

http://alistapart.com/article/holygrail

http://www.cnblogs.com/2050/archive/2012/07/30/2614852.html

http://www.cnblogs.com/ljchow/archive/2010/07/27/1785632.html

 

posted @ 2017-01-30 23:19  loveyunk+  阅读(468)  评论(0编辑  收藏  举报