CSS三栏布局的四种方法

无笑5570 8年前
   <h2>前言</h2>    <p>总括:不管是三栏布局还是两栏布局都是我们在平时项目里经常使用的,也许你不知道什么事三栏布局什么是两栏布局但实际已经在用,或许你知道三栏布局的一种或两种方法,但实际操作中也只会依赖那某一种方法,本文具体的介绍了三栏布局的四种方法,并介绍了它的使用场景。</p>    <h2>正文</h2>    <p>所谓三栏布局就是指页面分为左中右三部分然后对中间一部分做自适应的一种布局方式。</p>    <h3>1.绝对定位法</h3>    <p>HTML代码如下:</p>    <pre>  <code class="language-css"><div class="left">Left</div>  <div class="main">Main</div>  <div class="right">Right</div></code></pre>    <p>CSS代码如下:</p>    <pre>  <code class="language-css">//简单的进行CSS reset  body,html{      height:100%;      padding: 0px;      margin:0px;  }  //左右绝对定位  .left,.right{      position: absolute;      top:0px;      background: red;      height:100%;  }  .left{      left:0;      width:100px;  }  .right{      right:0px;      width:200px;  }  //中间使用margin空出左右元素所占据的空间  .main{      margin:0px 100px 200px 0px;      height:100%;      background: blue;  }</code></pre>    <p>该方法有个明显的缺点,就是如果中间栏含有最小宽度限制,或是含有宽度的内部元素,当浏览器宽度小到一定程度,会发生层重叠的情况。</p>    <h3>2. 圣杯布局</h3>    <p>HTML代码如下:</p>    <pre>  <code class="language-css">//注意元素次序  <div class="main">Main</div>  <div class="left">Left</div>  <div class="right">Right</div></code></pre>    <p>CSS代码如下:</p>    <pre>  <code class="language-css">//习惯性的CSS reset  body,html{      height:100%;      padding: 0;      margin: 0  }  //父元素body空出左右栏位  body {      padding-left: 100px;      padding-right: 200px;  }  //左边元素更改  .left {      background: red;      width: 100px;      float: left;      margin-left: -100%;      position: relative;      left: -100px;      height: 100%;  }  //中间部分  .main {      background: blue;      width: 100%;      height: 100%;      float: left;  }  //右边元素定义  .right {      background: red;      width: 200px;      height: 100%;      float: left;      margin-left: -200px;      position: relative;      right: -200px;  }</code></pre>    <p>相关解释如下:</p>    <ul>     <li>(1)中间部分需要根据浏览器宽度的变化而变化,所以要用100%,这里设左中右向左浮动,因为中间100%,左层和右层根本没有位置上去</li>     <li>(2)把左层margin负100后,发现left上去了,因为负到出窗口没位置了,只能往上挪</li>     <li>(3)按第二步这个方法,可以得出它只要挪动窗口宽度那么宽就能到最左边了,利用负边距,把左右栏定位</li>     <li>(4)但由于左右栏遮挡住了中间部分,于是采用相对定位方法,各自相对于自己把自己挪出去,得到最终结果</li>    </ul>    <h3>3. 双飞翼布局</h3>    <p>HTML代码如下:</p>    <pre>  <code class="language-css"><div class="main">      <div class="inner">          Main      </div>  </div>  <div class="left">Left</div>  <div class="right">Right</div></code></pre>    <p>CSS代码如下:</p>    <pre>  <code class="language-css">//CSS reset  body,html {      height:100%;      padding: 0;      margin: 0  }  body {      /*padding-left:100px;*/      /*padding-right:200px;*/  }  .left {      background: red;      width: 100px;      float: left;      margin-left: -100%;      height: 100%;      /*position: relative;*/      /*left:-100px;*/  }  .main {      background: blue;      width: 100%;      float: left;      height: 100%;  }  .right {      background: red;      width: 200px;      float: left;      margin-left: -200px;      height: 100%;      /*position:relative;*/      /*right:-200px;*/  }  //新增inner元素  .inner {      margin-left: 100px;      margin-right: 200px;  }</code></pre>    <p>圣杯布局实际看起来是复杂的后期维护性也不是很高,在淘宝UED的探讨下,出来了一种新的布局方式就是双飞翼布局,代码如上。增加多一个div就可以不用相对布局了,只用到了浮动和负边距。和圣杯布局差异的地方已经被注释。</p>    <h3>4. 浮动</h3>    <p>HTML代码如下:</p>    <pre>  <code class="language-css">//注意元素次序  <div class="left">Left</div>  <div class="right">Right</div>  <div class="main">Main</div></code></pre>    <p>CSS代码如下:</p>    <pre>  <code class="language-css">//CSS reset  body,html {      height:100%;      padding: 0;      margin: 0  }  //左栏左浮动  .left {      background: red;      width: 100px;      float: left;      height: 100%;  }  //中间自适应  .main {      background: blue;      height: 100%;      margin:0px 100px 200px 0px;  }  //右栏右浮动  .right {      background: red;      width: 200px;      float: right;      height: 100%;  }</code></pre>    <p>这种方式代码足够简洁与高效,也容易理解</p>    <h2>后记</h2>    <p>四种方法其实只有圣杯布局和双飞翼布局较难理解,但实际上理解了圣杯布局,双飞翼布局自然就理解了。</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/434eccfdae90</p>    <p> </p>