常用Grid佈局屬性介紹 下麵從一個簡單Grid佈局例子說起。 CSS Grid 佈局由兩個核心組成部分是 wrapper(父元素)和 items(子元素)。 wrapper 是實際的 grid(網格),items 是 grid(網格) 內的內容。 下麵是一個 wrapper 元素,內部包含6個 i ...
常用Grid佈局屬性介紹
下麵從一個簡單Grid佈局例子說起。
CSS Grid
佈局由兩個核心組成部分是 wrapper
(父元素)和 items
(子元素)。 wrapper
是實際的 grid(網格
),items
是 grid(網格)
內的內容。
下麵是一個 wrapper 元素,內部包含6個 items :
<div class="wrapper"> <div>1</div> <div>2</div> <div>3</div> <div>4</div> <div>5</div> <div>6</div> </div>
要把 wrapper
元素變成一個 grid
(網格),只要簡單地把其 display
屬性設置為 grid
即可:
.wrapper { display: grid; }
Columns(列) 和 rows(行)
為了使其成為二維的網格容器,我們需要定義列和行。讓我們創建3列和2行。我們將使用grid-template-row
和grid-template-column
屬性。
.wrapper { display: grid; grid-template-columns: 100px 100px 100px; grid-template-rows: 50px 50px; }
grid-template-columns
的3個值表示三列,相應的數值表示列寬
即都為100px。grid-template-rows
的2個值表示兩行,相應的數值表示行高
即都為50px
得到的結果如下:
我們可以變化一下行高跟列寬的值看下效果,代碼:
.wrapper { display: grid; grid-template-columns: 200px 50px 100px; grid-template-rows: 100px 30px; }
效果如圖:
放置 items(子元素)
我們使用與之前相同的 HTML 標記,為了幫助我們更好的理解,我們在每個 items(子元素) 加上了單獨的 class :
<div class="wrapper"> <div class="item1">1</div> <div class="item2">2</div> <div class="item3">3</div> <div class="item4">4</div> <div class="item5">5</div> <div class="item6">6</div> </div>
創建一個 3×3 的 grid(網格):
.wrapper { display: grid; grid-template-columns: 100px 100px 100px; grid-template-rows: 100px 100px 100px; }
得到如下效果:
我們只在頁面上看到 3×2 的 grid(網格),而我們定義的是 3×3 的 grid(網格)。這是因為我們只有 6 個 items(子元素) 來填滿這個網格。如果我們再加3個 items(子元素),那麼最後一行也會被填滿。
要定位和調整 items(子元素) 大小,我們將使用 grid-column
和 grid-row
屬性來設置:
.item1 { grid-column-start: 1; grid-column-end: 4; }
當然可以有簡寫方式:
.item1 { grid-column: 1 / 4; }
上面代碼意思就是: item1 占據從第一條網格線開始,到第四條網格線結束。顯示效果如下:
如果你不明白我們設置的只有 3 列,為什麼有4條網格線呢?看看下麵這個圖像,黑色的列網格線你就明白了:
如果上面的看懂了,來個複雜點的鞏固下。
.item1 { grid-column-start: 1; grid-column-end: 3; } .item3 { grid-row-start: 2; grid-row-end: 4; } .item4 { grid-column-start: 2; grid-column-end: 4; }
效果如圖:
響應式佈局例子
實現如圖效果:
結構佈局
<style> .container { display: grid; grid-template-columns: repeat(12, 1fr); grid-template-rows: 50px 350px 50px; grid-gap: 5px; } </style> <div class="container"> <div class="header">HEADER</div> <div class="menu">MENU</div> <div class="content">CONTENT</div> <div class="footer">FOOTER</div> </div>
使用 grid-template-columns
屬性創建一個 12 列的網格,每個列都是一個單位寬度(總寬度的 1/12 )。(愚人碼頭註:其中, repeat(12, 1fr)
意思是 12 個重覆的 1fr 值。 fr
是網格容器剩餘空間的等分單位。)
使用 grid-template-rows
屬性創建 3 行,第一行高度是 50px ,第二行高度是 350px 和第三行高度是 50px。
使用 grid-gap
屬性在網格中的網格項之間添加一個間隙
。
添加 grid-template-areas
這個屬性被稱為網格區域
,也叫模板區域
,能夠讓我們輕鬆地進行佈局實驗。
要將它添加到網格中,我們只需給網格容器加一個 grid-template-areas
屬性即可。 語法可能有點奇怪,因為它不像其他的 CSS 語法。例如:
.container { display: grid; grid-gap: 5px; grid-template-columns: repeat(12, 1fr); grid-template-rows: 50px 350px 50px; grid-template-areas: "h h h h h h h h h h h h" "m m c c c c c c c c c c" "f f f f f f f f f f f f"; }
上面代碼創建3行12列,上面grid-template-areas
屬性中的值,每行代表一行,用網格術語來說是 網格軌道(Grid Track) ,每個字元( h,m,c,f
)代表一個網格單元格。愚人碼頭註:其實是 網格區域(Grid Area) 名稱,你可以使用任意名稱
。
你可能已經猜到,我選擇了字元 h,m,c,f,是因為他們是 header, menu, content 和 footer 的首字母。 當然,我可以把它們叫做任何想要的名稱,但是使用他們所描述的東西的第一個字元更加容易讓人理解。
給網格項設定網格區功能變數名稱稱
現在我們需要將這些字元與網格中的網格項建立對應的連接。 要做到這一點,我們將在網格項使用 grid-area
屬性:
.header { grid-area: h; } .menu { grid-area: m; } .content { grid-area: c; } .footer { grid-area: f; }
這樣就實現了上面的佈局效果。
嘗試其它佈局
1.把 menu 移到右邊
grid-template-areas:
“h h h h h h h h h h h h”
"c c c c c c c c c c m m”
“f f f f f f f f f f f f”;
實現後的效果:
2.使用點 .
來創建空白的網格單元格
grid-template-areas:
“. h h h h h h h h h h .”
"c c c c c c c c c c m m”
“. f f f f f f f f f f .”;
實現效果:
3.真正的響應式佈局
假設你想在移動設備上查看的是:標題旁邊是菜單。那麼你可以簡單地這樣做:
@media screen and (max-width: 640px) { .container { grid-template-areas: "m m m m m m h h h h h h" "c c c c c c c c c c c c" "f f f f f f f f f f f f"; } }
可以看到如下效果:
註:所有這些更改都是使用純 CSS 完成的,不需要修改 HTML 。這被稱為結構和表現分離, Grid(網格) 佈局真正做到了這點。
瀏覽器相容
如圖所示: