雙飛翼布局與聖杯布局

三列布局是一種比較基礎的布局,分別是左列left,主要用作導航,在整個布局的左邊,寬度固定;主列main居中,用來顯示整個網頁的主要內容,寬度自適應;右列right,平時主要用來顯示廣告等內容,在整個布局的右邊,寬度固定。

那麼我們怎麼實現這種三列布局呢,先說一下我們平常的方法。

讓左列left右列right分別左右浮動,然後給主列設置左右外邊距margin-left和margin-right,即可實現主列自適應。

代碼如下:

DOM:

<div class="container"> <div class="left"></div> <div class="right"></div> <div class="main"></div></div>

CSS:

.left{ float: left; height:200px; width: 100px; background-color: #bd4147; } .right{ float: right; height: 200px; width: 200px; background-color: #419641; } .main{ margin-left:120px; margin-right: 220px; height: 200px; background-color: #01549b; }

但是這種方法有一個缺點,就是左列left和右列right必須在主列main的前面,順序不能改變,這就導致主列所顯示的主頁面無法率先載入,影響用戶體驗。

聖杯布局

DOM:

<div class="container"> <div class="main"></div> <div class="left"></div> <div class="right"></div></div>

聖杯布局的思路是把左列left 右列right 主列main分別浮動,然後用負外邊距給左右兩列進行定位;

CSS如下:

.main{ float: left; width: 100%; height: 200px; background-color: #01549b; } .left{ float: left; height: 200px; width: 100px; margin-left: -100%; background-color: #bd4147; } .right{ float: left; height: 200px; width: 200px; margin-left: -200px; background-color: #419641; }

左右兩列定位了,main還沒有定位,所以會出現左右列覆蓋主列main的情況,這時我們給容器container添加左右內邊距padding-left和padding-right,成功定位主列main

.container{ padding-left: 120px; padding-right: 220px; }

但這時候左右兩列會受容器左右內邊距的影響,所以給他們添加相對定位;

.left{ position: relative; left: -120px; } .right{ position: relative; right: -220px; }

最終代碼如下:

DOM:

<div class="container"> <div class="main"></div> <div class="left"></div> <div class="right"></div></div>

CSS:

.container{ padding-left: 120px; padding-right: 220px; } .main{ float: left; width: 100%; height: 200px; background-color: #01549b; } .left{ position: relative; left: -120px; float: left; height: 200px; width: 100px; margin-left: -100%; background-color: #bd4147; } .right{ position: relative; right: -220px; float: left; height: 200px; width: 200px; margin-left: -200px; background-color: #419641; }

聖杯布局的優點:

  • 主列率先載入
  • 允許任何列是最高的
  • DOM結構簡單

缺點:

  • 和雙飛翼布局相比CSS樣式較為複雜

雙飛翼布局

雙飛翼布局源自淘寶UED,第一步和聖杯布局一樣,浮動三列,給左右兩列設置負外邊距;同樣會覆蓋主列main,雙飛翼布局的做法是在主列main後面添加了一個寬度為100%的div,再設置主列main的左右邊距,代碼如下:

DOM:

<div class="wrap"> <div class="main"></div></div> <div class="left"></div> <div class="right"></div>

CSS:

.wrap{ float: left; width: 100%; } .main{ height: 200px; margin-left: 110px; margin-right: 210px; background-color: #01549b; } .left{ float: left; height: 200px; width: 100px; margin-left: -100%; background-color: #bd4147; } .right{ float: left; height: 200px; width: 200px; margin-left: -200px; background-color: #419641; }

優點:

  • 率先載入主列main
  • 允許任何列是最高的
  • CSS樣式簡單

缺點:

  • 和聖杯布局相比DOM結構較為複雜

實現三列布局還有很多種方法,比如用時下比較流行的Flex,等等。

這裡只討論雙飛翼和聖杯布局,請大家指正。


推薦閱讀:

層疊樣式表的層疊是什麼意思?
如何在CSS中使用遮罩mask
如何短時間成為CSS前端開發工程師
為什麼不能在 EDM 模版中使用 DIV ?
有哪些用css css3來取代圖片的經典實例?

TAG:前端開發 | 互聯網 | CSS |