概述
相信大家在一些佈局的時候會用到flex佈局,但是flex佈局只是一維佈局,而grid是二維佈局神器,所以我就把這篇文章分享給大家,希望大家能夠喜歡。
grid介紹
針對於Web佈局而言,個人認為Grid佈局將是Web佈局的神器,它改變了以往任何一種佈局方式或者方法。不管以前的採用什麼佈局方法都可以說是一維的佈局方式,而Grid最大的特色,是一個基於網格的二維佈局系統,目的是用來優化使用者介面設計。
1.啟用grid容器
我們使用display
屬性來定義一個網格容器,它的grid
值決定了容器展現為塊級還是內聯形式。一旦啟用網格容器,它的所有子元素都進入grid
文件流,稱為網格子項。
display: grid | inline-grid | subgrid
複製程式碼
grid
:定義一個塊級的網格容器inline-grid
:定義一個內聯的網格容器subgrid
:定義一個繼承其父級網格容器的行和列的大小的網格容器,它是其父級網格容器的一個子項。
tips: column, float, clear和vertical-align
對網格容器沒有效果。
2、網格容器的屬性
2.1grid-template-columns/grid-template-rows
用法:
grid-template-columns: <track-size> ... | <line-name> <track-size> ...;
grid-template-rows: <track-size> ... | <line-name> <track-size> ...;複製程式碼
<track-size>
:定義網格單元的寬高,其單位可以是一個長度(如px、em、rem、vw、vh)或百分比,也可以是網格中自由空間的份數(單位為fr)。<line-name>
:定義網格線的名稱,它不是必須值。可以一個你選擇的任意名字,當沒有顯示設定時,它的名字以數字表示。
例項:
css:
.container {
width: 500px;
height: 500px;
display: grid;
grid-template-columns: 33% 33% 33%;
grid-template-rows: 33% 33% 33%;
}
.container div {
border: 1px solid #000;
}複製程式碼
html:
<div class="container">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>複製程式碼
最終效果
也可以通過命名來寫效果一樣,多個命名的話要加上空格隔開
.container{
grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end];
}複製程式碼
如果你定義了容器的重複部分,你可以使用repeat()
方法來生成多個相同值:
.container{
grid-template-columns: repeat(3, 33%);
}
/* 等價於 */
.container{
grid-template-columns: 33% 33% 33%
}複製程式碼
.container{
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 1fr);
}
複製程式碼
上邊這個是平均分成三份比設為33%要好很多,效果圖也差不多。
tips:自由空間是在固定子項確定後開始計算的.
2.2 grid-template-areas
grid-area
定義一個顯式的網格區域。grid-template-areas
定義網格區域,然後使用grid-area
呼叫宣告好的網格區域名稱來放置對應的網格專案。grid-template-areas: "<grid-area-name> | . | none | ..." "..."
複製程式碼
<grid-area-name>
:在grid-area
中指定的網格區域名字.
:一個句點表示一個空的網格單元none
:沒有網格區域被定義
例項:
css:
.item-a{
grid-area: header;
background: black;
}
.item-b{
grid-area: main;
background: blue;
}
.item-c{
grid-area: sidebar;
background: chartreuse;
}
.item-d{
grid-area: footer;
background: red;
}
.container{
width: 500px;
height:200px;
margin-top: 20px;
display:grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
grid-template-areas: "header header . footer" "main main . sidebar" "main main . sidebar";
}
複製程式碼
html:
<div class="container">
<div class="item-a"></div>
<div class="item-b"></div>
<div class="item-c"></div>
<div class="item-d"></div>
</div>複製程式碼
最終效果
2.3 grid-column-gap/grid-row-gap/grid-gap
grid-column-gap: <line-size>grid-row-gap: <line-size>複製程式碼
<line-size>
:長度值
grid-column-gap
和grid-row-gap
的簡稱:grid-gap: <grid-column-gap> <grid-row-gap>複製程式碼
grid-row-gap
的值將和grid-column-gap
一樣。例項:
css:
.container {
width: 500px;
height: 500px;
display: grid;
grid-template-columns: repeat(3, 30%);
grid-template-rows: repeat(3, 30%);
grid-column-gap: 2%;
grid-row-gap: 2%;
}複製程式碼
html:
<div class="container">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
複製程式碼
最終效果
2.4 justify-items/align-items
align-items
則相反,是和行軸對齊),這個值對容器裡面的所有網格子項都有用,flex裡邊沒有這個屬性。justify-items: start | end | center | stretch複製程式碼
start
:內容和網格區域的左邊對齊end
:內容和網格區域的右邊對齊center
:內容和網格區域的中間對齊stretch
:填充整個網格區域的寬度(預設值)
align-items
align-items: start | end | center | stretch;
複製程式碼
start
:內容和網格區域的頂部對齊end
:內容和網格區域的底部對齊center
:內容和網格區域的中間對齊stretch
:填充整個網格區域的高度(預設值)
2.5 justify-content/align-content
justify-content: start | end | center | stretch | space-around | space-between | space-evenly ;
複製程式碼
start
:左對齊end
:右對齊center
:居中對齊stretch
:填充網格容器space-around
:在每個網格子項中間放置均等的空間,在始末兩端只有一半大小space-between
:兩邊對齊,在每個網格子項中間放置均等的空間,在始末兩端沒有空間space-evenly
:網格間隔相等,包括始末兩端
align-content: start | end | center | stretch | space-around | space-between | space-evenly
複製程式碼
start
:頂部對齊end
:底部對齊center
:居中對齊stretch
:填充網格容器space-around
:在每個網格子項中間放置均等的空間,在始末兩端只有一半大小space-between
:上下對齊,在每個網格子項中間放置均等的空間,在始末兩端沒有空間space-evenly
:在每個網格子項中間放置均等的空間,包括始末兩端
上邊的屬性除了justify-items之外其餘的屬性flex都有這個我就不舉例了。
2.6 grid-auto-columns/grid-auto-rows
grid-auto-columns: <track-size>grid-auto-rows: <track-size>複製程式碼
<track-size>
:可以是一個長度,百分比或者是一個網格中自由空間的份數(通過使用fr單位)
.container{
display: grid;
grid-template-columns: 60px 60px;
grid-template-rows: 90px 90px
}複製程式碼
我們建立了一個2*2的網格
但現在想象你使用grid-column和grid-row
來定位你的網格子項,就像這樣:
.item-a{
grid-column: 1 / 2;
grid-row: 2 / 3;
}
.item-b{
grid-column: 5 / 6;
grid-row: 2 / 3;
}複製程式碼
grid-auto-columns
和grid-auto-rows
來指定這些隱式網格軌跡的寬度:.container{
grid-auto-columns: 60px;
}複製程式碼
例項:
css:
.container3 {
display: grid;
grid-template-columns: 60px 60px;
grid-template-rows: 90px 90px;
grid-auto-columns: 60px;
}
.item1{
background: red;
grid-column: 1 / 2;
grid-row: 2 / 3;
}
.item2{
background: green;
grid-column: 5 / 6;
grid-row: 2 / 3;
}複製程式碼
html:
<div class="container3">
<div class="item1"></div>
<div class="item2"></div>
</div>複製程式碼
效果圖
2.7 grid-auto-flow
grid-auto-flow: row | column | row dense | column dense複製程式碼
row
:按照行依次從左到右排列column
:按照列依次從上到下排列dense
:按先後順序排列
例項:
css: grid-auto-flow設為row
.container4{
display: grid;
grid-template-columns: 200px 200px 200px 200px 200px;
grid-template-rows: 200px 200px;
grid-auto-flow: row;
color: #fff;
}
.item3{
grid-column: 1;
grid-row: 1 / 3;
background: red;
}
.item7{
grid-column: 5;
grid-row: 1 / 3;
background: bisque;
}
.item5{
background: black;
}
.item6{
background: blueviolet;
}
.item4{
background: blue;
}
複製程式碼
html:
<div class="container4">
<div class="item3">3</div>
<div class="item4">4</div>
<div class="item5">5</div>
<div class="item6">6</div>
<div class="item7">7</div>
</div>複製程式碼
效果:
grid-auto-flow設為column
2.8 grid
grid: none | <grid-template-rows> / <grid-template-columns> | <grid-auto-flow> [<grid-auto-rows> [ / <grid-auto-columns>] ];複製程式碼
3、網格子項的屬性
3.1 grid-column-start/grid-column-end/grid-row-start/grid-row-end/grid-column/grid-row
通過網格線來定義網格項的位置。grid-column-start
、grid-row-start
定義網格項的開始位置,grid-column-end
、grid-row-end
定義網格項的結束位置。
grid-column-start: <number> | <name> | span <number> | span <name> | auto ; grid-column-end: <number> | <name> | span <number> | span <name> | auto ;grid-row-start: <number> | <name> | span <number> | span <name> | auto ;
grid-row-end: <number> | <name> | span <number> | span <name> | auto ;複製程式碼
<number> | <name>
:可以是一個數字以適用被標記了數字號的網格線,或者是一個名字以適用命名了的網格線span <number>
:子項將跨越指定數字的網格軌跡span <name>
:子項將跨越指定名字之前的網格線auto
:自動佈局,自動跨越或者預設跨越一個。
例項:
css:
.item-a{
grid-column-start: 2;
grid-column-end: five;
grid-row-start: row1-start;
grid-row-end: 3
}複製程式碼
.item-b{
grid-column-start: 1;
grid-column-end: span col4-start;
grid-row-start: 2;
grid-row-end: span 2
}複製程式碼
grid-column是grid-column-start
和grid-column-end
的簡稱;grid-row
是grid-row-start
和grid-row-end
的簡稱。
grid-column: <start-line> / <end-line> | <start-line> / span <value>;
grid-row: <start-line> / <end-line> | <start-line> / span <value>;複製程式碼
例項:
css:
.item-c{
grid-column: 3 / span 2;
grid-row: third-line / 4;
}複製程式碼
3.2 grid-area
給網格子項取一個名字以讓它被由grid-template-areas
屬性建立的模板引用。同時,這個屬性還可以用來更簡短地表示grid-row-start+ grid-column-start + grid-row-end+ grid-column-end
。
grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;
複製程式碼
<name>
:選擇的名字<row-start> / <column-start> / <row-end> / <column-end>
– 可以是網格線的數字或名字
例項:
.item-d{
grid-area: header
}複製程式碼
作為grid-row-start+ grid-column-start + grid-row-end+ grid-column-end的一種簡寫:
.item-d{
grid-area: 1 / col4-start / last-line / 6
}複製程式碼
3.3 justify-self/align-self
(1)justify-self
讓網格子項的內容以列軸對齊(與之相反align-self
是跟行軸對齊),這個值可以應用在單個網格子項的內容中。
justify-self: start | end | center | stretch複製程式碼
start
– 讓內容在網格區域左對齊end
– 讓內容在網格區域右對齊center
– 讓內容在網格區域中間對齊stretch
– 填充著呢個網路區域的寬度(預設值)
(2)align-self
讓網格子項的內容以行軸對齊(與之相反justify-self
是跟列軸對齊),這個值可以應用在單個網格子項的內容中。
align-self: start | end | center | stretch複製程式碼
start
– 讓內容在網格區域上對齊end
– 讓內容在網格區域下對齊center
– 讓內容在網格區域中間對齊stretch
– 填充著呢個網路區域的高度(預設值)
如果覺得文章還不錯並對你有幫助的話,請分享給你的小夥伴,並點贊,點亮紅心的人最美,有什麼不懂得可以在底下留言哦。
如果想看原始碼的話可以去我的github上下載,歡迎star,github:https://github.com/Mr-MengBo/grid