從我看到的,知道的,全面的總結一下。CSS常見佈局。
單列布局,通常定寬(可以使用%,可以實現自適應,也可以直接確定寬度大小)並利用margin: auto進行水平居中
margin: auto
<div class="main"></div> ?
.main { width: 90%; height: 2000px; background-color: aqua; margin: 0 auto; }
常見利用float 進行佈局
border-box
<div class="main"> <div class="left"></div> <div class="right"></div> </div> ? ? ? .main { width: 90%; margin: 0 auto; overflow: hidden;/*觸發BFC,清除浮動*/ } .left { width: 1000px;/*也可以使用百分比*/ height: 1500px; float: left; background-color: aqua; } ? .right { width: 1000px;/*也可以使用百分比*/ height: 1500px; float: right; background-color: aqua; }
創建基本的html佈局,要求:兩個div之間相距20px,左側div寬120px
div
<div class="main"> <div class="left"></div> <div class="right"></div> </div> ?
雙inline-block
inline-block
.main { padding: 15px 20px; border: 1px dashed #ff6c60; font-size: 0; } .left { margin-right: 20px; display: inline-block; width: 120px; height: 500px; font-size: 14px; border: 1px solid #ddd; vertical-align: top;/*上端對齊*/ box-sizing: border-box; } .right { display: inline-block; width: calc(100% - 140px);/*注意:當父容器存在padding時100% 不算padding*/ height: 1000px; font-size: 14px; border: 1px solid #ddd; vertical-align: top;/*上端對齊*/ box-sizing: border-box; }
font-size : 0
雙float
float
.main { overflow: hidden;/*清除浮動帶來的影響*/ padding: 15px 20px; border: 1px dashed #ff6c60; } .left { width: 120px; height: 500px; box-sizing: border-box; border: 1px solid #ddd; float: left; margin-right: 20px; } .right { width: calc(100% - 140px); height: 1000px; box-sizing: border-box; border: 1px solid #ddd; float: left; }
float+ margin-left
margin-left
.main { overflow: hidden;/*清除浮動帶來的影響*/ padding: 15px 20px; border: 1px dashed #ff6c60; } .left { width: 120px; height: 500px; box-sizing: border-box; border: 1px solid #ddd; float: left; } .right { width: calc(100% - 140px); height: 1000px; box-sizing: border-box; border: 1px solid #ddd; margin-left: 140px; }
absolute+margin-left
.main { padding: 15px 20px; border: 1px dashed #ff6c60; position: relative; } .left { width: 120px; height: 500px; box-sizing: border-box; border: 1px solid #ddd; position: absolute; } .right { width: calc(100% - 140px);/*不設置寬度也可以,由裡面自由撐開*/ height: 1000px; box-sizing: border-box; border: 1px solid #ddd; margin-left: 140px; }
注意:沒有清除絕對定位的方法,若左側盒子高於右側盒子,就會超出父容器的高度。因此只能通過設置父容器的min-height來防止這種情況。
min-height
使用float+BFC
float+BFC
上面的方法都是需要通過左邊盒子的寬度來計算某一個值,下面的三個方法不需要計算。
將右邊盒子BFC。
BFC
flex方案
flex
.main { padding: 15px 20px; border: 1px dashed #ff6c60; display: flex; align-items: flex-start; } .left { width: 120px; height: 500px; border: 1px solid #ddd; flex: 0 0 auto; margin-right: 20px; } .right { height: 1000px; border: 1px solid #ddd; flex: 1 1 auto; }
flex容器的一個默認屬性值:align-items: stretch;。這個屬性導致了列等高的效果。 為了讓兩個盒子高度自動,需要設置: align-items: flex-start;
align-items: stretch;
align-items: flex-start;
grid方案
grid
暫時沒有進行學習,今日不適合學習,待續。。。
margin
<div class="main"> <div class="left"></div> <div class="middle"></div> <div class="right"></div> </div>
.main { width: 90%; margin: 0 auto; overflow: hidden;/*觸發BFC,清除浮動*/ } .left { width: 200px;/*也可以使用百分比*/ height: 1500px; float: left; background-color: aqua; margin: 0 10px; } ? .right { width: 200px;/*也可以使用百分比*/ height: 1500px; float: right; background-color: aqua; margin: 0 10px; } .middle { width: calc(100% - 460px); height: 1500px; float: left; background-color: aqua; margin: 0 10px; }
(不建議使用,因為使用絕對定位,後面加入內容的時候會被覆蓋)
<div class="main"> <div class="left"></div> <div class="middle"></div> <div class="right"></div> </div> .main { width: 90%; margin: 0 auto; position: relative; } .left { width: 200px;/*也可以使用百分比*/ height: 1500px; position: absolute; left: 10px; background-color: aqua; } ? .right { width: 200px;/*也可以使用百分比*/ height: 1500px; position: absolute; right: 10px; background-color: aqua; } .middle { width: calc(100% - 460px); height: 1500px; position: absolute; left: 230px; background-color: aqua; } ?
padding+負margin(聖杯佈局)
padding+負margin
此原理來自這篇文章。
聖杯佈局In Searh of the Holy Graid
這篇文章給出了一個不一樣的解決方案,在此我有一些修改,清除浮動的方式改為了overflow: hidden;
overflow: hidden;
要求:左邊寬度為 200px,右邊150px,中間自適應。
基本的結構如下:
<div id = "container"> <div id="center" class="column"></div> <div id="left" class="column"></div> <div id="right" class="column"></div> </div>
基本的css樣式如下(為了更好的顯示,所以設置了邊框,將box-sizing設置為border-box模型):
box-sizing
#container { padding-left: 200px; padding-right: 150px; overflow: hidden; border: 1px dashed #ff6c60; } #container .column { border: 1px solid #ff6c60; box-sizing: border-box; } #center { width: 100%; height: 1000px; } ? #left { width: 200px; height: 100px; ? } ? #right { width: 150px; height: 100px; }
將左側弄到上面去
#left { position: relative; margin-left: -100%; right: 200px;
} #right { margin-right: -150px; } ?
就OK了!
【注】
對於聖杯,我們沒有添加額外的標籤,而雙飛翼需要為center加一個額外的div,首先我們先將頁面的基本結構搭建起來。
<div id="header"></div> <div id = "container"> <div id="center" class="column"> <div id="inner-center"></div> </div> <div id="left" class="column"></div> <div id="right" class="column"></div> </div> <div id="footer"></div>
和聖杯佈局一樣,只不過需要將,padding 用 margin來進行實現。
css代碼如下:
#header { width: 100%; height: 50px; background-color: aliceblue; } ? #container { overflow: hidden;/*觸發BFC,清除浮動影響*/ border: 1px dashed #ff6c60; } #footer { width: 100%; height: 50px; background-color: aliceblue; } ? .column { float: left; } #center { width: 100%; } #inner-center { height: 1000px; margin-left: 200px; margin-right: 150px; background-color: aqua; } ? #left { width: 200px; height: 100px; margin-left: -100%; background-color: aqua; } ? #right { width: 150px; height: 100px; margin-left: -150px; background-color: aqua; } ?
我們用四個子元素來進行等分。父元素默認100%寬度, 子元素要平均分為四份。間距為10px;
基本的html結構如下:
<div class="father"> <div class="son"></div> <div class="son"></div> <div class="son"></div> <div class="son"></div> </div>
margin-right: 10px
calc(25% - 10px)
.father { overflow: hidden; margin-right: -10px; } .son { width: calc(25% - 10px); height: 500px; float: left; margin-right: 10px; background-color: aqua; }
關於負邊距更多的探討,計劃下篇文章總結一下。
同樣需要父容器使用負邊距來進行清除帶來的影響。
html基本代碼同上
.father { display: flex; margin-right: -10px; } .son { flex: 1 1 auto; align-items: flex-start; height: 500px; border: 1px solid #ff6c60; margin-right: 10px; }
(完)??
推薦閱讀: