三栏布局中间栏宽度自适应的实现方法

1.绝对定位法

【注】另外,height:100%是指其相对父块高度而定义的高度,也就是按照离它最近且有定义高度的父层的高度来定义高度(height:auto是指根据块内内容自动调节高度。)

<!--三个div顺序任意-->
<!doctype html>
<html>
<head>
    <title>绝对定位法</title>
    <meta charset="utf-8">
    <style>
        html,body{height:100%;margin:0;}
        #left,#right{position:absolute;background-color: green;width:200px;height:100%;top:0;}
        #left{left:0;}
        #right{right: 0;}
        #main{background-color: yellow;height:100%;margin:0 210px;}
    </style>
</head>
<body>
<div id="main"></div>
<div id="left"></div>
<div id="right"></div>
</body>
</html>

【要点】左中右三个div在html中顺序任意。左右div进行绝对定位,左div设置left:0;右div设置right:0;还要都给左右div设置top:0;因为左右div是绝对定位,脱离了正常文档流,中间的div会把左右两个div顶开到下一层,设置top:0;可以让左右div回到中间div那一层(其实是叠到中间div的上面,这时候其实中间div仍然独占一行,但由于中间div设置了margin:0 210px,所以左右div只是刚好分别叠在中间div的左右两边margin的空白处,不会挡住中间div的内容,另,中间div那样设置margin实现了宽度自适应)。

【优点】好理解易上手,不用管div在html中的顺序,爱咋咋地。

【缺点】如果中间栏含有最小宽度限制,或是含有宽度的内部元素,当浏览器宽度小到一定程度,会发生层重叠的情况。

2、左右浮动法

 

<!--#main那个div要放最后,#left和#right的div顺序任意-->
<!doctype html>
<html>
<head>
    <title>浮动法</title>
    <meta charset="utf-8">
    <style>
        html,body{margin:0;height:100%;}
        #left,#right {float: left;width: 220px;background: green;height: 100%;}        
        #right{float: right;}
        #main {margin: 0 230px;background: red;height: 100%;}
    </style>
</head>
    <body>
        <div id="left"></div>
        <div id="right"></div>
        <div id="main"></div>
    </body>
</html>

 

【要点】中间的div要放最后面,其余左右的两个div顺序任意。因为左右div都设置了float,脱离正常文档流,位置会被中间的div占领,中间的div先写,左右的后写,那左右的就会被中间的顶到下一行(这与“绝对定位法”一样,而“绝对定位法”可以不管div顺序是因为有top:0;可以让左右div与中间div同在一行)。

【优点】相对于下一种方法,要好理解一些。与第一种方法相似,已上手。代码相对简洁高效。

【缺点】中间div如果遇到clear:both;等属性会比较麻烦,要注意避免。

 3、负margin法

<!--#main的div要放最前,#left,#right的div顺序任意-->
<!doctype html>
<html>
<head>
    <title>负margin法</title>
    <meta charset="utf-8">
    <style>
        html,body{margin:0;height:100%;}
        #main{width:100%;height:100%;float:left;}
        #main #body{margin:0 210px;background:#ffe6b8;height:100%;}
        #left,#right{width:200px;height:100%;float:left;background:#a0b3d6; }
        #left{margin-left:-100%;border:2px red solid;}
        #right{margin-left:-200px;border:1px red solid;}
    </style>
</head>
<body>
<div id="main">
    <div id="body"></div>
</div>
<div id="left"></div>
<div id="right"></div>
</body>
</html>

【要点】中间div要放最前,左右div顺序任意中间div(#main)中要设置一个子div(#body),内容放#body里面。给中间(父)div#main和左右div分别设置float:left;左div设置margin-left:-100%就会靠到最左上边。右div设置margin-left:自身宽度;就会贴紧右上边。

【优点】三栏相互关联,算得上真正意义上的自适应。

【缺点】难理解,特别是margin负值,那个左div的-100%是相对于谁来定的,为什么这样就会让左div靠到最左上方。查了资料还是未解决,问题带排查……

 

还有其他方法实现三栏自适应布局,待续……

 

另在《CSS三栏布局——中间固定两边自适应宽度》一文中还有一种用CSS3,flex布局实现的中间定宽两边自适应的布局,代码及效果如下:

<!doctype html>
<html>
<head>
    <title>CSS3 Flex实现中间定宽左右自适应三列布局</title>
    <meta charset="utf-8">
    <style type="text/css">
        html,body{height:100%;}
        .grid {
          display: -webkit-flex;
          display: -moz-flex;
          display: -o-flex;
          display: -ms-flex;
          display: flex;
          height:100%;
        }
        .col {
          padding: 30px;
        }
        .fluid {
          flex: 1;
          background-color: green;
        }
        .fixed {
          width: 400px;
          background-color: blue;
        }
    </style>
</head>
<body>
    <div class="grid">
      <div class="col fluid"></div>
      <div class="col fixed"></div>
      <div class="col fluid"></div>
    </div>
</body>
</html>

 

posted on 2017-01-19 18:52  jettyhuang  阅读(255)  评论(0编辑  收藏  举报

导航