搜尋

Grid 網格空間與命名

Grid 網格容器除了集合表格和彈性排版的優點,更特別的是可以針對空間或格線進行「命名」,當未來有指定元素要放入網格容器時,就能根據這些命名來定位,這篇教學會介紹 grid-template-areas 網格空間,以及如何使用命名的方式,更清楚的識別格線以及格線分隔出的空間,最後還會介紹使用 grid-template 和 grid 進行樣式屬性的縮寫。

延伸閱讀:Grid 網格容器與格線Grid 網格流向與間距Grid 排列網格項目Grid 網格項目對齊、順序與對齊

快速導覽:

CSS 教學 - Grid 網格空間與命名

網格格線的命名

在「使用 Grid 網格容器與格線」教學中已經學到網格格線的設定,設定的過程中,也可以適度的加入「格線名稱」,當未來有元素要定位時,就能根據指定的名稱進行定位,只要將名稱寫在「中括號」裡,就能命名這個位置的格線,格線的命名並「不會對網格寬度造成任何影響」,主要是作為後續網格擺放位置的參考線。

下方的範例會透過格線將網格容器分成 3x3 的網格,並設定水平網格格線名稱「col-start、col-1、col-2、col-end」以及垂直網格格線名稱「row-start、row-1、row-2、row-end」。

由於 column 和 row 使用不同的命名空間,使用相同名稱也不會有問題 ( 例如水平和垂直格線名稱為 start ),但同為 column 或同為 row 的格線就不能同樣名稱。

線上展示:https://codepen.io/oxxo/pen/NWQbNqJ

<!-- HTML 程式碼-->
<div class="g g1"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div>8</div><div></div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    height: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 55px;
  }
  .g1 {
    grid-template-columns: [col-start] 1fr [col-1] 1fr [col-2] 1fr [col-end];
    grid-template-rows: [row-start] 1fr [row-1] 1fr [row-2] 1fr [row-end];
  }

  .g div{border: 1px dashed #000;}
</style>

CSS 教學 - Grid 網格空間與命名 - Grid 網格格線命名

grid-template-areas 網格空間命名

grid-template-areas 是可以「替網格空間命名」的樣式屬性,沒有繼承特性,初始值為 none,撰寫的語法會根據 column 和 row 格線的設定,使用「矩陣」的方式設定各個網格的名稱,使用時有下列重點:

  • 使用一個以上的「.」表示「不需要名稱」的網格 ( ...... 都可以 )。
  • 相鄰網格名稱相同時,排版時會視為同一格 ( 延伸合併為一格的概念 )。
  • 一但設定了網格名稱,同時也會替網格周遭的格線「附加名稱」
  • 附加的格線名稱使用類似「別名」的方式不斷添加,換句話說同一條格線會有不同的名稱。
  • 矩陣排列時必須是「四邊形」,也就是 2x2、2x1、3x2...等,不能是 L 型、T 型或十字型等非四邊形,不然會造成名稱失效。

下方的範例會替一個具有格線名稱的 3x3 網格設定每一格的名稱,名稱設定後,會自動替網格四周的格線附加「名稱-start」或「名稱-end」的格線名稱,因為是「附加」的概念,同一條格線可能會同時具有多個名稱。

線上展示:https://codepen.io/oxxo/pen/XWvNdmd

<!-- HTML 程式碼-->
<div class="g g1"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div>8</div><div></div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    height: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 55px;
  }
  .g1 {
    grid-template-areas: 
      "header header header"
      "left . right"
      "footer footer footer";
    grid-template-columns: [col-start] 1fr [col-1] 1fr [col-2] 1fr [col-end];
    grid-template-rows: [row-start] 1fr [row-1] 1fr [row-2] 1fr [row-end];
  }

  .g div{border: 1px dashed #000;}
</style>

CSS 教學 - Grid 網格空間與命名 - grid-template-areas 網格空間命名

如果單純只是看「網格名稱」或「格線名稱」,會完全感受不到這些名稱對於網格容器有什麼影響,因為這些名稱必須搭配其他「網格項目」元素操作,類似先把櫃子的空間以及這個空間的名稱設定,就可以將特定的物品放入特定名稱的網格,下方範例會將 grid-column-startgrid-column-end 等樣式屬性加入網格項目,該項目就會自動填滿網格名稱或格線名稱所構成的範圍。

線上展示:https://codepen.io/oxxo/pen/BaXQKoG

<!-- HTML 程式碼-->
<div class="g g1">
  <div class="header"></div>
  <div class="left"></div>
  <div></div>
  <div class="right"></div>
  <div class="footer"></div>
</div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 300px;
    height: 300px;
    display: grid;
    border: 1px solid #000;
    margin: 5px 0 55px;    
  }
  .g1 {
    grid-template-areas: 
      "header header header"
      "left . right"
      "footer footer footer";
    grid-template-columns: [col-start] 1fr [col-1] 1fr [col-2] 1fr [col-end];
    grid-template-rows: [row-start] 1fr [row-1] 1fr [row-2] 1fr [row-end];
  }

  .g div{border: 1px dashed #000;}

  .header{
    background: #fc6;
    grid-column-start: header;  /* 從網格名稱 header 開始 */
    grid-column-end: header;    /* 到網格名稱 header 結束 */
  }
  .left{
    background: #f6f;
    grid-column-start: left;  /* 從網格名稱 left 開始 */
    grid-column-end: left;    /* 從網格名稱 left 結束 */
  }
  .right{
    background: #999;
    grid-column-start: right-start;  /* 從格線名稱 right-start 開始 */
    grid-column-end: right-end;      /* 從格線名稱 right-end 結束*/
  }
  .footer{
    background: #0c0;
    grid-column-start: footer-start;  /* 從格線名稱 footer-start 開始 */
    grid-column-end: footer-end;      /* 從格線名稱 footer-end 結束*/
  }
</style>

CSS 教學 - Grid 網格空間與命名 - grid-template-areas 搭配其他樣式屬性

grid-template 樣式屬性縮寫

grid-template 可以縮寫 grid-template-* 相關的樣式屬性,可以一次指定完成格線名稱、網格空間名稱、網格大小...等常用設定樣式屬性,撰寫方式使用「/」分隔 row 和 column 各自的屬性值,格式為「row / column」,且「不支援 repeat 語法」

下方範例使用三種不同的縮寫方式,雖然都能產生相同的結果,但仍會有下列的差異:

寫法 網格空間名稱 網格空間自動格線名稱 格線名稱 列和欄的尺寸
g1 沒有
g2
g3 沒有 沒有 沒有

線上展示:https://codepen.io/oxxo/pen/qBeRzdp

<!-- HTML 程式碼-->
<div class="g g1"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
<div class="g g2"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
<div class="g g3"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 200px;
    height: 200px;
    outline: 1px solid #000;
    margin: 10px 10px 20px;
    display: grid;
  }
  .g1 {
    grid-template: 
      "a a a" 20px
      "b c c" 50px
      "b d d" 130px/
      50px 1fr 1fr;
  }
  .g2 {
    grid-template: 
      [r1] "a a a" 20px
      [r2] "b c c" 50px
      [r3] "b d d" 130px [r4]/
      [c1] 50px [c2] 1fr [c3] 1fr [c4];
  }
  .g3 {
    grid-template: 20px 50px 130px/ 
      50px 1fr 1fr;
  }
  .g div {outline: 1px solid #000;}
</style>

CSS 教學 - Grid 網格空間與命名 - grid-template 樣式屬性縮寫

如果完全不設定列或欄的尺寸也可以,就會使用網格名稱自動分配空間,下方範例只會設定網格空間名稱,就會變成正方形九宮格的呈現方式 ( 注意,如果要設定格線名稱,就必須設定列或欄的尺寸 )。

線上展示:https://codepen.io/oxxo/pen/RwXKzPe

<!-- HTML 程式碼-->
<div class="g"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>


<!-- CSS 程式碼 -->
<style>
  .g {
    width: 200px;
    height: 200px;
    outline: 1px solid #000;
    margin: 10px 10px 20px;
    float: left;
    display: grid;
    grid-template: 
      "a a a"
      "b c c"
      "b d d";
  }
  .g div {outline: 1px solid #000;}
</style>

CSS 教學 - Grid 網格空間與命名 - grid-template 使用網格名稱自動分配空間

grid 樣式屬性縮寫

grid 也是一個「縮寫」相關的樣式屬性,用法和 grid-template 大同小異,差別在於可以額外設定 grid-flowgrid-auto-rowsgrid-auto-columns 相關樣式屬性 ( 參考「Grid 網格流向與間距」),設定時有下列三種寫法 :

  • 類似 grid-template 寫法:
    • grid-template-rows / grid-template-columns
  • row 流向寫法 ( 流向後方數值為 row 的自動尺寸 ):
    • auto-flow grid-auto-rows / grid-template-columns
    • auto-flow dense grid-auto-rows / grid-template-columns
  • column 流向寫法 ( 流向後方數值為 column 的自動尺寸 ):
    • grid-template-rows / auto-flow grid-auto-columns
    • grid-template-rows / auto-flow dense grid-auto-columns

下方使用三個範例,分別呈現三種寫法,以及對應完整的樣式屬性。

線上展示:https://codepen.io/oxxo/pen/BaXpgZB

<!-- HTML 程式碼-->
<div class="g g1"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div><div>12</div></div>
<div class="g g2"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div><div>12</div></div>
<div class="g g3"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div><div>11</div><div>12</div></div>

<!-- CSS 程式碼 -->
<style>
  .g {
    width: 200px;
    height: 200px;
    outline: 1px solid #000;
    margin: 10px 10px 20px;
    display: grid;
  }
  .g1 {
    grid: 
      "a a a" 20px
      "b c c" 40px
      "b d d" 60px
      "b d d" 80px/
      50px 1fr 1fr;
  }
  .g2 {
    grid: 
      20px 50px 130px/
      auto-flow dense 20px 1fr;
  }
  .g3 {
    grid: 
      auto-flow dense 20px 45px/
      1fr 1fr;
  }
  .g div {outline: 1px solid #000;}
</style>

CSS 教學 - Grid 網格空間與命名 - grid 樣式屬性縮寫

小結

「網格命名」或「格線命名」是操作網格容器的重要技巧,雖然不使用名稱也可以正常運作 ( 透過格線的順序 ),但名稱能讓格線或網格更有意義,後續維護也更容易識別,此外,使用縮寫的方式雖然可以大幅減少程式碼,但如果對於語法不熟悉,反而容易搞不清楚縮寫的意義,建議熟練之後再使用縮寫會更恰當。

延伸閱讀:Grid 網格容器與格線Grid 網格流向與間距Grid 排列網格項目Grid 網格項目對齊、順序與對齊

意見回饋

如果有任何建議或問題,可傳送「意見表單」給我,謝謝~

CSS 教學

基本介紹

認識 CSS 開始使用 CSS CSS 語法規則 CSS 命名原則

CSS 選擇器

認識 CSS 選擇器 優先順序 ( 權重 ) 樣式繼承與聯集 元素選擇器 ID 和 Class 選擇器 屬性選擇器 文件結構選擇器 虛擬類別選擇器 ( 結構 ) 虛擬類別選擇器 ( 類型 ) 虛擬類別選擇器 ( 輸入 ) 虛擬類別選擇器 ( 行為 ) 虛擬類別選擇器 ( 超連結 ) 虛擬類別選擇器 ( 邏輯 ) 虛擬類別選擇器 ( 其他 ) 虛擬元素選擇器 群組與組合選擇器

數值與單位

關鍵字與文字數值 長度與角度單位 顏色單位 位置名稱與時間單位

變數與內容函式

變數 數學計算 文字與清單計數 生成內容與引號

顏色與濾鏡

色彩模型 漸層色 影像濾鏡

文字樣式

使用通用字型 使用外部字型 @font-face 定義字型 文字尺寸 常用文字樣式 文字換行 文字空白與 Tab 大小 文字行高與縮排 文字水平與垂直對齊 文字書寫方向 特殊文字樣式

元素容器

容器顯示類型 ( display ) 元素 display 對照表 盒子模型 ( Box Model ) 寬度與高度 內邊距 ( padding ) 外邊界 ( margin ) 邊框 ( border ) 邊框圓角 影像邊框 輪廓 ( outline ) 可見性與透明度 內容溢出與裁切

背景與陰影

背景顏色 背景圖 ( 定位、尺寸 ) 背景圖 ( 固定、重複 ) 背景圖 ( 多重背景、混合 ) 背景縮寫 ( background ) 容器陰影 ( box-shadow )

清單與表格

清單樣式 清單計數器 定義計數規則 表格基本樣式 表格邊框樣式 表格內容寬度與對齊

基本排版與定位

元素排版方式 浮動 ( float ) 浮動形狀 定位 ( position )

Flexbox 彈性排版

Flexbox 彈性盒子 Flexbox 對齊方式 Flexbox 彈性伸縮

Grid 網格排版

Grid 網格容器與格線 Grid 網格空間與命名 Grid 網格流向與間距 Grid 排列網格項目 Grid 項目對齊與順序

轉場與動畫

轉場 ( transition ) 轉場觸發事件 動畫 ( animation ) 動畫觸發事件 多重動畫的權重與順序

變形、裁切與遮罩

裁切路徑 ( clip-path ) 影像遮罩 ( mask )