概述
我們再重新複習一下,
Grid for layout, Flex for component.
格線系統的發展從 2011 年開始,一直到 2016 年開始進入 CR 的階段。以目前的版本來看,市面上瀏覽器的 支援程度 看起來是相當樂觀的。

所以,到底 Grid 帶來了什麼東西?
- CSS Grid Layout Module Level 2 如其名,他就是用來排版的。
- 一次設定兩個維度的流向。
- 兩個軸會構成一個區塊,無論你要不要,就是會有那個區塊。
- 對齊方式延續 Flex,還多了一些東西。
- 可以設定間距(gap)。
- 帶來更多(也更複雜)的屬性設定與值。
- 可同時參考 Box Alignment Module Level 3, Box Model Module Level 4 與 Fragmentation Module Level 4。
如同 Amos 所述,Grid 比較向是「點線面」當中的 面,是利用兩個相交軸構成一個平面。然後我們在這個平面區域當中做事情。而我個人比較喜歡稱 Grid 為 Excel。
對,就是大家熟悉的那個 Excel。
或者說,要說是新一代的 Table 排版也不是不行(欸)。
說明一下共通點(有人想知道 Grid 跟 Excel 的共通點嗎?
- 都是由 column與row組成。
- 可以跨欄置中。
- 可以合併儲存格。
- 可以加框線。
- 每個 column或row的尺寸會影像到同維度的所有元件。
- 4 x 4就是- 16,沒在跟你五四三的。
- 交叉維度之間沒有 break這件事情。
- 但是印刷的時候允許使用 page-*來切斷。
所以你看,是不是只要會了 Excel 就可以來寫 Grid Layout 了(並沒有!)。
Grid 與 Flex
兩者之間的差異這邊就不再著墨,我們回到一開始的重點,跟這兩者之間很容易搞混的事情。首先,Grid 不是什麼地方都可以用。以天地之間講幹話為例子,通常我們會在 SPA 的頁面當中,放一個網站的選單,
<header class="header">
    <!-- 天 -->
    <img class="logo" src="/static/logo.png" alt="Logo">
    <nav class="nav">
        <ol>
            <li><a href="/">首頁</a></li>
            <li><a href="/mdfk">講幹話</a></li>
            <li><a href="/break">我想在這裡換行</a></li>
            <li><a href="/mdfk">講幹話</a></li>
        </ol>
    </nav>
</header>
<main>
    <!-- 講幹話 -->
</main>
<footer>
    <!-- 地 -->
</footer>
這種時候,我們在天地之間講幹話使用 Grid 是沒什麼問題的。但是,如果你在 <header> 也這麼用,那問題就有點大了。
你是不是想炫技你說!
對於 <header> 這個區塊,雖然我們可以把他獨立當作一個容器看待,但是這裡面再次使用 Grid 來做其實有點小題大作。所以我從一開始就不斷的重複 Flex for component 這件事情。這邊,你應該使用 Flex 來規劃你的結構,而不是再次使用 Grid。
當然,如果說你的 <header> 內容複雜到真的得用 Grid 來製作,嗯,雖然說不無可能。不過我還是覺得,若是有這樣的設計的話,可以麻煩通知我一下,我想找我娘子一起出來看上帝。
以下是錯誤示範,請不要亂學。
.header {
    display: grid;
    grid-template-columns: 200px auto;
    grid-template-rows: auto;
    justify-content: space-between;
}
.nav {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-template-rows: auto auto;
}
翻譯成 Flex 就是,
.header {
    display: flex;
    flex-direction: row;
    justify-content: space-between;
}
.logo {
    flex: 0 0 200px;
}
.nav {
    flex: 0 0 25%;
}
好的,請不要濫用 Grid 來做一些奇怪的事情,這樣看起來真的不會比較專業。
屬性與對象
先大概描述一下 Grid 系列的屬性。首先,你需要先知道的事情,這些屬性是有適用對象的,跟 Flex 那邊一樣,並不是每個 Grid 屬性都可以隨便放。就像是,你放了一個 font-size 指定給一個 img 標籤,然後把他訂為 block 是沒有意義的。
Grid 容器可適用的屬性
| 屬性 | 預設 | 使用姿勢 | 
|---|---|---|
| grid-template-columns,grid-template-rows | none | 包含單位的長度,可用 fr單位數值,維度可命名,可使用auto,min-content,max-content,可用minmax(),fit-content()計算函示組合。 | 
| grid-template-areas | none | 給予一個字串形式的區域命名資料。當中 .是保留字,在 Grid 容器中代表空區塊。 | 
| grid-template | none | 上述三個屬性的集合屬性設定。 | 
| column-gap,row-gap | normal | 故名思義就是每個區塊的間距設定。 | 
| gap | - | 上述兩個屬性的集合屬性設定。 | 
| justify-items,align-items | noemal | 容器區塊內的對齊、填滿相關設定。 | 
| place-items | - | 上述兩個屬性的集合屬性設定。 | 
| justify-content,align-content | normal | 容器內兩個軸向對齊、填滿相關設定。 | 
| place-content | - | 上述兩個屬性的集合屬性設定。 | 
| grid-auto-column,grid-auto-row | auto | 指定自動行、欄的尺寸。 | 
| grid-auto-flow | row | 指定容器區塊內元件的流向,如果指定關鍵字 dense,則會使用緊湊方式排列元件。 | 
| grid | - | 綜合上面全部。 | 
Grid 區塊元件可適用的屬性
| 屬性 | 預設 | 使用姿勢 | 
|---|---|---|
| grid-column-start,grid-column-end,grid-row-start,grid-row-end | - | 指定元件的區塊起使位置,可用 span關鍵字來做跨欄、跨行的動作。 | 
| grid-area | auto | 用於指定元件放置的區塊,也可以是上述四個屬性的集合屬性設定。 | 
| align-self,justify-self | auto | 區塊內元件對齊、填滿相關設定。 | 
| place-self | auto | 上述兩個屬性的集合屬性設定。 | 
你看,是不是很像 Excel。
所以說那個手機版
看完這些關於 Grid Layout 的基本設定,是不是覺得行動裝置用 Flex 就好了。
對啊!其實我也是這麼覺得。
 
 
        ![[CSS] Flex/Grid Layout Modules, part 16](/content/images/size/w960/2022/05/grid-sample-80-1.png) 
            ![[CSS] Flex/Grid Layout Modules, part 15](/content/images/size/w960/2022/01/grid-sample-73-1.png) 
            ![[CSS] Flex/Grid Layout Modules, part 14](/content/images/size/w960/2021/09/grid-sample-70-1.png)