grid網格佈局使用
阿新 • • 發佈:2020-08-03
## 定義
grid佈局是指對網頁進行劃分成一個一個網格,然後根據自己的要求,可以任意組合。
![](https://user-gold-cdn.xitu.io/2020/7/29/1739979e6dd7a691?w=215&h=164&f=png&s=6967)
以前寫類似的功能,很麻煩,需要寫很多的CSS去控制,有了grid就很方便了,可以隨意進行組合。
跟flex有很多地方相似,包括有部分屬性。不同的地方也很突出,尤其是flex是一維,只有橫向。而grid是有橫向和縱向。另外grid功能要更強大點。
![](https://user-gold-cdn.xitu.io/2020/7/29/173997a65f3f8b89?w=227&h=234&f=png&s=12751)
![](https://user-gold-cdn.xitu.io/2020/7/29/173997b1578c1160?w=986&h=978&f=png&s=73074)
## 基本屬性
### display
通過對父元素進行設定display:grid,表示裡面包裹的元素全是網格佈局。
```
display:grid
```
### grid-template-columns/grid-template-cols
grid-template-columns:表示每行的寬度,有幾個表示每行有幾列,多出部分會往下排列
grid-template-cols:表示每列的寬度
```
.grid{
display: grid;
grid-template-columns: 50px 50px 50px 50px;
grid-template-rows: 50px 50px 50px 50px;
}
```
以上的程式碼表示橫向的每個item寬度和高度是50px,多出一個就會被自動排佈下去。
![](https://user-gold-cdn.xitu.io/2020/7/29/173997ce2faa4474?w=220&h=164&f=png&s=6944)
#### 單位
單位既可以是px,也可以是百分比,或者用auto
- px
```
.grid{
display: grid;
grid-template-columns: 50px 50px 50px 50px;
grid-template-rows: 50px 50px 50px 50px;
}
```
![](https://user-gold-cdn.xitu.io/2020/7/29/173997e8f42adc00?w=212&h=165&f=png&s=6941)
- 百分比
```
.grid{
display: grid;
grid-template-columns: 33.33% 33.33% 33.33%;
grid-template-rows: 33.33% 33.33% 33.33%;
}
```
![](https://user-gold-cdn.xitu.io/2020/7/29/173997e39a62c103?w=804&h=160&f=png&s=8893)
- auto 表示寬度或高度是剩餘的部分
```
.grid{
display: grid;
grid-template-columns: 33.33% 10% auto;
grid-template-rows: 33.33% 20% auto;
}
```
![](https://user-gold-cdn.xitu.io/2020/7/29/173997f7f9b330f3?w=827&h=158&f=png&s=8816)
#### repeat()
repeat()用來處理幾個item寬度相同的時候,避免寫相同的數值,或者是重複某種模式
```
.grid{
display: grid;
grid-template-columns: repeat(3,20%);
grid-template-rows: repeat(3,20%);
}
```
![](https://user-gold-cdn.xitu.io/2020/7/29/1739996dfeea1bcb?w=759&h=150&f=png&s=8646)
```
.grid{
display: grid;
grid-template-columns: repeat(3,100px 50px 100px);
grid-template-rows: repeat(3,100px 50px 100px);
}
```
![](https://user-gold-cdn.xitu.io/2020/7/29/1739980833b0ab37?w=766&h=114&f=png&s=7894)
#### auto-fill
當容器的寬度不確定,但是item的寬度確定,一行儘可能多的容納item,這時可以使用auto-fill
```
.grid{
display: grid;
grid-template-columns: repeat(auto-fill,100px);
}
```
![](https://user-gold-cdn.xitu.io/2020/7/29/17399816f897ffa1?w=512&h=110&f=png&s=7306)
#### fr
方便表示比例關係,使用fr來表示
```
.grid{
display: grid;
grid-template-columns: 1fr 2fr;
}
```
這表示後者是前者的2倍
![](https://user-gold-cdn.xitu.io/2020/7/29/17399842a4c6207e?w=571&h=262&f=png&s=9485)
fr也可跟px結合,會更方便
```
.grid{
display: grid;
grid-template-columns:100px 1fr 2fr;
}
```
上面程式碼表示第一列是100px,第二列是第三列的一半。
![](https://user-gold-cdn.xitu.io/2020/7/29/173998511f6fc3b9?w=570&h=163&f=png&s=8230)
#### minmax
表示最大值最小值
```
.grid{
display: grid;
grid-template-columns:1fr 2fr minmax(100px,1fr);
}
```
上面程式碼表示,最小值不小於100px,最大值不大於1fr
![](https://user-gold-cdn.xitu.io/2020/7/29/173998750ac3f848?w=554&h=160&f=png&s=8092)
### row-gap,column-gap,gap
row-gap:每行之間的間距
column-gap:每列之間的間距
gap:縮寫行/列間距
```
.grid{
display: grid;
grid-template-columns:1fr 2fr 1fr;
row-gap: 10px;
column-gap: 10px;
}
```
或者簡便的寫法:gap
```
.grid{
display: grid;
grid-template-columns:1fr 2fr 1fr;
gap: 10px;
}
```
上面程式碼表示行/列之間的間隔是10px
![](https://user-gold-cdn.xitu.io/2020/7/29/1739989fc7a089aa?w=625&h=180&f=png&s=8836)
### grid-area/grid-template-area
grid-area和grid-template-area,用來劃分區域,grid-area用來指定item的名稱,grid-template-area根據子區域的名稱來排布,表示展現的方式
```
.grid{
display: grid;
grid-template-columns:100px 100px 100px;
grid-template-rows: 100px 100px 100px;
grid-template-areas: "div1 div1 div1"
"div2 div3 div4"
"div5 div6 div7"
"div8 div9 div9";
}
.div1{
grid-area: div1;
background-color: tan;
}
```
上面程式碼表示div區域指代的grid的div1,整個頁面想展示的佈局是如下圖:
![](https://user-gold-cdn.xitu.io/2020/7/29/173998d7f0a8eeb2?w=309&h=360&f=png&s=9385)
### grid-auto-flow
網格佈局一般根據橫向依次排布,如果想豎向排序,可以設定grid-auto-flow
```
.grid{
display: grid;
grid-template-columns:100px 100px 100px;
grid-template-rows: 100px 100px 100px;
grid-auto-flow: column;
}
```
上面的程式碼表示按照豎向排序。
![](https://user-gold-cdn.xitu.io/2020/7/29/173998f46eeb070e?w=306&h=307&f=png&s=8704)
### justify-items/align-items/place-items
justify-items/align-items類似,一個是水平方向上的展示,一個是垂直方向上的展示,屬性一致
```
start:對齊起始位置
end:對齊結束位置
center:居中展示
stretch:拉伸至整個寬度
```
justify-items:設定的是item的水平方向展現方式。
```
.grid{
display: grid;
grid-template-columns:100px 100px 100px;
grid-template-rows: 100px 100px 100px;
justify-items: center;
}
```
上面程式碼表示每個item居中展示
![](https://user-gold-cdn.xitu.io/2020/7/29/1739990448b1f356?w=310&h=308&f=png&s=11843)
align-items:設定的是垂直方向上的展現方式。
```
.grid{
display: grid;
grid-template-columns:100px 100px 100px;
grid-template-rows: 100px 100px 100px;
align-items: center;
}
```
上面程式碼表示item在垂直方向上居中展示
![](https://user-gold-cdn.xitu.io/2020/7/29/17399913fecd63a0?w=310&h=313&f=png&s=12173)
place-items是align-items和justify-items的結合
```
place-items: