【CSS佈局】三欄式佈局,左右定寬,中間內容區域自適應

實現三欄式佈局的經典方法有:雙飛翼佈局、聖盃佈局,兩者都是利用了父margin來達到想要的效果,同時也是遵循重要的內容優先加載的原則(先加載center),只是在實現上稍微有些不同,同時利用CSS3的flex佈局也可以實現以上效果。下面介紹下具體的實現方法:
(1)聖盃佈局
原理:三個部分均被一個div元素進行包裹,同時優先加載center,利用float使元素進行浮動,其中的主要點就是利用父級div的padding+子元素的負的margin以及定位來實現效果的

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>聖盃佈局</title>
    <style type="text/css">
        *{margin: 0;padding: 0;}
        body{min-width: 700px;}/*防止*/
        .header,
        .footer{
            border: 1px solid #333;
            background: #aaa;
            text-align: center;
        }
        .left,
        .middle,
        .right{
            position: relative;/*聖盃佈局中主要利用的是定位加margin*/
            float: left;
            min-height: 130px;
        }
        .container{
            padding:0 220px 0 200px;
            overflow: hidden;/*BFC,float的元素的高度也可以將元素的高度撐起來*/
        }
        .left{
            margin-left: -100%;/*利用margin將元素提升到上一行中*/
            left: -200px;/*利用Left定位將元素當知道指定的位置*/
            width: 200px;
            background: red;
        }
        .right{
              margin-left: -220px;
              right: -220px;
              width: 220px;
              background: green;
          }
        .middle{
            width: 100%;
            background: blue;
            word-break: break-all;

        }
        .footer{
            clear: both;
        }
    </style>
</head>
<body>
<div class="header">
    <h4>header</h4>
</div>
<div class="container"><!--三個div子標籤全都包裹在該容器中-->
    <div class="middle">
        <h4>middle</h4>
        <p>HHHHHHHHHHHHHHHHHHHHHH
            hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
            HHHHHHHHHHHHHHHHHHHHHH
            hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
        </p>
    </div>
    <div class="left">
        <h4>left</h4>
        <p>oooooooooooooo
            0000000000000000
            00000000000000000
            ooooooooooooooo
            ooooooooooooooo
            000000000000000</p>
    </div>
    <div class="right">
        <h4>right</h4>
        <p>BBBBBBBBBBBBBB
            888888888888888888
            BBBBBBBBBBBBBBBBBB
            88888888888888888888</p>
    </div>
</div>
<div class="footer">
    <h4>footer</h4>
</div>
</body>
</html>

(2)雙飛翼佈局
原理:首先佈局上與聖盃佈局有所不一樣,雙飛翼佈局中的三個模塊並沒有直接包裹在同一個div內,而是center被包裹在一個div內,還是要將元素進行float的定位,然後利用center元素的margin+Left等的負margin實現效果,因爲沒有使用padding使得Left、right元素不需要進行定位,雙飛翼佈局實現上比聖盃佈局簡單。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>雙飛翼佈局</title>
    <style type="text/css">
        *{margin: 0;padding: 0;}
        body{min-width: 700px;}
        .header,
        .footer{
            border: 1px solid #333;
            background: #aaa;
            text-align: center;
        }
        .sub,
        .main,
        .extra{
            float: left;
            min-height: 130px;
        }
      .sub{
            margin-left: -100%;
            width: 200px;
            background: red;
        }
        .extra{
            margin-left: -220px;
            width: 220px;
            background: blue;
        }
        .main{
            width: 100%;
        }
        .main-inner{
            margin-left: 200px;
            margin-right: 220px;
            min-height: 130px;
            background: green;
            word-break: break-all;
        }
        .footer{
            clear: both;
        }
    </style>
</head>
<body>
<div class="header">
    <h4>header</h4>
</div>
<div class="main"><!--佈局上與聖盃佈局不一樣,該div沒有包裹所有的div標籤-->
    <div class="main-inner">
        <h4>main</h4>
        <p>HHHHHHHHHHHHHHHHHHHHHH
            hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
            HHHHHHHHHHHHHHHHHHHHHH
            hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
        </p>
    </div>
</div>
<div class="sub">
    <h4>sub</h4>
    <p>oooooooooooooo
        0000000000000000
        00000000000000000
        ooooooooooooooo
        ooooooooooooooo
        000000000000000</p>
</div>

<div class="extra">
    <h4>extra</h4>
    <p>BBBBBBBBBBBBBB
        888888888888888888
        BBBBBBBBBBBBBBBBBB
        88888888888888888888</p>
</div>
<div class="footer">
    <h4>footer</h4>
</div>
</body>
</html>

以上兩種佈局方式在實現上都神似,止於差別機智的你可以下來自己仔細琢磨下,哈哈哈
(3)flex佈局
原理:flex彈性佈局的詳細介紹後面會出一篇博客,flex彈性佈局中要是利用了其自身的一些屬性,相比其他的方式而言,flex的方式會更加簡潔,利用order調整元素的放置位置,Left、right的寬度固定,不用設置flex的值,只有center的值是隨機變化的所以需要設置flex:1 1 width,其相當於三個屬性的組合屬性:flex-grow、flex-shrink、flex-basis。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>flex三欄式佈局</title>
    <style type="text/css">
        .container{
            display:flex;
        }
        .center{
            flex: 1 1 300px;
            order:2;
            background:blue;
        }
        .left{
            width:220px;
            background:green;
            order:1;
        }
        .right{
            width:220px;
            background: #f00;
            order:3;
        }
    </style>
</head>
<body>
 <div class="container">
     <div class="center">
         <h4>middle</h4>
         <p>HHHHHHHHHHHHHHHHHHHHHH
             hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
             HHHHHHHHHHHHHHHHHHHHHH
             hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
         </p>
     </div>
     <div class="left">
         <h4>left</h4>
         <p>oooooooooooooo
             0000000000000000
             00000000000000000
             ooooooooooooooo
             ooooooooooooooo
             000000000000000</p>
     </div>
     <div class="right">
         <h4>right</h4>
         <p>BBBBBBBBBBBBBB
             888888888888888888
             BBBBBBBBBBBBBBBBBB
             88888888888888888888</p>
     </div>
 </div>
</body>
</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章