如何實現以下的這種中間自適應寬度,左右兩欄固定寬度佈局? 面試
這是一道經典的面試題,經常使用的方法是:聖盃佈局、雙飛翼佈局。相信看完這篇文章,你就能很清楚的知道什麼是聖盃和雙飛翼了。首先,咱們先定義HTML結構:bash
<div class='container'>
<div class="middle">中間的</div>
<div class="left">左邊的</div>
<div class="right">右邊的</div>
</div>
複製代碼
再來開始咱們的佈局,首先給這三個div都給一個float: left,讓它們均左浮動。佈局
.middle, .left, .right{
float: left;
}
複製代碼
接下來是最重要的兩個步驟,設置左盒子的margin-left: -100%,把左盒子拉上來,調整左盒子的浮動位置到中間盒子的左側。
ui
再設置右盒子的margin-left: -右盒子寬度px,把右盒子拉上來,調整右盒子的浮動位置到中間盒子的右側。
spa
.left{
background: pink;
width: 300px;
height: 300px;
margin-left: -100%;
}
.right{
background: pink;
width: 300px;
height: 300px;
margin-left: -300px; //300px爲右盒子的寬度
}
複製代碼
【*】此時的佈局基本出來了,可是中間盒子的左右兩側會被左右兩個盒子覆蓋掉,此時咱們要經過相對定位來避免覆蓋。給左右盒子position: relative,再分別設置它們的left和right,而且控制父元素的padding來爲左右兩邊留白。code
.left{
position: relative;
left: -300px;
}
.right{
position: relative;
right: -300px;
}
.container{
border: 1px solid black;
height: 300px;
padding: 0 400px;
}
複製代碼
ok!大功告成,聖盃佈局已經完成啦~cdn
雙飛翼的佈局基本和聖盃佈局相似,它的HTML結構爲:blog
<div class='container'>
<div class="middle">
<div class="inner_middle">中間的</div>
</div>
<div class="left">左邊的</div>
<div class="right">右邊的</div>
</div>
複製代碼
前面的佈局和聖盃徹底一致,只是從【*】開始的這一步略微有些差別。
string
在雙飛翼中避免左右盒子被覆蓋,是經過設置inner_middle的左右margin來實現的。it
.inner_middle{
margin: 0 300px;
}
複製代碼
另外,整個佈局的左右padding留白也有些差別,直接設置父盒子的padding爲左右留白的寬度就能夠了。
.container{
border: 1px solid black;
height: 300px;
padding: 0 100px;
}
複製代碼
這裏還有第二種實現方式,HTML結構沿用聖盃佈局的結構,經過設置左右padding來避免中間盒子內容的覆蓋。同時爲了不佈局混亂,還有設置box-sizing: border-box,表示width包括border和padding,這樣能夠保證即便設置右左右padding,它的總寬度也是不變的。
.middle{
background: #ccc;
width: 100%;
height: 300px;
padding: 0 300px;
box-sizing: border-box;
}
複製代碼