CSS Columns(多列布局)是一種定義了多欄佈局的模塊,它可以表現出將內容在列之間怎麼流動的以及間隙和分割線怎麼使用。瀏覽器的兼容性仍是不錯的,生產環境建議-moz
和-webkit
前綴以及不加前綴三種形式共同使用css
columns
CSS多列布局能夠輕鬆的實現多列的瀑布流佈局,它的兩個關鍵屬性是column-count
和cloumn-width
html
column-count
設置多列布局得的列數,取值:git
auto
,由其餘CSS屬性來決定列的數量,好比column-width
<number>
,用來描述元素內容被劃分的列數,若是column-width
也設置爲非零值,此參數僅表示所容許的最大列數column-width
用來設定最佳列寬,取值:github
auto
,由其餘CSS屬性來決定列的數量,好比column-count
<length>
,用來描述最理想的列寬,實際列寬可能更寬(用來填充可用空間)也可能更窄(當可用空間比指明的列寬更窄),若是column-width
也設置爲非零值,此參數僅表示所容許的最大列數由於這兩個屬性值沒有重疊,能夠使用columns
來進行簡寫:web
column-count: 5 → columns: 5
column-width: 200px → columns: 200px
↓
columns: 5 200px
複製代碼
通常來講,多列布局的高度是由瀏覽器自動肯定的,可是也能夠經過設置height
或者max-height
來限制列的高度。這樣在生成新的一列以前都會僅容許增長到這個高度,剩下的內容會放置到下一列中。(這樣會令咱們的設置的column-count
失效)面試
未設置高度:segmentfault
設置最大高度後,列數超出了設置的column-count: 4
:瀏覽器
column-gap
屬性來設置列之間的間隔,取值:bash
normal
,多列布局時默認值爲1em
,其餘類型佈局時默認值爲0
<length>
,非負整數<percentage>
,基於父元素寬度的百分比能夠經過column-rule
屬性來爲多列布局時各列之間添加分割線,它與border
屬性相似,也是一個縮寫屬性,它是由下面三個屬性構成:ide
column-rule-width
,指定分割線寬度,能夠設定具體數值,也能夠在thin
、medium
、thick
之間取值column-rule-style
,指定分割線的樣式,取值與border-style
相似column-rule-color
,指定分割線的顏色添加這個屬性後column-rule: thick inset blue
:
使用多列布局實現瀑布流就十分簡單了:
DOM結構直接用一個多列布局的容器,內部防止排列的元素便可:
<div class="container">
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
</div>
複製代碼
關鍵是設置container
的多列布局的相關屬性:
.container {
width: 1000px;
column-count: 4;
column-gap: 1em;
column-width: 220px;
}
.img-container {
margin-bottom: 10px;;
break-inside: avoid;
}
複製代碼
此外,須要在內部元素上添加一個break-inside
屬性,用來防止多列布局中內容之外中斷,取值:
auto
,不強制也不由止元素內的頁、列中斷avoid
,避免元素內的分頁符、列中斷以及區域中斷aviod-page
,避免元素內的分頁符aviod-column
,避免元素內的列中斷aviod-region
,避免元素內的區域中斷實現的效果:
多列布局來實現瀑布流佈局的優勢是靈活簡單,而且不須要JavaScript參與,且DOM結構很簡單,缺點除了須要考慮兼容性以外,我沒發現缺點
以前面試的時候被問到,如何實現瀑布流,我當時並不知道多列布局,天然而然就想到使用Flex實現。Flex徹底能夠實現,可是DOM結構會稍微複雜一些
首先須要讓父容器成爲Flex容器,再使用4個<div>
充當列,而後向每一個列中分別添加元素便可(網上有一些方案認爲列元素內部還須要使用Flex佈局,而後flex-direction
爲column
,我以爲沒有必要,天然向下排列就能夠了吧)
<div class="container">
<div class="col">
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
</div>
<div class="col">
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
</div>
<div class="col">
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
</div>
<div class="col">
<div class="img-container"><img src="./images/2.jpg" alt=""></div>
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
<div class="img-container"><img src="./images/1.jpg" alt=""></div>
</div>
</div>
複製代碼
CSS設置並不複雜:
.container {
display: flex;
width: 1000px;
justify-content: space-around;
}
複製代碼
實現的效果:
這種方法優勢是兼容性好,缺點主要是DOM結構複雜一些,並且須要手動的將獲取的元素插入到不一樣的列中,還須要綜合考慮各列的高度,放着某一列高度超出其餘列太多。