Grid 排列網格項目
網格格線規劃完成後,下一步就是按照格線規劃,將網格項目排列在指定的位置,這篇教學會介紹 grid-row-start、grid-row-end、grid-column-start、grid-column-end、grid-area 等排列網格項目的樣式屬性,透過這些針對「網格項目」的樣式屬性,精準排列網格項目。
延伸閱讀:Grid 網格容器與格線、Grid 網格空間與命名、Grid 網格流向與間距、Grid 網格項目對齊、順序與對齊
快速導覽:
grid-row-start、grid-row-end、grid-column-start、grid-column-end
grid-row-start
、grid-row-end
、grid-column-start
、grid-column-end
這四個樣式屬性可以透過「網格格線編號」、「網格格線名稱」或「網格名稱」,指定網格項目在網格容器裡上下左右的位置,並根據位置決定這個項目如何排列,這四個屬性初始值都是 auto ( 自動一個接著一個,按照左到右、上到下的順序排列 ),沒有繼承屬性,簡單說明如下:
樣式屬性 | 說明 |
---|---|
grid-row-start |
上方位置。 |
grid-row-end |
下方位置,若未設定,預設值 auto 等同 1。 |
grid-column-start |
左側位置。 |
grid-column-end |
右側位置,若未設定,預設值 auto 等同 1。 |
使用格線編號
透過 grid-template-columns
和 grid-template-rows
建立的網格格線都有各自的編號,編號從左到右、或從上到下依序都是從 1 開始一直遞增,只要透過格線編號,就能指定網格項目位置,如果將編號範圍設定超過 1,就會產生不同尺寸的網格項目。
下方範例會將網格容器分成 4x4 共十六等分,透過 grid-row-start
、grid-row-end
、grid-column-start
、grid-column-end
這四個樣式屬性定位兩個 1x1 的項目 ( .demo
的 div 是為了凸顯網格和格線所建立的容器,和實際範例沒有關連 )。
<!-- HTML 程式碼-->
<div class="g demo"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
<div class="g">
<div class="a1"></div>
<div class="a2"></div>
</div>
<!-- CSS 程式碼 -->
<style>
.g {
width: 300px;
height: 300px;
outline: 1px solid #000;
position: absolute;
top: 50px;
left: 50px;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(4, 1fr);
}
.demo div {
z-index: 2;
outline: 1px dashed #000;
}
.a1 {
background: #f55;
grid-column-start: 1;
grid-column-end: 2;
grid-row-start: 1;
grid-row-end: 2;
}
.a2 {
background: #55f;
grid-column-start: 3;
grid-column-end: 4;
grid-row-start: 3;
grid-row-end: 4;
}
</style>
當「end減去 start」的數值等於 0 或沒有設定 end 數值,或 end 數值等於 0,end 就會自動使用「start 加 1」,表示往左或往下延伸一格,若相減後數值大於 1,網格項目的大小就會變大,若為負值則會往反方向延伸,表格說明如下:
網格排列方式 | 情境 |
---|---|
往左或往下延伸一格 | end 減去 start 數值為 0 或 1,或 end 等於 0。 |
往左或往下延伸相減後的數值 | end 減去 start 數值大於 1,但 end 不等於 0。 |
往反方向延伸相減後的「絕對值」 | end 減去 start 數值小於 1,end 不等於 0。 |
下方範例會用三個網格項目呈現不同的排列方式,第一個是單純的「2x2」項目,第二個是往「反方向延伸」的 2x2 項目,第三個是 grid-column-end
設定為 0 且沒有設定 grid-row-end
的項目。
<!-- HTML 程式碼-->
<div class="g demo"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
<div class="g">
<div class="a1"></div>
<div class="a2"></div>
<div class="a3"></div>
</div>
<!-- CSS 程式碼 -->
<style>
.g {
width: 300px;
height: 300px;
outline: 1px solid #000;
position: absolute;
top: 50px;
left: 50px;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(4, 1fr);
}
.demo div {
z-index: 2;
outline: 1px dashed #000;
}
.a1 {
background: #f55;
grid-column-start: 3;
grid-column-end: 5;
grid-row-start: 1;
grid-row-end: 3;
}
.a2 {
background: #55f;
grid-column-start: 3;
grid-column-end: 1;
grid-row-start: 3;
grid-row-end: 5;
}
.a3 {
background: #0c0;
grid-column-start: 4;
grid-column-end: 0;
grid-row-start: 4;
}
</style>
除了使用單純的格線編號,grid-column-end
和 grid-column-end
也可以在數字之前加上「span」指令,加上 span 指令後,數字代表的就是「幾格」,而不是原本的格線編號,下方範例會使用 span 而延伸的做法,將三個不同的網格項目都往右變成兩格。
<!-- HTML 程式碼-->
<div class="g demo"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
<div class="g">
<div class="a1"></div>
<div class="a2"></div>
<div class="a3"></div>
</div>
<!-- CSS 程式碼 -->
<style>
.g {
width: 300px;
height: 300px;
outline: 1px solid #000;
position: absolute;
top: 50px;
left: 50px;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(4, 1fr);
}
.demo div {
z-index: 2;
outline: 1px dashed #000;
}
.a1 {
background: #f90;
grid-column-start: 1;
grid-column-end: span 2;
grid-row-start: 1;
grid-row-end: 1;
}
.a2 {
background: #55f;
grid-column-start: 2;
grid-column-end: span 2;
grid-row-start: 2;
grid-row-end: 2;
}
.a3 {
background: #0c0;
grid-column-start: 3;
grid-column-end: span 2;
grid-row-start: 3;
grid-row-end: 3;
}
</style>
使用格線名稱
除了使用格線編號,也可以使用「Grid 網格空間與命名」教學中所介紹的「格線名稱」進行排版定位,下方會先將每條格線命名,接著就能透過名稱指定網格項目的位置和尺寸。
<!-- HTML 程式碼-->
<div class="g demo"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
<div class="g">
<div class="a1"></div>
<div class="a2"></div>
</div>
<!-- CSS 程式碼 -->
<style>
.g {
width: 300px;
height: 300px;
outline: 1px solid #000;
position: absolute;
top: 50px;
left: 50px;
display: grid;
grid-template-columns: [col-start] 1fr [col-1] 1fr [col-2] 1fr [col-3] 1fr [col-end];
grid-template-rows: [row-start] 1fr [row-1] 1fr [row-2] 1fr [row-3] 1fr [row-end];
}
.demo div {
z-index: 2;
outline: 1px dashed #000;
}
.a1 {
background: #f90;
grid-column-start: col-2;
grid-column-end: col-end;
grid-row-start: row-start;
grid-row-end: row-2;
}
.a2 {
background: #55f;
grid-column-start: col-start;
grid-column-end: col-2;
grid-row-start: row-2;
grid-row-end: row-end;
}
</style>
如果遇到「格線名稱相同」的狀況,則可以在格線名稱後方加上「數字」,透過數字標示「格線編號」,數字 1 表示第一條格線,數字 2 表示同名稱的第二條格線,其他依此類推,下方範例會將垂直格線名稱設為「oxxo col oxxo col oxxo」,水平格線名稱設為「xoox row xoox row xoox」,透過名稱和格線編號進行排版。
<!-- HTML 程式碼-->
<div class="g demo"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
<div class="g">
<div class="a1"></div>
<div class="a2"></div>
<div class="a3"></div>
</div>
<!-- CSS 程式碼 -->
<style>
.g {
width: 300px;
height: 300px;
outline: 1px solid #000;
position: absolute;
top: 50px;
left: 50px;
display: grid;
grid-template-columns: [oxxo] 1fr [col] 1fr [oxxo] 1fr [col] 1fr [oxxo];
grid-template-rows: [xoox] 1fr [row] 1fr [xoox] 1fr [row] 1fr [xoox];
}
.demo div {
z-index: 2;
outline: 1px dashed #000;
}
.a1 {
background: #f90;
grid-column-start: col 1;
grid-column-end: oxxo 3;
grid-row-start: xoox 1;
grid-row-end: row 1;
}
.a2 {
background: #55f;
grid-column-start: oxxo 1;
grid-column-end: oxxo 2;
grid-row-start: row 1;
grid-row-end: row 2;
}
.a3 {
background: #0c0;
grid-column-start: col 2;
grid-column-end: oxxo 3;
grid-row-start: row 2;
grid-row-end: xoox 3;
}
</style>
使用網格名稱
如果使用 grid-template-areas
設定網格空間名稱,設定後會自動在「同名稱的封閉空間」四周的網格線加上名稱,例如名稱為 oxxo 的網格,會產生水平和垂直方向的網格線,都會附加 oxxo-start 和 oxxo-end 名稱 ( 參考「Grid 網格空間與命名」 ),因此也可以透過這些附加的格線名稱進行定位,但需要注意同名稱的封閉空間裡「沒有自動添加的格線名稱」,下方範例會使用自動添加的格線名稱進行定位。
<!-- HTML 程式碼-->
<div class="g demo"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
<div class="g">
<div class="a1"></div>
<div class="a2"></div>
</div>
<!-- CSS 程式碼 -->
<style>
.g {
width: 300px;
height: 300px;
outline: 1px solid #000;
position: absolute;
top: 50px;
left: 50px;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(4, 1fr);
grid-template-areas:
"header header header header"
"col1 col2 col3 col4"
"col5 col6 col7 col8"
"footer footer footer footer"
}
.demo div {
z-index: 2;
outline: 1px dashed #000;
}
.a1 {
background: #f90;
grid-column-start: col3-start;
grid-column-end: header-end;
grid-row-start: header-start;
grid-row-end: col4-end;
}
.a2 {
background: #55f;
grid-column-start: header-start;
grid-column-end: col6-end;
grid-row-start: col5-start;
grid-row-end: footer-end;
}
</style>
grid-row、grid-column 樣式屬性縮寫
grid-row
是 grid-row-start
和 grid-row-end
的縮寫,grid-column
是grid-column-start
和 grid-column-end
的縮寫,start 和 end 使用「/
」分隔,start 在前 end 在後,並使用和四個樣式屬性相同的屬性值,寫法如下:
div {
display: grid;
grid-row: grid-row-start / grid-row-end;
grid-column: grid-column-start / grid-column-end;
}
下方修改之前「格線名稱相同」範例,將四個屬性值的寫法改成縮寫寫法,除了結果相同,整體 CSS 程式碼也更佳簡潔容易閱讀。
<!-- HTML 程式碼-->
<div class="g demo"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
<div class="g">
<div class="a1"></div>
<div class="a2"></div>
<div class="a3"></div>
</div>
<!-- CSS 程式碼 -->
<style>
.g {
width: 300px;
height: 300px;
outline: 1px solid #000;
position: absolute;
top: 50px;
left: 50px;
display: grid;
grid-template-columns: [oxxo] 1fr [col] 1fr [oxxo] 1fr [col] 1fr [oxxo];
grid-template-rows: [xoox] 1fr [row] 1fr [xoox] 1fr [row] 1fr [xoox];
}
.demo div {
z-index: 2;
outline: 1px dashed #000;
}
.a1 {
background: #f90;
grid-column: oxxo 2 / oxxo 3;
grid-row: xoox 1 / row 1;
}
.a2 {
background: #55f;
grid-column: oxxo 1 / oxxo 2;
grid-row: row 1 / row 2;
}
.a3 {
background: #0c0;
grid-column: col 2 / oxxo 3;
grid-row: row 2 / xoox 3;
}
</style>
grid-area 使用網格空間名稱排列
除了使用格線定位,還可以透過 grid-area
樣式屬性,根據「網格空間的名稱」進行定位,這種定位方式可以不用考慮太多格線名稱,快速將網格元素放入並填滿「網格封閉空間」,因此程式碼有時會更好理解,下方範例會使用 grid-area
放入五個網格元素,因為使用空間名稱的緣故,從程式碼就很好理解網格排版後的長相。
<!-- HTML 程式碼-->
<div class="g demo"><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div></div>
<div class="g">
<div class="a1"></div>
<div class="a2"></div>
<div class="a3"></div>
<div class="a4"></div>
<div class="a5"></div>
</div>
<!-- CSS 程式碼 -->
<style>
.g {
width: 300px;
height: 300px;
outline: 1px solid #000;
position: absolute;
top: 50px;
left: 50px;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(4, 1fr);
grid-template-areas:
"header header header side"
"menu oxxo oxxo side"
"menu oxxo oxxo side"
"menu footer footer footer"
}
.demo div {
z-index: 2;
outline: 1px dashed #000;
}
.a1 {
background: #f90;
grid-area: header;
}
.a2 {
background: #55f;
grid-area: menu;
}
.a3 {
background: #0c0;
grid-area: oxxo;
}
.a4 {
background: #f5b;
grid-area: footer;
}
.a5 {
background: #0ff;
grid-area: side;
}
</style>
小結
這篇教學介紹了多種放入網格項目的方法,這些方法可以根據不同的使用情境而變化,通常單純使用格線編號或網格空間名稱就能解決大部分的排版狀況,趕快將這些樣式屬性運用到自己的網站中吧。
延伸閱讀:Grid 網格容器與格線、Grid 網格空間與命名、Grid 網格流向與間距、Grid 網格項目對齊、順序與對齊
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~