CSS | 所以我說那個版能不能好切一點? - Grid 基本用法

神Q超人
Enjoy life enjoy coding
6 min readApr 21, 2019
Photo by Ján Jakub Naništa on Unsplash

前言

Grid 是在 2011 年出現的排版方式,比 Flex 還要晚兩年面世。 Grid 出現不是為了要取代 Flex ( 如同 Flex 對 Float 的打擊),而是讓網頁的主 Layout 能夠更簡單的被拉出來,而細節的方面再搭配 Flex 處理內容的排列,這部分也要等實作後才能更清楚的理解,現在就先來認識這最後出現的超新星吧!

Grid

Grid 也是新增在 display 的新屬性,在排版上的應用類似於表格,可以為一整個區塊創建 X * Y 的子區域,並將 Grid 內的區塊排列放置格子中。

grid-template-rows & grid-template-columns

上述所說的劃分 X 及 Y 軸隔線靠的就是 grid-template-rows & grid-template-columns 這兩個屬性,下方會在這兩個屬性上設置每一個格的寬度,以 grid-template-columns 來說如果設定為 100px 100px 100px 100px ,就代表這個 Grid Box 內擁有四格,且每格寬度都是 100 px , grid-template-rows 的設定也一樣,在設定完 X 與 Y 軸格線後, Grid Box 就會將內部的區塊整齊排列在每一個格子中:

如果覺得增加一格就得多填寫一個寬度覺得很麻煩的話,也可以搭配 CSS 中的 repeat 將上方的 grid-template-columns 改成:

grid-template-columns: repeat(4, 100px);

這麼一來就會等於 100px 100px 100px 100px ,而如果有某欄要特別寬的時候也可以這麼做,是完全沒問題的:

// 會等同於 50px 50px 50px 250px
grid-template-columns: repeat(3, 50px) 250px;

grid-auto-rows & grid-auto-columns

在相對簡單的 Grid Box 中,只要確定每欄或每列的寬度一樣,那就可以使用 grid-auto-rowsgrid-auto-columns ,它會自動使用設定的寬度將 Grid Box 補滿:

grid-auto-rows: 100px;
grid-auto-columns: 100px;

結果會如下:

欸?顯示的結果變成垂直排列了?因為用 auto 的關係,所以觸發了另一個 Grid 的 auto 設定。

grid-auto-flow

這個屬性可以控制資料的流向是橫向或是垂直的,預設值為 row ,所以才會一個一個 row 排下來,因此只要把它改成 columns ,就會依照 columns 排列:

另外,對於每一格之間的寬度或高度,也有 px 外的另一個單位能做調整,那就是 frfr 是一個比例的概念,例如:

grid-template-columns: 1fr 1fr 2fr;

這麼設定的話會讓 Grid Box 產生三欄,並且每欄的寬度為 1/4 、 1/4 、 2/4 ,分母 4 是所有的 fr 加起來的總數,對總數做比例單位就是 fr

justify-content & align-content

在上一篇「 CSS | 所以我說那個版能不能好切一點? — Flex 基本用法」,中提到的對齊方式在 Grid 上也可以使用,至於主軸與次軸的分別就是以 grid-auto-flow 設定的值為主,以下分別為 rowcolumn 兩種情況做垂直置中:

第一個應該不會有問題,以 justify-content 設置主軸分散對齊, align-content 設置次軸置中,在 row 的情況下,次軸雖是置中了,但是主軸因為高度不夠的關係,所以沒有分散開來。

grid-template-areas & grid-area

接下來說明的屬性還滿有趣的,首先是 grid-area ,他可以為 Grid Box 內的區塊設置名稱,例如:

.item1 {
grid-area: A;
background: #afa;
}
.item2 {
grid-area: B;
background: #aaf;
}

之後回到 Grid Box ,上方的例子將整個區塊切成 2 * 4 的網格,如果有隔線,那整個區塊看起來會是這樣:

|__|__|__|__|
| | | | |

grid-template-areas 的用途就是以設定了 gird-area 名稱的區塊填滿每個格子:

grid-template-areas:
"A B B B"
"A B B B";

呈現出來的結果就會將該名稱的區塊放在對應的格子中:

是不是超神奇的?但是 grid-template-areas 也是有一些規則在的:

  1. grid-area 必須連續及不能斷開。
  2. grid-area 只能是 X * Y 的矩形。

依照這兩個規則,下方的設定都無法正確顯示結果:

// A 區塊已斷開
grid-template-areas:
"A B B A"
"A B B A";
// A 及 B 區塊不是正確的矩形
grid-template-areas:
"A B B B"
"A A B B";

好的,但是這麼做還是有缺點對吧?如果版面中的 Grid 有 10 * 10 或 20 * 20 的網格大小,那 grid-template-areas 的設定會變得很慘不忍睹,因此除了上述的方式外也能夠以 grid-row & grid-column 直接指定區塊的位置。

grid-row & grid-column

這兩個屬性都是簡寫,本來是叫做 grid-row-startgird-row-endgrid-column-startgrid-column-end 使用如下:

grid-row-start: 1;
grid-row-end: 2;

簡寫的話就等於:

grid-row: 1 / 2;

那它的意思是將指定區塊放到 Grid Box 的第一條線至第二條線,也就是起始線和終點線的意思,用起來結果如下:

上方的紫色區塊的 grid-row 設定為 1 / 2; gird-column2 / 5 ,也就是橫向第 1 條線到第 2 條線,直向第 2 條線到第 5 條線的位置,這裡不妨猜猜看綠色區塊的放置設定為何。

除了上述的 grid-rowgrid-column 外,也可以用 grid-area 一次將 rowcolumn 的位置指定完:

grid-area: row_start / column_start / row_end / column_end

結果會是相同的:

再提一個小技巧,因為 Grid 本身是一個網格系統,使用 gird-area 等屬性指定位置時,光算第幾條線的時候就可能會眼花,因此如果是最後一條線的話,可以使用 -1 來表示, -2 為倒數第二條…依此類推。

沒意外的話這會是排版系列的最後一篇文,因為之前參加了一些活動,堆著的設計稿還挺多的,所以接下來會開始實際練習切版,如果切版中有其他體會的話,會再把遇到的事情整理成文章。

如果對本文關於 Grid 的內容有任何不了解,或是覺得能夠再補充說明的地方,再麻煩留言告訴我,謝謝大家!

--

--