亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > CSS > 正文

解析CSS中的Grid布局完全指南

2024-07-11 08:59:52
字體:
來源:轉載
供稿:網友

Grid 是一個基于二維網格布局的系統,有了它我們可以非常方便的實現過去很復雜布局,無需再使用 float , inline-block , position 這些本質上是 hack 的方法。

CSS網格布局擅長于將一個頁面劃分為幾個主要區域,以及定義這些區域的大小、位置、層次等關系(前提是HTML生成了這些區域)。

它像表格一樣,網格布局讓我們能夠按行或列來對齊元素。 然而在布局上,網格比表格更可能做到或更簡單。

網格布局概念

在學習之前需要了解以下網格的幾個概念。

網格軌道(Grid Tracks)

網格軌道 是兩條網格線之間的空間。它們通過使用屬性 grid-template-columnsgrid-template-rows 在網格中定義。

上圖中有兩行三列,一行或一列就叫做軌道。

網格線(Grid Lines)

使用 Grid 布局在顯式網格中定義軌道的同時會創建網格線。

網格線可以用它們的編號來尋址。在從左到右的語言中, 列線1 將位于網格的左側, 行線1 將位于其頂部。線編號遵循文檔的寫入模式,因此在從右到左的語言中, 列線1 行將位于網格的右側。下面的圖片展示了該網格的線編號,假設語言是從左到右的。

 

網絡單元格(Grid Cell)

Grid 布局中,網絡單元格是 CSS 網格中的最小單元。它是四條網格線之間的空間,非常像表格單元格。

 

網格區域(Grid Areas)

網格區域是網格中由一個或者多個網格單元格組成的一個矩形區域。本質上,網格區域一定是矩形的。例如,不可能創建T形或L形的網格區域。

 

網格間距(Gutters)

網格間距是網格軌道之間的間距,可以通過 grid-column-gap , grid-row-gap 在Grid布局中創建。

 

使用 Grid 布局

和 flex 類似,要使用網格布局,首先要有一個容器,將一個元素的 display 設置為 grid 就可以得到一個 grid 容器。容器的子項就是網格項(grid items),它有點類似 table 中的 td ,但是更加靈活。

float , clear , 和 vertical-align 元素對網格容器不起作用。

容器上的屬性

網格模板

創建了網格容器,我們就可以定義這個網格有多少行有多少列,并且每一行每一列的大小。

grid-template-rows

我們使用 grid-template-rows 來顯性定義網格有多少行。它可以取如下的值:

none 關鍵字,表示不明確的網格。所有的行和其大小都將由 grid-auto-rows 屬性隱式的指定。

非負值的長度大小 :如 px, em, vw

百分比 :相對于網格容器的,如果是 inline-grid ,則百分比值將被視為 auto

flex :非負值,用單位 fr 來定義網格軌道大小的彈性系數。每個定義了 flex 的網格軌道會按比例分配剩余的可用空間

max-content 關鍵字,表示以網格項的最大的內容來占據網格軌道的

min-content 關鍵字,表示以網格項的最大的最小內容來占據網格軌道

auto 如果該網格軌道為最大時,等同于 max-content ,為最小時,等同于 min-content

grid-template-columns

它和 grid-template-rows 類似,一個設置網格行,一個是設置網格列。

.container {    display: grid;    grid-template-columns: 40px 50px auto 50px 40px;    grid-template-rows: 25% 100px auto;}

.container {  display: grid;  grid-template-columns: 1fr 1fr 1fr;  grid-template-rows: 100px 100px;}

 

Grid 中可以使用的函數

在 Grid 布局中我們還可以使用如下 3 個函數

repeat()

repeat 函數可以以一種更簡潔的方式去表示大量而且重復行的表達式。

比如上面 grid-template-columns: 1fr 1fr 1fr; 我們可以寫成 repeat(3, 1fr) 。它的第一個參數是重復的次數,而可以為 auto-fillauto-fit

auto-fill

如果容器有明確的大小或最大大小,則重復次數是最大可能的正整數,不會導致網格溢出其網格容器。如果任何重復次數都會溢出,則重復次數為1。

auto-fit

auto-fill 的行為相同,只是在放置網格項后,任何空的重復軌道都會折疊。

#container {  display: grid;  grid-template-columns: repeat(2, 50px 1fr) 100px;  grid-gap: 5px;  box-sizing: border-box;  height: 200px;  width: 100%;  background-color: #8cffa0;  padding: 10px;}#container > div {  background-color: #8ca0ff;  padding: 5px;}

 

minmax()

定義了一個長寬范圍的閉區間。它接受兩個參數,最小值 和 最大值。它返回這個區間中的值。

minmax(max-content, 300px) ,最大不能大于 300px

minmax(200px, 1fr) 最小不能小于 200px

fit-content()

它相當于 min(maximum size, max(minimum size, argument)) 。參數可以是長度值和百分比。

它在內容的最小值和參數中去一個最大值,然后再在內容的最大值中取一個最小值。

也就是當內容少時,它取內容的長度,如果內容多,內容長度大于參數長度時,它取參數長度。

grid-template-areas

這個屬性網格區塊,需要和 grid-area 配合使用,它的值可以是 none字符串 。

為字符串時每一個給定的字符串會生成一行,一個字符串中用空格分隔的每一個單元(cell)會生成一列。多個同名的,跨越相鄰行或列的單元稱為網格區塊(grid area)。非矩形的網格區塊是無效的。

#page {  display: grid;  width: 100%;  height: 250px;  grid-template-areas: "head head"                       "nav  main"                       "nav  foot";  grid-template-rows: 50px 1fr 30px;  grid-template-columns: 150px 1fr;}#page > header {  grid-area: head;  background-color: #8ca0ff;}#page > nav {  grid-area: nav;  background-color: #ffa08c;}#page > main {  grid-area: main;  background-color: #ffff64;}#page > footer {  grid-area: foot;  background-color: #8cffa0;}

grid-template-areas 字符串,關聯 grid item 的 grid-area ,用它定義一片區域。

grid-template

grid-template-rowsgrid-template-columnsgrid-template-areas 的簡寫。

它的值可以分三種情況:

  • none
  • 只有定義行和列時可以使用 rows/columns 語法,如 grid-template: 100px 1fr / 50px 1fr;
  • 當三個都有時,也用一個 / 分隔,而且它的右邊也還是 columns ,但是它的左邊語法是 <line-names>? <string> <track-size>? <line-names>?
.page {    grid-template: [header-top] "a a a"     [header-bottom]                   [main-top]   "b b b" 1fr [main-bottom]                   / auto 1fr auto;}/*line-names 是可選的,自定義名稱,需要使用中括號包裹,它其實相當于注釋string 網格項 grid-area 的關聯值track-size 這一行的大小*/
#page {  display: grid;  width: 100%;  height: 200px;  grid-template: [header-left] "head head" 30px [header-right]                 [main-left]   "nav  main" 1fr  [main-right]                 [footer-left] "nav  foot" 30px [footer-right]                 / 120px 1fr;}header {  background-color: lime;  grid-area: head;}nav {  background-color: lightblue;  grid-area: nav;}main {  background-color: yellow;  grid-area: main;}footer {  background-color: red;  grid-column: foot;}

 

grid-row-gap / row-gap

用來設置行元素之間的間隙(gutter) 大小。它的值可以是長度值、百分比和 normal 。

CSS Grid Layout 起初是用 grid-row-gap 屬性來定義的,目前逐漸被 row-gap 替代。但是,為了兼容那些不支持 row-gap 屬性的瀏覽器,你需要使用帶有前綴的屬性。

.box{    grid-row-gap: 1em;}

 

grid-column-gap / column-gap

用來設置元素列之間的間隔 (gutter) 大小。它的值可以是長度值、百分比和 normal

normal 在 多列布局 時默認間隔為1em,其他類型布局默認間隔為 0。

grid-row-gap 一樣,它漸漸被 column-gap 取代。

.page {    grid-column-gap: 1em;}

 

grid-gap / gap

是上面兩個屬性的簡寫,語法是 row-gap column-gap 。如果沒有 column-gap 那么它將被設置成跟 row-gap 一樣的的值。

它也漸漸被 gap 取代。

#grid {  display: grid;  height: 200px;  grid-template: repeat(3, 1fr) / repeat(3, 1fr);  gap: 20px 5px;}#grid > div {  background-color: lime;}

 

隱式創建的行和列

css gird 會根據周圍項目的大小和跨度自動調整網格上每個項目的位置。

比如:

.box {  display: grid;  grid-template: 25px / 100px 160px;  background: #000;}.box * {  background: #ccc;}.box *:nth-child(even) {  background: #777;}

我們只定義了一行,兩列。但是我們卻有 5 個子元素。CSS網格決定將它們擴展到隱式創建的空間,新建的隱式行中的列自動從先前指定的 grid-template-rows 屬性繼承行高。

grid-column-start , grid-column-end , grid-row-startgrid-row-end 這 4 個屬性是 grid item 上的,它可以定義一個 grid item 的位置,如果我們將它的位置設置的超出我們定義的網格,那時也會隱式創建行或列。

grid-auto-rows

指定了隱式創建行的大小。它的值可以是:

  • 長度值px em vmax
  • 百分比 :相對于網格容器
  • flex :非負值,用單位 fr 來定義網格軌道大小的彈性系數。每個定義了 flex 的網格軌道會按比例分配剩余的可用空間
  • max-content 關鍵字,表示以網格項的最大的內容來占據網格軌道的
  • min-content 關鍵字,表示以網格項的最大的最小內容來占據網格軌道
  • auto 如果該網格軌道為最大時,等同于 max-content ,為最小時,等同于 min-content

它的值和 grid-template-rows 是一樣的。

.box {  display: grid;  grid-template: 25px / 100px 160px;  gap: 10px 20px;  grid-auto-rows: 50px;  background: #000;}.box * {  background: #ccc;}.box *:nth-child(even) {  background: #777;}

 

grid-auto-columns

指定了隱式創建的網格的列寬。它的取值和 grid-auto-rows 一樣。

#grid {  height: 100px;  display: grid;  grid-template-areas: "a a";  grid-gap: 10px;  grid-auto-columns: 200px;}#grid > div {  background-color: lime;}

 

grid-auto-flow

控制著自動布局算法怎樣運作,精確指定在網格中被自動布局的元素怎樣排列。

如果我們在一個 div 中寫幾個 div ,再對父級設置 display: grid; ,從視覺的角度可以發現沒什么變化。但是如果我們再將父級 div 加上一句 grid-auto-flow: column; 我們就發現現在子元素在一行顯示,和彈性盒子效果差不多。

grid-auto-flow 的值如下:

  • row指定自動布局算法按照通過逐行填充來排列元素,在必要時增加新行。(默認值)
  • column指定自動布局算法通過逐列填充來排列元素,在必要時增加新列。

在這兩個關鍵字后面還可以加上 dense 關鍵字。語法是 [ row | column ] || dense 。

該關鍵字指定自動布局算法使用一種“稠密”堆積算法,如果后面出現了稍小的元素,則會試圖去填充網格中前面留下的空白。這樣做會填上稍大元素留下的空白,但同時也可能導致原來出現的次序被打亂。

如果省略它,使用一種「稀疏」算法,在網格中布局元素時,布局算法只會「向前」移動,永遠不會倒回去填補空白。這保證了所有自動布局元素「按照次序」出現,即使可能會留下被后面元素填充的空白。

grid-auto-flow: row;

grid-auto-flow: row dense;

 grid

grid 是 CSS 簡寫屬性,它幾乎包括上面提到的所有屬性(除了 gap )。

與其他簡寫屬性同樣,若有次級屬性未被聲明,其將使用初始值。另外,盡管此簡寫聲明無法設置網格的槽(gutter),槽會被該聲明重置。

它的值可以分為 3 類

grid-template

就和 grid-template 簡寫一樣,如 grid: [linename1] "a" 100px [linename2];

grid-template-rows / [ auto-flow && dense? ] grid-auto-columns?

grid-template-rows 設置行高( grid-template-columns 被設置為 none ), / 后面的 auto-flow 必須要寫( grid-auto-flow 被設置為 column ),最后 grid-auto-columns 置明確該如何自動重復列軌道( grid-auto-rows 屬性設為 auto )。

grid: repeat(3, [line1 line2 line3] 200px) / auto-flow 300px;

[ auto-flow && dense? ] grid-auto-rows? / grid-template-columns

這種寫法和上種寫法相反,這種是設置 grid-template-columnsrows 屬性為 none )。可選的設置 grid-auto-rows 屬性( columnsauto

grid: auto-flow dense / 30%;

網格項上的屬性

 grid-row-start, grid-row-end, grid-column-start, grid-column-end

分別指定 grid item 在網格中的行起始位,行結束位,列起始位,列結束位。

這就需要了解之前介紹的網格線概念,橫線(row)從上到下遞增,豎線(column)從做到右遞增,都是從 1 開始算。

它們可以取如下值:

auto 表示自動放置,自動跨度或默認 span 為 1 數字 表示網格線 span 數字 表示跨越幾個格子, 數字 小于等于 0 無效。如果超過網格大小會隱式創建行或列。

它和 table 有點相似

如果設置的位置超出指定大小,會得到不穩定的效果,應該避免這種情況。

.box {  display: grid;  grid: 100px 100px / 100px 100px;  background: #000;}.box * {  background: #ccc;}.box *:nth-child(even) {  background: #777;}.box1 {  grid-column-start: span 5;}

 

grid-row, grid-column

grid-rowgrid-column 分別是上面 4 個屬性簡寫。

它們值的語法是 start / end 。如果只有一個值那么它是 startend 值為默認 auto 。

當列數未知時,可以使用 -1 讓它一直擴展到網格末尾。

使用負值

 

grid-area

上面我們已經展示了 grid-areagrid-template-areas 結合的用法。 grid-area 其實是 grid-row-start 、 grid-column-start 、 grid-row-endgrid-column-end 的簡寫。

它的默認值是 grid-area: auto;

如果設置了 4 個值的話那么它的順序是

grid-area: row-start / column-start / row-end / column-end;

如果設置了 3 個值,那么最后一個為 auto

如果設置了 2 個值,那么后兩個為 auto

如果設置了 1 個值,那么后三個為 auto

如果第一項是 自定義表示 ,那么被忽略的都為自定義表示

.box1 {  grid-area: a / a;}/* 相當于 */.box1 {    grid-row-start: a;    grid-column-start: a;    grid-row-end: a;    grid-column-end: a;}

網格項的內容對齊

我們可以使用 align-selfjustify-self 調整 grid item 的內容對齊方式。

align-self 用來垂直方向對齊, justify-self 用來水平方向對齊。

align-self

flex 布局也可以使用這個屬性。它常用如下 3 個值:

  1. start: 內容頂端對齊
  2. center: 內容垂直居中
  3. end: 內容底部對齊

 

justify-self

它常用如下 3 個值:

  • start / left : 內容左對齊
  • cneter : 內容水平居中
  • end / right : 內容右對齊

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲激情自拍图| 国产精品日韩在线播放| 国产成人精品国内自产拍免费看| 欧美一区二区影院| 成人国产精品免费视频| 日韩欧美极品在线观看| 欧美另类精品xxxx孕妇| 91中文在线观看| 懂色av影视一区二区三区| 精品偷拍各种wc美女嘘嘘| 日韩大片免费观看视频播放| 国产日产欧美a一级在线| 亚洲精品98久久久久久中文字幕| 2019中文字幕在线| 国产精品96久久久久久又黄又硬| 2018中文字幕一区二区三区| 成人精品视频在线| 日韩精品999| 欧美日韩亚洲视频| 亚洲一区美女视频在线观看免费| 色无极亚洲影院| 91亚洲精品在线观看| 亚洲天堂第一页| 国产精品久久久久久久9999| 91久久在线视频| 国产欧美一区二区三区久久| 久久五月天色综合| 亚洲免费视频观看| 国产第一区电影| 国产日韩av在线| 国产一区二区三区在线| 欧美专区第一页| 国产91精品黑色丝袜高跟鞋| www.美女亚洲精品| 国产欧美精品一区二区三区介绍| 欧美日韩亚洲视频一区| 亚洲人成电影网站色www| 国产精品h片在线播放| 中文字幕精品视频| 日韩欧美精品网站| 欧美成人免费在线观看| 自拍视频国产精品| 日韩成人免费视频| 亚洲激情久久久| 亚洲自拍欧美色图| 川上优av一区二区线观看| 国产91精品高潮白浆喷水| 7777免费精品视频| 日韩欧美国产视频| 亚洲高清一二三区| 日韩精品免费综合视频在线播放| 欧美资源在线观看| 中文字幕欧美日韩va免费视频| 欧美在线观看日本一区| 91日本在线观看| 国产中文日韩欧美| 亚洲成人久久久久| 国产99久久精品一区二区 夜夜躁日日躁| 国产成人高潮免费观看精品| 91在线播放国产| 国产日韩在线亚洲字幕中文| 国产香蕉97碰碰久久人人| 在线观看日韩av| 琪琪第一精品导航| 久久精品91久久久久久再现| 国内精品模特av私拍在线观看| 日韩免费观看高清| 在线成人激情视频| 久久精品国产亚洲一区二区| 精品无人区乱码1区2区3区在线| 欧美日韩美女在线| 亚洲天堂男人天堂| 国模精品一区二区三区色天香| 国产精品精品视频一区二区三区| 91高潮精品免费porn| 97视频人免费观看| 日韩中文字幕视频在线观看| 国产欧美va欧美va香蕉在线| 欧美成aaa人片免费看| 久久久久久久久爱| 欧美性一区二区三区| 日本精品视频在线| 日本高清视频精品| 国产亚洲精品久久久久动| 国产精品专区第二| 久久色在线播放| 久久99国产精品久久久久久久久| 国产精品久久久久久久app| 国产aⅴ夜夜欢一区二区三区| 有码中文亚洲精品| 青草青草久热精品视频在线网站| 欧美黑人xxx| 久久久极品av| 欧美激情第99页| 海角国产乱辈乱精品视频| 亚洲精品自在久久| 亚洲电影免费观看高清完整版在线观看| 欧美人与性动交a欧美精品| 亚洲va码欧洲m码| 91精品视频观看| 成人中文字幕+乱码+中文字幕| 国产精品av在线| 国产精品网红直播| 青青草精品毛片| 美女精品视频一区| 国产成人短视频| 色噜噜狠狠狠综合曰曰曰88av| 久久精品国产精品| 国产一区二区三区直播精品电影| 555www成人网| 国产精品入口日韩视频大尺度| 国产盗摄xxxx视频xxx69| 欧美激情第一页xxx| 日韩性生活视频| 亚洲激情自拍图| 国产成+人+综合+亚洲欧美丁香花| 欧美精品激情blacked18| www.日韩系列| 国产成人精品久久亚洲高清不卡| 国产在线高清精品| 国产97色在线| 97视频在线观看视频免费视频| 久久99青青精品免费观看| 永久免费看mv网站入口亚洲| 中文字幕日韩专区| 国产亚洲精品日韩| 国产欧亚日韩视频| 一区二区三区在线播放欧美| 国产精品日韩av| 久久精品一区中文字幕| 亚洲国产日韩一区| 在线一区二区日韩| 国产主播欧美精品| 91高清视频免费观看| 91av视频导航| 岛国av午夜精品| 久久激情视频免费观看| 日韩国产欧美精品在线| 一区二区三区精品99久久| 日韩在线小视频| 国模叶桐国产精品一区| 一区二区成人av| 亚洲综合在线小说| 国产精品自产拍在线观看| 国产偷国产偷亚洲清高网站| 国产精品户外野外| 国产免费亚洲高清| 欧美最猛性xxxxx(亚洲精品)| 成人免费网视频| 欧美亚洲一区在线| 欧美怡红院视频一区二区三区| 日韩亚洲精品电影| 久久影视免费观看| 亚洲电影在线观看| 欧美日韩国产影院| 国产精品自拍网| 欧美理论在线观看| 亚洲人线精品午夜| 亚洲精品有码在线| 97成人精品区在线播放| 国产91露脸中文字幕在线| 精品国产一区二区三区四区在线观看| 久久好看免费视频| 亚洲第一区在线观看|