那些我們不應(yīng)該忘記的經(jīng)典頁面布局方案——圣杯布局&雙飛翼布局

???????隨著css3的普及,我們前端開發(fā)人員在繪制頁面的時候有了更省時省心省力的方式。就比如要實現(xiàn)一個左、中、右的三列布局,我們有不下于五種的解決方案,flex布局、表格布局、Grid布局以及今天我們要將到的圣杯布局雙飛翼布局。

???????圣杯布局和雙飛翼布局解決的問題是相同的,就是兩邊頂寬,中間自適應(yīng)的三欄布局,中間欄要在放在文檔流前面以優(yōu)先渲染。

一、圣杯布局

1、布局原理

???????圣杯布局中,我們主要使用到了負margin并結(jié)合relative相對定位,同時也涉及到了float脫離文檔流排版布局的相關(guān)知識。為了讓中間div內(nèi)容不被遮擋,將中間div設(shè)置了左右padding-left和padding-right后,將左右兩個div用相對布局position: relative并分別配合right和left屬性,以便左右兩欄div移動后不遮擋中間div。

<style>
#bd{
    padding: 0 200px 0 180px;
    height: 100px;
 }
#middle{
   float: left;
   width: 100%;
   height: 500px;
   background:blue;
}
 #left{
   float:left;
   width:180px;
   height:500px;
   margin-left:-100%;
   background: #0c9;
   position: relative;
   left: -180px;
}
 #right{
   float: left;
   width: 200px;
   height: 500px;
   margin-left: -200px;
   background: #0c9;
   position: relative;
   right: -200px;
}
</style>
<div id="bd">
    <div id="middle">middle</div>
    <div id="left">left</div>
    <div id="right">right</div>
</div>

???????注意負margin的使用,.left射者了margin-left:-100%,這里的100%是指負元素的width,因為父元素#bd的width是auto自適應(yīng)屏幕,所以.left元素就會直接向左移動到#bd元素的的最左端,注意:不是屏幕的最左端,然后我們又給.left元素添加了.relativeleft想對定位元素,所以.left自然就左移到屏幕的最左邊了!對于.right元素位置分析,可以采用相同的分析方法。

???????那么,為什么我們要設(shè)置負margin呢?因為,.left,.middle,.right均設(shè)置了float:left,所以它們?nèi)齻€元素都會脫離文檔流,但是仍然排在同一層文檔上面,所以左右要通過負margin進行位置的移動。

???????還有一點需要注意的就是HTML代碼結(jié)構(gòu)的順序,.middle一定要排在.left,.right的上面,這是整個布局邏輯的基礎(chǔ),重要指數(shù)5顆??。

2、優(yōu)缺點

???????優(yōu)點:不需要添加dom節(jié)點。

???????缺點:圣杯布局的缺點:正常情況下是沒有問題的,但是特殊情況下就會暴露此方案的弊端,如果將瀏覽器無線放大時,「圣杯」將會「破碎」掉。如圖:當middle部分的寬小于left部分時就會發(fā)生布局混亂。(middle<left即會變形,這個您需要腦補一下,一般人也不會這么操作的)

二、雙飛翼布局

???????雙飛翼布局是淘寶團隊提出來的一種布局,是圣杯布局的改進,通過給.middle添加一個子節(jié)點.inside來防止頁面被放大之后,頁面的錯亂。其缺點就是多增加了一層div。

<style>
#center{
   float:left;
   width:100%;/*左欄上去到第一行*/     
   height:100px;
   background:blue;
}
#left{
  float:left;
  width:180px;
  height:100px;
  margin-left:-100%;
  background:#0c9;
}
#right{
   float:left;
   width:200px;
   height:100px;
   margin-left:-200px;
   background:#0c9;
}
/*給內(nèi)部div添加margin,把內(nèi)容放到中間欄,其實整個背景還是100%*/ 
#inside{
   margin:0 200px 0 180px;
   height:100px;
}
</style>

<div id="center">
     <div id="inside">middle</div>
</div>
<div id="left">left</div>
<div id="right">right</div>

???????雙飛翼布局理解起來比較簡單,如果你能夠理解圣杯布局,那么理解雙飛翼布局就完全不在話下。此處就不在進行多余的解釋,至于其優(yōu)缺點,前面已經(jīng)介紹過了。如果您有時間,可以使用Grid網(wǎng)格布局實現(xiàn),相關(guān)資料可以查看阮一峰老師的《Grid布局》
???????最后感謝您的閱讀。祝您學習進步!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容