CSS Grid 佈局完全指南
CSS Grid 佈局是 CSS 中最強大的佈局系統。與 flexbox 的一維佈局系統不同,CSS Grid 佈局是一個二維佈局系統,也就意味著它可以同時處理列和行。通過將 CSS 規則應用於 父元素 (成為 Grid Container 網格容器)和其 子元素(成為 Grid Items 網格項),你就可以輕鬆使用 Grid(網格) 佈局。
如果你剛剛接觸 CSS Grid 佈局,那麼我強烈建議你首先閱讀 《5分鐘學會 CSS Grid 佈局》這篇文章作為你的最簡入門。當你對 CSS Grid 佈局有了基本的認識之後,再來閱讀這篇指南,然後閱讀 如何使用 CSS Grid 快速而又靈活的佈局
簡介
CSS Grid(網格) 佈局(又稱為 “Grid(網格)” ),是一個二維的基於網格的佈局系統它的目標是完全改變我們基於網格的使用者介面的佈局方式。CSS 一直用來佈局我們的網頁,但一直以來都存在這樣或那樣的問題。一開始我們用表格(table),然後是浮動(float),再是定位(postion)和內嵌塊(inline-block),但是所有這些方法本質上都是隻是 hack 而已,並且遺漏了很多重要的功能(例如垂直居中)。Flexbox 的出現很大程度上改善了我們的佈局方式,但它的目的是為了解決更簡單的一維佈局,而不是複雜的二維佈局(實際上 Flexbox 和 Grid 能結合在一起工作,而且配合得非常好)。Grid(網格) 佈局是第一個專門為解決佈局問題而建立的 CSS 模組,我們終於不需要想盡辦法hack 頁面佈局樣式了。
有兩個主要的事情啟發我建立了本指南。第一個是 Rachel Andrew 出色的書籍 為CSS網格佈局做好準備。這本書徹底,清晰的介紹 CSS Grid(網格) ,也是本指南的基礎。我強烈建議你購買並閱讀。另一個靈感來自 Flexbox 完整指南 ,(愚人碼頭注:如果你讀英文吃力,可以通過 CSS3 Flexbox屬性視覺化指南 來學習,講的也非常好理解)這也是我學習 flexbox 經常前往的資源。這篇文章是幫助了很多人,顯然是因為 Google “flexbox” 排名第一。你會發現它和我的文章有很多相似之處,為什麼不跟從最好的呢?
本指南的目的是介紹存在於最新版本的規範中 Grid(網格) 概念。所以我不會覆蓋過時的 IE 語法,而且隨著規範的逐漸成熟,我會盡我最大的努力去更新這個指南。
基礎知識和瀏覽器支援
首先,你必須使用 display:
grid
將容器元素定義為一個 grid(網格) 佈局,使用 grid-template-columns
和 grid-template-rows
設定
列 和 行 的尺寸大小,然後通過 grid-column
和 grid-row
將其子元素放入這個
grid(網格) 中。與 flexbox 類似,網格項(grid items)的源順序無關緊要。你的 CSS 可以以任何順序放置它們,這使得使用 媒體查詢(media queries)重新排列網格變得非常容易。定義整個頁面的佈局,然後完全重新排列布局以適應不同的螢幕寬度,這些都只需要幾行 CSS ,想象一下就讓人興奮。Grid(網格) 佈局是有史以來最強大的CSS模組之一。
截至2017年3月,許多瀏覽器都提供了對 CSS Grid 的原生支援,而且無需加瀏覽器字首:Chrome(包括 Android ),Firefox,Safari(包括iOS)和 Opera 。 另一方面,Internet Explorer 10和11支援它,但是是一個過時的語法實現。 Edge 已經宣佈支援,但還沒有到來。(愚人碼頭注:翻譯這篇文章時,Edge 16 已經支援)。
這個瀏覽器支援資料來自 Caniuse ,你可以檢視更多的細節。 數字表示支援以上功能的瀏覽器版本號。
桌面(Desktop) 瀏覽器
Chrome | Opera | Firefox | IE | Edge | Safari |
---|---|---|---|---|---|
57 | 44 | 52 | 11* | 16 | 10.1 |
手機(Mobile) / 平板(Tablet)瀏覽器
iOS Safari | Opera Mobile | Opera Mini | Android | Android Chrome | Android Firefox |
---|---|---|---|---|---|
10.3 | No | No | 62 | 62 | 57 |
除了微軟之外,瀏覽器廠商似乎還沒有對 Grid(網格) 搞自己的一套實現(比如加字首),直到規範完全成熟。這是一件好事,因為這意味著我們不必擔心學習多個語法。
在生產中使用 Grid 只是時間問題。 但現在是學習的時候了。
重要術語
在深入瞭解 Grid(網格) 的概念之前,理解術語是很重要的。由於這裡涉及的術語在概念上都很相似,如果不先記住 Grid(網格) 規範定義的含義,很容易混淆它們。但是別擔心,術語並不多。
網格容器(Grid Container)
應用 display:
grid
的元素。這是所有網格項(Grid Items)的直接父級元素。在這個例子中,container
就是 網格容器(Grid
Container)。
網格項(Grid Item)
網格容器(Grid Container)的子元素(例如直接子元素)。這裡 item
元素就是網格項(Grid
Item),但是 sub-item
不是。
網格線(Grid Line)
構成網格結構的分界線。它們既可以是垂直的(“列網格線(column grid lines)”),也可以是水平的(“行網格線(row grid lines)”),並位於行或列的任一側。例如,這裡的黃線就是一條列網格線。
網格軌道(Grid Track)
兩條相鄰網格線之間的空間。你可以把它們想象成網格的列或行。下圖是第二條和第三條 行網格線 之間的 網格軌道(Grid Track)。
網格單元格(Grid Cell)
兩個相鄰的行和兩個相鄰的列網格線之間的空間。這是 Grid(網格) 系統的一個“單元”。下圖是第1至第2條 行網格線 和第2至第3條 列網格線 交匯構成的 網格單元格(Grid Cell)。
網格區域(Grid Area)
4條網格線包圍的總空間。一個 網格區域(Grid Area) 可以由任意數量的 網格單元格(Grid Cell) 組成。下圖是 行網格線1和3,以及列網格線1和3 之間的網格區域。
Grid(網格) 屬性目錄
網格容器(Grid Container) 屬性
網格項(Grid Items) 屬性
父元素 網格容器(Grid Container) 屬性
display
將元素定義為網格容器,併為其內容建立新的 網格格式上下文。
值:
- grid :生成一個塊級網格
- inline-grid :生成一個內聯網格
-
subgrid :如果你的網格容器本身是另一個網格的網格項(即巢狀網格),你可以使用這個屬性來表示
你希望它的行/列的大小繼承自它的父級網格容器,而不是自己指定的。
如果你想要設定為網格容器元素本身已經是網格項(巢狀網格佈局),用這個屬性指明這個容器內部的網格項的行列尺寸直接繼承其父級的網格容器屬性。
注意:在 網格容器(Grid Container) 上使用column
,float
,clear
, vertical-align
不會產生任何效果。
grid-template-columns / grid-template-rows
使用空格分隔的值列表,用來定義網格的列和行。這些值表示 網格軌道(Grid Track) 大小,它們之間的空格表示網格線。
值:
– <track-size>: 可以是長度值,百分比,或者等份網格容器中可用空間(使用 fr
單位)
– <line-name>:你可以選擇的任意名稱