css3屬性column知多少


CSS3 可以將文本內容設計成像報紙一樣的多列布局。像下面這樣:

這樣的布局稱為“多列布局”。

對多列屬性分別進行學習:

對於 column 的所有屬性,ie10+ 支持,firefox 不支持 column-span。除 firefox 外,所有瀏覽器都不支持 column-fill 屬性。

1. column-count: 需要分割的列數

<div>
    記得早先少年時,大家誠誠懇懇,說一句是一句;清早上火車站,長街黑暗無行人,賣豆漿的小店冒着熱氣;從前的日色變得慢,車、馬、郵件都慢,一生只夠愛一個人;從前的鎖也好看,鑰匙精美有樣子,你鎖了人家就懂了。
</div>
div {
    -moz-column-count: 3;
         column-count: 3;
}

通過測試,firefox(version 49.0.1) 需要添加 -moz- 前綴,chrome,opera,safari,不需要添加 -webkit- 前綴也能正常顯示,ie10+,edge 不需要添加前綴能正常顯示。將頁面縮小后(不縮小時由於文本字數不夠,只顯示兩列)顯示效果:

 

2. column-gap: 列與列間的間隙

ie下默認為 16px,其它瀏覽器未明確給出。

<div>
    當我年輕的時候,我夢想改變這個世界;當我成熟以后,我發現我不能夠改變這個世界,我將目光縮短了些,決定只改變我的國家;當我進入暮年以后,我發現我不能夠改變我們的國家,我的最后願望僅僅是改變一下我的家庭,但是,這也不可能。當我現在躺在床上,行將就木時,我突然意識到:如果一開始我僅僅去改變我自己,然后,我可能改變我的家庭;在家人的幫助和鼓勵下,我可能為國家做一些事情;然后,誰知道呢?我甚至可能改變這個世界。
</div>
div {
    -moz-column-count: 4;
         column-count: 4;
    -moz-column-gap: 40px;
         column-gap: 40px;         
}

 

3. column-rule-width: 列與列間的邊框寬度

4. column-rule-style: 列與列間的邊框樣式

5. column-rule-color: 列與列間的邊框顏色

以上三個屬性可以簡寫為 column-rule。同 border 一樣,這三個屬性里 width 和 color 可以省略其中之一或都省略,瀏覽器會使用默認的 width 和 color,但是 style 不能省略。在谷歌瀏覽器中做測試:

(1). 省略 width(chrome 默認為 3px, 其它瀏覽器未明確給出)

<div>
    這么多年咨詢信看下來,讓我逐漸明白了一件事。很多時候,咨詢者心里已經有了答案,來咨詢只是想確認自己的確定是對的。所以有些人讀過回信后,會再次來信,大概就是因為回答的內容和他們的想法不一樣吧。
</div>
div {
    -moz-column-count: 4;
         column-count: 4;
    -moz-column-gap: 40px;
         column-gap: 40px;
    -moz-column-rule-style: solid;
         column-rule-style: solid;
    -moz-column-rule-color: #f00;
         column-rule-color: #f00;
}

(2). 省略 color(默認為 rbg(0,0,0))

div {
    -moz-column-count: 4;
         column-count: 4;
    -moz-column-gap: 40px;
         column-gap: 40px;
    -moz-column-rule-width: 2px;
         column-rule-width: 2px;
    -moz-column-rule-style: solid;
         column-rule-style: solid;
}

(3). width 和 color 兩者都省略

div {
    -moz-column-count: 4;
         column-count: 4;
    -moz-column-gap: 40px;
         column-gap: 40px;
    -moz-column-rule-style: dotted;
         column-rule-style: dotted;
}

 

6. column-span: 元素跨越列數(firefox 不支持)

可用值為 1 和 all,默認值為 1。火狐瀏覽器不支持此屬性,但是當使用此屬性值時,變現效果和 column-span: 1; 一樣,因此可以放心的使用 column-span: 1; 不建議使用 column-span: all;

<div>
    <h2>在情感的問題上,很多人都是傻瓜</h2>
他在感情上的愚鈍就像是門窗緊閉的屋子,雖然愛情的腳步正在緩緩向他走來,可他還是在屋子里走過去又走過來,他也聽到了,可是他覺得那是幻想,是有人走錯了方向,她終究會明白過來,然后找對自己的方向繼續過自己該有的生活。然而聯系着美好愛情的生活不單單這么簡單,否則戀愛就沒有那么美好,那么令人向往了。他喜歡的是另外一個女孩,可是他僅僅向前邁了一小步,最終在院子里徘徊,他覺得女孩走的是另外一條路,她邁着不一樣的步伐,很清晰自己的目標和價值所在,走得很快。當然他不止一次的做夢醒來希望女孩旁邊給他留了一條路,這樣他們就能攜手並進,在讓大家都變得更好的路上越走越遠,這是他最美好的期待。他依然在這件事情糾結着,直到女孩說:“傾盡所有,你會得到你想要的!”
</div>
div {
    -moz-column-count: 4;
         column-count: 4;
}
h2 {
   column-span: 1;
}

與其他屬性不同,column-span 是用在子元素上,表示跨越多少列,好像表格中 col-span 屬性一樣。因為用的值是 1,而不是 all,所以 firefox 瀏覽器中的顯示效果和其它瀏覽器一樣。

 

7. column-width: 列的寬度

<div>我以前常常想:“朋友有很多,能成為朋友,必定是在生活習慣、愛好、脾氣、秉性、追求、對事物的看法、處事風格等一件事或多方面有共同點或相似之處,何其難得。可碰到自己每當安靜下來就想起的人,每當自己有空閑時就迫不及待想要去了解的人可遇而不可求。能在人海中相識並願意花時間想去走進一個人內心這樣的人,更應該努力去爭取。朋友失去了一個,你還有很多,可是你失去喜歡的人,就是你的大過!”</div>
div {
    -moz-column-count: 4;
         column-count: 4;
    -moz-column-width: 200px;
         column-width: 200px;    
}

這個屬性要求比較多:列數與寬度的乘積(column-count * column-width)應該要小於頁面的寬度,才能展示想要的四列效果。當文本字數比較少,頁面又比較寬時,就顯示不了四列,可能只有三列或更少。

 

8. column-fill: 如何填充列

這個屬性目前只有 firefox 支持,fill 翻譯為填充,所以 column-fill 是指定填充列的方式。有兩個值可用,balance,列長短平衡,瀏覽器應盡量減少改變列的長度。auto,列順序填充,他們將有不同的長度。

 

9. columns: 指定列的寬度和數量

這是一個合寫屬性,是 column-width 和 column-count 的合寫。

<div>后來他在“我”的生活里悄然離去之后,“我”常常會心酸地想起這個夏天早晨站台上的情景,“我”在他二十一歲的時候突然闖進他的生活,而且完全擠滿他的生活,他本來應有的幸福一點也擠不進來了。當他含辛茹苦把“我”養育成人,“我”卻不知不覺把他拋棄在站台上。人世間的親情像一杯咖啡,通過收養來建立的親情是一杯苦咖啡,打算喝咖啡的人走了,他知道有更好的咖啡等着他,后來這杯咖啡越來越苦。但我相信喝咖啡的人終究會回來的。</div>
div {
    -moz-columns: 150px 4;
         columns: 150px 4;    
}

這個合寫的屬性不是都滿足 width 和 count。針對本例我們撇開每一列之間的間距不談,假設每一列之間的間距為 0。那么當文本的寬度不小於 600px 時,文本將始終顯示 4 列(至少確實想顯示 4 列,如果文本字數足夠的話就一定顯示 4 列),就不能同時滿足於寬度也為 150px;當文本的寬度小於 600px 時,文本就顯示為 3 列,當文本寬度小於 300px 時,文本就顯示為 2 列。

本例中,對於元素可用寬度不同顯示的列數也不同。

顯示為 4 列:

顯示為 3 列:

顯示為 2 列:

顯示為 1 列:

總結:那么這個合寫屬性就可以理解為(還是假設每列之間的間距為 0):當元素可用寬度很小時,它只顯示 1 列;當元素的可用寬度不小於 count * 2 它就顯示 2 列;當元素的可用寬度不小於 count * 3 時,它就顯示 3 列;依此規則類推,至到元素的可用寬度不小於 count * width 時,就顯示為 width 列。


 

一些猜想:

在元素可用寬度確定的情況下,既設置 column-width, 又設置了 column-count 和 coiumn-gap 時,頁面該怎么布局呢?

經過測試,基本可以得出以下結論:

1. 第九點中的總結在這里依然有效;

2. 當元素的寬度能夠排下兩列及以上時(一列時,沒有間距),column-gap 間距能始終被滿足。

更新(2019年3月28日):

這里的 columns 屬性時 column-count 和 column-width 屬性的簡寫形式。

如果只設置 column-count 屬性,瀏覽器會嚴格生成指定數量的欄,不管寬度如何。

如果同時設置了 column-count 和 column-width,前者會作為最大欄數,后者會作為最小欄寬。

columns: 20em;  /* 在保證最小寬度 20em 的前提下,自動設置欄數 */
column-width: 20em;   /* 同上 */
columns: 3;   /* 3 欄,自動設置寬度 */
column-count: 3;   /* 同上 */
columns: 3 20em;   /* 至多 3 欄,每欄寬度至少 20em */

 

更新(2019年7月29日):

足足過去了一個月,才發現這篇博客有人評論了,寫了有三年多了,沒想到有人還看得這么認真。本想回復,結果發生了錯誤,需要反饋到 cnblogs 郵箱去處理。很感謝 o!_o! (博客地址:https://home.cnblogs.com/u/sarilar/)指出的錯誤。明顯錯誤的地方我會在原文中直接修改,之前自己沒理解寫出的,我直接將他的評論內容粘出來,經過驗證了,他的觀點是對的。

 

第二點中的column-gap的默認值是normal,且在大小上等於1em
第三點中的column-rule各個參數的默認值:0px none rgb(0,0,0)。這里面重要的3點是:
  column-rule-style:none;使column-rule-width:0px;
  colulmn-rule-style非none時默認column-rule-width:3px;
  column-rule-color默認是color屬性的值,而color屬性默認是黑色,所以才是rgb(0,0,0)。

第六點中已經指出火狐不支持column-span屬性,然示例代碼中還是用了-moz-column-span這個屬性,是矛盾。
第九點中對columns屬性的總結沒有說明出本質,應這樣理解:column-width並不完全意味一列的寬度,一列的寬度事實上是由column-count決定的。因為對象會按指定的column-count減去(column-count - 1)*column-gap寬度的所有列間距后將剩余寬度"column-count等分"。column-width的作用是當它大於一列的寬度時使對象“降列顯示”。降列顯示即是對象會顯示比原先少一的列數。舉例如下:
  假設對象width:700px;font-size:14px;column-count:4;
  每一列寬度w1=[700-(4-1)*14]/4=164.5px,
  當column-width<=w1時按指定的4列顯示,否則降列顯示,首次降列column-count減為3,column-gap數量減為2,重新計算每一列寬度w2=[700-(3-1)*14]/3=224px,
  當column-width<=w2使按新的3列顯示,否則再次降列顯示
  。
  。
  。
  以此類推。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM