羊了個(gè)羊的中強(qiáng)大的Grid布局
Grid布局中的概念
Grid 布局則是將容器劃分成“行"和“列”,產(chǎn)生單元格,然后指定"項(xiàng)目所在”的單元格,可以看作是二維布局,F(xiàn)lex布局是軸線布局,只能指定"項(xiàng)目"針對(duì)軸線的位置,可以看作是一維布局,Grid布局遠(yuǎn)比Flex布局強(qiáng)大。
學(xué)習(xí)grid布局首先要了解一些名詞概念的含義
- 網(wǎng)格容器: 把一個(gè)元素設(shè)為網(wǎng)格容器的方法,添加屬性
display: grid/inline-grid
;容器上有它專門的屬性; - 網(wǎng)格線:或稱為網(wǎng)格軌道,把網(wǎng)格容器內(nèi)的網(wǎng)格單元分割開,用瀏覽器的Grid Inspector 功能可看到網(wǎng)格線;
- 網(wǎng)格項(xiàng)目:或稱網(wǎng)格元素,就是放在網(wǎng)格容器內(nèi)的內(nèi)容;
- 網(wǎng)格單元/網(wǎng)格區(qū)域:網(wǎng)格元素中的最小單位,多個(gè)網(wǎng)格單元可稱為網(wǎng)格區(qū)域;
- 網(wǎng)格間距:網(wǎng)格線/網(wǎng)格軌道的寬度稱為成網(wǎng)格間距;
- 嵌套網(wǎng)格:網(wǎng)格容器內(nèi)可嵌套另一個(gè)或幾個(gè)網(wǎng)格;
- Grid Inspector:瀏覽器提供的方便查看grid布局的工具;
幾個(gè)函數(shù)、單位
有幾個(gè)grid布局中特有的單位/函數(shù)
- fr:網(wǎng)格容器中可用空間的一等分
- repeat():標(biāo)識(shí)多個(gè)重復(fù)部分,例如
repeat(3, 100px)
,表示3個(gè)100px; - minmax():函數(shù)產(chǎn)生一個(gè)長(zhǎng)度范圍,表示長(zhǎng)度就在這個(gè)范圍之中,它接受兩個(gè)參數(shù),分別為最小值和最大值,比如
minmax(100px, 200px)
表示長(zhǎng)度范圍是最小值100px,最大值200px; - span:跨度,網(wǎng)格線布局時(shí),表示網(wǎng)格項(xiàng)目跨幾個(gè)網(wǎng)格單元;
- auto-fill:有時(shí)網(wǎng)格單元的大小是固定的,但是容器的大小不確定,這個(gè)屬性會(huì)根據(jù)容器大小盡可能多的分配網(wǎng)格,剩余的均分給網(wǎng)格單元;空白的網(wǎng)格單元留空;
- auto-fit:有時(shí)網(wǎng)格單元的大小是固定的,但是容器的大小不確定,這個(gè)屬性會(huì)根據(jù)容器大小盡可能多的分配網(wǎng)格,剩余的均分給網(wǎng)格單元;空白的網(wǎng)格單元不留空,再次均分給網(wǎng)格單元;
auto-fill 與 auto-fit的區(qū)別
ul { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); // grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); }
其中核心為:grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));意思每個(gè)子元素至少需要200px的寬度,如果視口寬度足夠就平均分配剩余空間給每個(gè)子元素,至于換行問題需要看分配的所有的軌道空間夠不夠200,如果不夠200就換一行,把多的元素?fù)Q行,比如有580px(不考慮gap),不足以容納3*200=600,3個(gè)子元素,那么就換行,一行兩個(gè)子元素,那么剩余的80px呢,這就屬于剩余空間 ,將(1fr)平均分配給兩個(gè)軌道。
這里涉及填充模式中的auto-fit
和auto-fill
的區(qū)別,auto-fit
和auto-fill
只有在容器寬度大于子元素的最小寬度總和時(shí)才有顯示區(qū)別,例如容器隨著窗口現(xiàn)在有1500px寬度,子元素在一行排列總共需要600px(不考慮gap)。
auto-fit
和auto-fill
首先會(huì)盡可能多的創(chuàng)建基于min的200px的軌道寬度,例如創(chuàng)建1500/200=7.5。那么會(huì)有7個(gè)軌道的200px還剩余了100px的剩余空間,接著會(huì)把這100px再次分配到這7個(gè)軌道中,100/7=14.28。所以每個(gè)軌道的寬度現(xiàn)在為214.28px。到這里auto-fill
和auto-fit
做的事情是一樣的:
1.首先盡可能的以最小寬度創(chuàng)建軌道;
2.不足一個(gè)軌道的空間,等分給已有的軌道;
接下來:auto-fil
auto-fill
對(duì)空白軌道的處理不同
3.auto-fill
不占用空白軌道,auto-fit
把空白軌道均分給有內(nèi)容軌道;
值得注意的是這種區(qū)別是在容器中元素?cái)?shù)量元素的最小寬度<容器的總寬度時(shí)才會(huì)顯示看到的差異,如果元素?cái)?shù)量最小寬度>容器寬度,那么auto-fill
和auto-fit
展現(xiàn)的效果是一樣的
Grid布局和其他布局的區(qū)別
- 傳統(tǒng)布局方式:利用position屬性 + display屬性 + float屬性布局, 兼容性最好, 但是效率低, 麻煩!
- flex布局方式:有自己的一套屬性, 效率高, 學(xué)習(xí)成本低, 兼容性強(qiáng)!
- grid布局:網(wǎng)格布局(grid)是最強(qiáng)大的布局方案, 但是知識(shí)點(diǎn)比較多, 學(xué)習(xí)成本相對(duì)較高, 目前兼容性不如flex布局!另外grid布局可通過設(shè)置屬性變?yōu)楹蚮lex布局一樣的效果。
網(wǎng)格線編號(hào)布局
當(dāng)你使用網(wǎng)格布局時(shí),編號(hào)線總是存在。這些線從 1 開始按行和列編號(hào)。
例如:我們定義一個(gè)三行三列的布局如下,行和列方向上我們有 4 條線。
.wrapper { display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(3, 100px); }
現(xiàn)需要一個(gè)網(wǎng)格區(qū)域是從最左上角開始,橫向占一列,縱向占三行,可以如下寫:
grid-column-start: 1; grid-column-end: 2; grid-row-start: 1; grid-row-end: 4;
grid-column
和grid-row
可簡(jiǎn)寫如下:
grid-column: 1/2; grid-row: 1/4;
可用默認(rèn)跨度為1簡(jiǎn)寫如下:
grid-column-start: 1; grid-row-start: 1; grid-row-end: 4;
可用默認(rèn)跨度為1加上grid-column
和grid-row
可簡(jiǎn)寫:
grid-column: 1; grid-row: 1/4;
可使用grid-area
簡(jiǎn)寫為:
grid-area: 1/1/4/2;
可使用span
表示跨度簡(jiǎn)寫為:
grid-column: 1; grid-row: 1 / span 3;
網(wǎng)格線名稱布局
用grid-template-rows
和grid-template-columns
屬性定義網(wǎng)格時(shí),可命名網(wǎng)格線;
.wrap { display: grid; grid-template-columns: [main-start] 1fr [content-start] 1fr [content-end] 1fr [main-end]; grid-template-rows: [main-start] 100px [content-start] 100px [content-end] 100px [content-end]; }
用grid-area
命名網(wǎng)格區(qū)域,則隱式的創(chuàng)建行列網(wǎng)格線;
例如:
grid-area: hd;
則隱式的命名網(wǎng)格線: hd-start
hd-end
用[sidebar-start main-start]
可定義網(wǎng)格線的多個(gè)名字;
有了網(wǎng)格線名稱則可以用來定位布局項(xiàng)目:
.box1 { grid-column-start: main-start; grid-column-end: main-end; grid-row-start: main-start; grid-row-end: main-end; }
網(wǎng)格區(qū)域名稱布局
使用grid-area
命名網(wǎng)格區(qū)域,在網(wǎng)格容器內(nèi)用grid-template-areas
指定區(qū)域位置:
.header { grid-area: hd } .footer { grid-area: ft } .sidebar { grid-area: sb } .content { grid-area: main } .wrap { display: grid; grid-template-rows: minmax(100px, auto); grid-template-columns: repeat(3 1fr); grid-template-areas: "hd hd hd" "sb main main" "ft ft ft" }
使用grid-template
可同時(shí)設(shè)置屬性:grid-template-rows
、grid-template-columns
、grid-template-areas
上例可簡(jiǎn)寫:
.header { grid-area: hd } .footer { grid-area: ft } .sidebar { grid-area: sb } .content { grid-area: main } .wrap { display: grid; grid-template: "hd hd hd" minmax(100px auto) "sb main main" minmax(100px auto) "ft ft ft" minmax(100px auto) / 1fr 1fr 1fr }
使用grid
可同時(shí)設(shè)置屬性:grid-template-rows
、grid-template-columns
、grid-template-areas
、grid-auto-rows
、grid-auto-columns
、grid-auto-flow
;注:此屬性會(huì)把 grid-gap
值重置為0;
上例可簡(jiǎn)寫:
.header { grid-area: hd } .footer { grid-area: ft } .sidebar { grid-area: sb } .content { grid-area: main } .wrap { display: grid; grid: "hd hd hd" minmax(100px auto) "sb main main" minmax(100px auto) "ft ft ft" minmax(100px auto) / 1fr 1fr 1fr }
grid-template-areas
中留空的單元用句點(diǎn)符'.'占位;
Grid布局軸線對(duì)齊
網(wǎng)格布局方式下共有兩條軸線用于對(duì)齊——塊軸(一般垂直方向的)和行軸(內(nèi)聯(lián)軸)。塊方向的軸是采用塊布局時(shí)塊的排列方向。行軸與塊方向的軸垂直,它的方向和常規(guī)內(nèi)聯(lián)流中的文本方向一致。
對(duì)齊元素到塊軸的屬性是align-items align-self
作用在網(wǎng)格容器上的屬性 align-items
的取值有:
- auto
- normal
- start
- end
- center
- stretch
- baseline
- first baseline
- last baseline
作用在網(wǎng)格元素上的屬性 align-self
的取值同 align-items
對(duì)齊元素到行軸的屬性是justify-items justify-self
justify-items
作用在網(wǎng)格容器上,justify-self
作用在網(wǎng)格元素上,取指同以上兩個(gè)屬性。
place-items
屬性是對(duì) align-items
和 justify-items
的簡(jiǎn)寫。
place-self
屬性是對(duì) align-self
和 justify-self
的簡(jiǎn)寫。
對(duì)齊網(wǎng)格軌道到塊軸的屬性是 align-content
作用在網(wǎng)格容器上,其值有:
- normal
- start
- end
- center
- stretch
- space-around
- space-between
- space-evenly
- baseline
- first baseline
- last baseline
對(duì)齊網(wǎng)格軌道到行軸的屬性是 justify-content
其屬性值同align-content
,space-content
是對(duì) align-content
justify-content
的縮寫。
布局示例
- 使元素內(nèi)容水平、垂直居中
.wrapper { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: 200px; } .item1 { align-self: center; justify-self: center; }
- 使元素在網(wǎng)格容器內(nèi)水平、垂直居中
.wrapper { display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(3, 200px); grid-template-areas: ". . . " ". a . " ". . . "; } .item1 { grid-area: a; }
- 自動(dòng)填充網(wǎng)格軌道
.wrapper { display: grid; grid-template-columns: repeat(auto-fill, 200px); }
- 靈活的軌道數(shù)量
.wrapper { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
以上就是羊了個(gè)羊的中強(qiáng)大的Grid布局的詳細(xì)內(nèi)容,更多關(guān)于羊了個(gè)羊 Grid布局的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 羊了個(gè)羊通關(guān)腳本Vue?node實(shí)現(xiàn)版本
- JS實(shí)現(xiàn)羊了個(gè)羊小游戲?qū)嵗?/a>
- QT布局管理詳解QVBoxLayout與QHBoxLayout及QGridLayout的使用
- WPF使用Grid網(wǎng)格面板布局
- Python中Tkinter布局管理grid的使用
- Vue3.0利用vue-grid-layout插件實(shí)現(xiàn)拖拽布局
- 在echarts中圖例legend和坐標(biāo)系grid實(shí)現(xiàn)左右布局實(shí)例
- python GUI庫(kù)圖形界面開發(fā)之PyQt5布局控件QGridLayout詳細(xì)使用方法與實(shí)例
相關(guān)文章
JavaScript實(shí)現(xiàn)隊(duì)列結(jié)構(gòu)過程
這篇文章主要介紹了JavaScript實(shí)現(xiàn)隊(duì)列結(jié)構(gòu)的過程,隊(duì)列即Queue,它是受限的線性表,先進(jìn)先出,受限之處在于它只允許在表的前端進(jìn)行刪除操作,下面我們一起進(jìn)入文章學(xué)習(xí)更加詳細(xì)內(nèi)容,需要的朋友也可以參考一下2021-12-12前端Website?sitemap.xml文件搜索引擎優(yōu)化
這篇文章主要為大家介紹了前端Website的sitemap.xml文件和搜索引擎優(yōu)化實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05微信小程序 Canvas增強(qiáng)組件實(shí)例詳解及源碼分享
這篇文章主要介紹了微信小程序 Canvas增強(qiáng)組件實(shí)例詳解及源碼分享的相關(guān)資料,WeZRender是一個(gè)微信小程序Canvas增強(qiáng)組件,這里詳細(xì)介紹,需要的朋友可以參考下2017-01-01微信小程序 兩種滑動(dòng)方式(橫向滑動(dòng),豎向滑動(dòng))詳細(xì)及實(shí)例代碼
這篇文章主要介紹了微信小程序 兩種滑動(dòng)方式詳細(xì)及實(shí)例代碼的相關(guān)資料,這里對(duì)橫向滑動(dòng)和豎向滑動(dòng)都做介紹,需要的朋友可以參考下2017-01-01mitt tiny-emitter發(fā)布訂閱應(yīng)用場(chǎng)景源碼解析
這篇文章主要為大家介紹了mitt tiny-emitter發(fā)布訂閱應(yīng)用場(chǎng)景源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12超越Node.js的JavaScript運(yùn)行環(huán)境Bun.js功能特性詳解
這篇文章主要為大家介紹了超越Node.js的JavaScript運(yùn)行環(huán)境Bun.js功能特性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09