以下 CSS 柵格布局除了用 table 以外,有什麼其他的方法嗎?
拋磚引玉。
這個題目看似是最簡單的二維布局,實際透露出整個 CSS 的發展方向。向前可以考察對兼容性的處理功底,向後可以考察對 CSS 新特性的洞察能力。可攻可受,攻守兼備。
需要注意的是:這是一個兩端對齊的布局,需要仔細考慮中間空隙的處理。
1. 兼容方案 float
最容易想到的就是運用 float 的浮動特性,為了更好的處理間距,我們需要三層結構,利用 margin 負值來抵消間距,形成視覺上的兩段對齊效果。
&
&
&a& &b& &c& &d& &e& &
2. 漸進增強 flex
flex 的處理需要一個小技巧,需要把主軸方向旋轉90度,也就是 flex-direction: column。
- 優點:
flex 可以較好的處理兩端對齊布局,中間的空隙可以通過 align-content: space-between,justify-content: space-between 來實現自適應(但超過兩行或兩列時會有問題)。
- 缺點:
需要通過 order 屬性手動調節為正確的元素順序。
3. 面向未來 grid
如果說從 Flex 開始 CSS有了真正的二維布局特性,那麼 CSS Grid 將是二維布局的未來。
- 優點:
1)可以把傳統的網頁柵格體系直接對應到 CSS 聲明,例如:
.grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr;
}
這樣三句代碼就表明我定義了一個兩行三列的柵格,也就是題中的布局。
2)通過 grid-column/row 屬性里的 span 值可以方便的實現跨行或誇列,無需顯性指定寬高的改變,非常方便的實現了跨行或誇列。
.grid .a {
grid-row: span 2;
}
.grid .a:hover {
grid-row: auto;
grid-column: span 2;
}
- 缺點:
從我粗淺的理解來看,Grid 處理之間的空隙還比較麻煩,需要把空隙當做單獨的柵格來看待,然後通過 grid-area 屬性來定位主要的非空隙區塊。類似這樣:
grid-template-columns: 1fr 10px 1fr 10px 1fr;
grid-template-rows: 1fr 10px 1fr;
grid-template-areas:
"a a a . b"
". . . . ."
"c . d . e"
「.」 (U+002E FULL STOP)代表空的格子。詳見 @大漠 的答案。
無論如何,在 CSS Grid 的青春期里,我們期待更多特性的萌芽,你準備好了嗎?
Demo:多種方案實現跨行或誇列布局
筆記本鍵盤壞了,背個鍵盤迴來寫答案,容易嗎!!!???????????
2015年12月05日 更新很高興的告訴大家,CSS Grid 布局現在已經增加了 grid-gap 屬性來控制間距,而且 WebKit, Blink, Firefox 都已經實現。
以上壹絲
flexible box,你值得擁有:
&
&
&
&
&
&
&
&
&
&
&
坐等 @一絲姐姐的詳細答案。採用了CSS Grid Layout Module寫了兩個。A Pen by Airen 和A Pen by Airen 相關原理可以看看早前整理的相關文檔:css3 grid layout
Bootstrap 之類的都提供了 12/16 格系統 CSS · Bootstrap#grid,非常方便實現這種布局。
Bootstrap 網格系統的原理是:
1. 每一格 float: left;
2. 格的寬度是 (n/12)%,col-*-3 就是 25%;3. 提供了四個響應式斷點:xs sm md lg,可以在不同寬度的頁面中有不同的布局。網格是基礎功能,響應式布局是基於網格的擴展功能。動手練習了一下,參考了Ivony 的答案。有不妥地方請指正。謝謝A Pen by Aztack
&
&
&
&&THE MOST ROMANTIC GETAWAY&
Blessed with dreamy beaches, pounding surf, luxurious spas and swanky restaurants, it』s easy to see why thousands flock to Indonesia』s tourist mecca every year. &
&
&
&Seoul&
&
&
&Singapore&
&
&
&Macao&
&
&