在這篇文章中,我們將來看一些CSS3新屬性,從而用HTML和CSS處理網格的時候更容易。但首先讓我們討論一點HTML和CSS網格的歷史,了解清楚為什么以前很困難。
網格簡史
曾幾何時,我們的布局是一團糟。表格和框架是用於創建多列布局的主要工具。雖然他們能完成工作(但其實非常糟糕)。
把目光投向今天。HTML和CSS已經變得非常復雜,Web設計的知名度和復雜度與日俱增。我們曾經使用的舊的布局方法顯然已經out了。然而,一個歷史遺留問題浮出水面:多列布局。
更復雜的是,我們的頁面寬度不再是靜態的。響應式大行其道,所以我們傾向於基於百分比的列寬。基於固定960像素寬的簡單網格已經行不通——我們需要流體網格。
CSS2規范中用浮動解決列的方法存在一個問題。為了防止父元素破環你的布局,我們需要添加clearfix。通過這種方法,來修正父元素的高度坍塌問題(浮動元素脫離標准流,父元素會認為浮動資源不存在)。我們大部分接受這種方法,但許多人仍然認為它是一種hack(奇技淫巧)。
通過inline-box的方法並不常見,但仍然存在。內聯元素會保持在一行,他們自然順序排列。當一行被占滿,后面的元素自然折到下一行。但因為他表現為文本特性,其行為類似文本。這意味着你必須避免HTML元素之間的空白元素(空格,tab,換行……)。Inline-block不是為這設計的,不且工作的並不十分如意。
在這兩種方法中,浮動的方法更可靠。這就是為什么它更流行,排在第一位。然而,創建多列后,我們發現需要再次壓縮內容,因為我們需要一些填充距離。這就引出最終的問題:盒模型
盒模型是什么,簡單來說,一個元素的實際尺寸包括:高度/寬度+內邊距+邊的寬度。外邊據並不使盒子變大,僅僅在自己和其他元素之間增加空隙。所以設置寬度時,比如25%,其盒子的實際寬度比這大得多,這意味着在一行沒有足夠的空間放下四個元素。
這煩人的問題有不同的解決方案:負外邊距,嵌套元素——我知道的全部了。他們都需要額外的CSS或DOM元素,算作hack方法。讓我們面對現實,CSS2中沒有解決網格的好方法。
然而今天,CSS3提供很好的支持,規范增加了專門用於網格的幾個新特性。這些特性都有哪些?我們如何使用他們?讓我們看一看。
box-sizing: border-box
<div class="row"> <div class="column">Col one</div> <div class="column">Col two</div> <div class="column">Col three</div> <div class="column">Col four</div> </div>
CSS
.row:after { clear: both; content: ''; display: block; } .column { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; float: left; min-height: 8em; overflow: hidden; padding: 2em; width: 25%; } .column:nth-child(1) { background-color: #9df5ba; } .column:nth-child(2) { background-color: #9df5d7; } .column:nth-child(3) { background-color: #9df5f5; } .column:nth-child(4) { background-color: #9dd7f5; }
Demo
雖然這工作的很棒,但我們仍然需要使用浮動,我們仍然需要清除浮動。此外,我們我們只能使用內邊距作為元素的空間,外邊距不再起作用。這意味着在快元素之間沒有實際的空間,而是它的內容。雖然這對很多設計非常有用,但仍然覺得它是個小錯誤。
- Firefox 1
- Chrome 1
- IE 8
- Opera 7
- Safari 3
width: calc(百分比 – 距離)
另一個偉大的選擇是使用calc()函數。他允許我們在不依賴JavaScript的情況下計算元素的真實寬度——可以是不同的單位!
<div class="row"> <div class="column">Col one</div> <div class="column">Col two</div> <div class="column">Col three</div> <div class="column">Col four</div> </div>
CSS
.row { margin-left: -1em; } .row:after { clear: both; content: ''; display: block; } .column { float: left; margin-left: 1em; min-height: 8em; padding: 1em; width: -webkit-calc(25% - 3em); width: -moz-calc(25% - 3em); width: calc(25% - 3em); } .column:nth-child(1) { background-color: #9df5ba; } .column:nth-child(2) { background-color: #9df5d7; } .column:nth-child(3) { background-color: #9df5f5; } .column:nth-child(4) { background-color: #9dd7f5; }
Demo
重新計算實際尺寸的能力是一個偉大的選擇,但不幸的的是,我們仍然需要浮動,我們也需要列的容器為負外邊距。同上,一個很棒的選擇,但仍然有些瑕疵。
- Firefox 4
- Chrome 19
- IE 9
- Opera ?
- Safari 6 (appears to be a little buggy)
Flexbox
<div class="row"> <div class="column">Col one</div> <div class="column">Col two</div> <div class="column">Col three</div> <div class="column">Col four</div> </div>
CSS
.row { display: -webkit-flex; -webkit-flex-direction: row; -webkit-flex-wrap: nowrap; -webkit-justify-content: space-between; display: flex; flex-direction: row; flex-wrap: nowrap; justify-content: space-between; } .column { margin: 0.5em; min-height: 8em; padding: 1em; width: 25%; } .column:nth-child(1) { background-color: #9df5ba; } .column:nth-child(2) { background-color: #9df5d7; } .column:nth-child(3) { background-color: #9df5f5; } .column:nth-child(4) { background-color: #9dd7f5; }
Demo
- Firefox 18
- Chrome 21
- IE 10
- Opera 12.10
- Safari 6.1
結論
盡管CSS3帶來了許多新特性並且修復了一些歷史遺留問題,在我看來,伸縮盒布局是用CSS創建彈性網格的唯一非hack方法。然而,不幸的是瀏覽器的支持表現平平。盡管如何,其他方法豐富了表現,所以他們是一個進步,並且他們有很好的瀏覽器支持。
注
原文:http://flippinawesome.org/2014/03/03/grids-in-css3/
Q群推薦
CSS家園188275051,CSS開發者的天堂,歡迎有興趣的同學加入
GitHub家園225932282,GitHub愛好者的天堂,歡迎有興趣的同學加入