快速開始grid布局

Grid布局概念

CSS Gird已經(jīng)被W3C納入到css3的一個布局模塊中记盒,被稱為CSS Grid Layout Module睦疫,一般習(xí)慣稱為網(wǎng)格布局纷责。

網(wǎng)格布局可以將應(yīng)用程序分割成不同的空間吆寨,定義它們的大小推姻、位置和層級窃款。

簡單來說课兄,網(wǎng)格布局就像表格一樣可以讓元素按列和行對齊排列,不同的是晨继,網(wǎng)格布局沒有內(nèi)容結(jié)構(gòu)烟阐,比如一個網(wǎng)格布局的子元素可以定位自己的位置,可以是實(shí)現(xiàn)類似定位的效果紊扬。

兼容性

兼容性

可以看到幾大瀏覽器都已經(jīng)支持了Grid布局蜒茄,接下來我們來一步步的來玩轉(zhuǎn)Grid布局

grid vs flex

我們知道flex和grid都是css3新的布局方式,如果瀏覽器都支持兩種布局餐屎,你會選擇那種呢檀葛?當(dāng)我們了解兩者以后就能做出正確的選擇了。

flex布局是一維布局腹缩,grid布局是二維布局屿聋。

網(wǎng)格容器和網(wǎng)格項

我們知道給一個元素設(shè)置了display:flex就指定了flex彈性布局空扎,實(shí)現(xiàn)grid布局一樣簡單,給元素設(shè)置display:grid就可以了润讥。

<style>
    .container{
        display: grid;
    }
</style>
<div class="container">
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
</div>

container 就是一個網(wǎng)格容器转锈,里面的item就是網(wǎng)格項

網(wǎng)格術(shù)語

網(wǎng)格線 grid lines

網(wǎng)格線組成了網(wǎng)格,是網(wǎng)格水平和垂直的分界線楚殿。

網(wǎng)格線

網(wǎng)格軌道 grid track

就是兩條網(wǎng)格線之間的空間撮慨,可以理解成表格里面的行或者列,網(wǎng)格里面為grid-rowgrid-column勒魔,網(wǎng)格軌道可以設(shè)置大小甫煞,來控制高度或者寬度。

網(wǎng)格軌道

上圖grid-column2grid-column3之間的區(qū)域就是一個網(wǎng)格軌道

網(wǎng)格單元格 grid cell

就是四條網(wǎng)格線之間的空間冠绢,是最小的單位。

網(wǎng)格單元格

網(wǎng)格區(qū)域

也是四條網(wǎng)格線組成的空間常潮,可能包含一個或者多個單元格弟胀。

網(wǎng)格區(qū)域

實(shí)現(xiàn)一個grid布局

了解網(wǎng)格個相關(guān)概念,接下來我們來創(chuàng)建一個簡單的grid布局喊式。

上面我們說網(wǎng)格軌道的時候說了可以給網(wǎng)格軌道設(shè)置大小孵户,可以控制高度或者寬度。

html

<div class="grid">
        <div class="item-1">1</div>
        <div class="item-2">2</div>
        <div class="item-3">3</div>
        <div class="item-4">4</div>
        <div class="item-5">5</div>
        <div class="item-6">6</div>
</div>

css

$bgcloors: #b03532 #33a8a5 #30997a #6a478f #da6f2b #3d8bb1;
.grid{
    display: grid;
    grid-template-columns: 300px 200px 150px;
    grid-template-rows: 150px 100px;
    div{
        color: #fff;
        font-size: 30px;
        padding: 20px;
    }
    @for $i from 1 through length($bgcloors){
        .item-#{$i}{
            background: nth($bgcloors, $i)
        }
    }
}

我們來分析下上面的css

1岔留、給grid元素設(shè)置了 display: grid來聲明使用grid布局
2夏哭、使用grid-template-columns來設(shè)置列寬,分別為 300px 200px 150px
3献联、使用grid-template-rows來設(shè)置行高竖配,分別為150px 100px

以上代碼我們是實(shí)現(xiàn)了一個兩行三列的grid布局,此時瀏覽器顯示如下


image.png

簡書不支持GIF圖里逆,差異請??這里

動態(tài)圖里面我們可以看到網(wǎng)格線

進(jìn)階

fr

grid-template-columnsgrid-template-rows不只是可以設(shè)置具體的數(shù)值进胯,還可以設(shè)置百分比、rem一類的原押,還可以設(shè)置一個新單位 fr胁镐,
它是來干什么的呢?我們先看

我們先把上面demo里面的css文件改下

$bgcloors: #b03532 #33a8a5 #30997a #6a478f #da6f2b #3d8bb1;
.grid{
    display: grid;
    grid-template-columns: 1fr 2fr 1fr;
    grid-template-rows: repeat(2,1fr);
    div{
        color: #fff;
        font-size: 30px;
        padding: 20px;
    }
    @for $i from 1 through length($bgcloors){
        .item-#{$i}{
            background: nth($bgcloors, $i)
        }
    }
}
fr

以上實(shí)現(xiàn)了彈性布局诸衔,fr用來實(shí)現(xiàn)彈性布局, 我們這里使用里repeat(2, 1fr),表示重復(fù)兩次盯漂,都是1fr

grid-gap

grid-gap用來這是網(wǎng)格項間隙

css修改如下

$bgcloors: #b03532 #33a8a5 #30997a #6a478f #da6f2b #3d8bb1;
.grid{
    display: grid;
    grid-template-columns: 1fr 2fr 1fr;
    grid-template-rows: repeat(2,1fr);
    grid-gap: 40px;
    div{
        color: #fff;
        font-size: 30px;
        padding: 20px;
    }
    @for $i from 1 through length($bgcloors){
        .item-#{$i}{
            background: nth($bgcloors, $i)
        }
    }
}

展示如下


grid-gap

網(wǎng)格布局屬性 grid-placement-properties

恭喜你,從一開始一步步的實(shí)現(xiàn)了一個網(wǎng)格布局笨农,可以發(fā)現(xiàn)所有的樣式都寫在網(wǎng)格容器里面的就缆,當(dāng)我們實(shí)現(xiàn)一些復(fù)雜布局的時候,就顯得有點(diǎn)力不從心了磁餐,接下來我們來介紹下寫在網(wǎng)格項中的屬性违崇。

網(wǎng)格布局屬性主要用來放置容器內(nèi)的網(wǎng)格項目阿弃,就是單一項目的位置。網(wǎng)格布局屬性主要有以下四個屬性:

 1羞延、grid-column-start  設(shè)置垂直方向的開始位置網(wǎng)格線
 2渣淳、grid-column-end    設(shè)置垂直方向的結(jié)束位置網(wǎng)格線
 3、grid-row-start     設(shè)置水平方向的開始位置網(wǎng)格線
 4伴箩、grid-row-end       設(shè)置水平方向的結(jié)束位置網(wǎng)格線

以上的簡寫方式

 1入愧、grid-column: grid-column-start / grid-column-end
 2、grid-row: grid-row-start / grid-row-end

終極簡寫

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

是不是有點(diǎn)蒙嗤谚,我們可以大概看下棺蛛,先來看deme

還是熟悉的html布局

<div class="grid">
    <div class="item-1">1</div>
    <div class="item-2">2</div>
    <div class="item-3">3</div>
    <div class="item-4">4</div>
    <div class="item-5">5</div>
    <div class="item-6">6</div>
</div>

css

$bgcloors: #b03532 #33a8a5 #30997a #6a478f #da6f2b #3d8bb1;
.grid{
    display: grid;
    grid-template-columns: 300px 200px 150px;
    grid-template-rows: 150px 100px;
    div{
        color: #fff;
        font-size: 30px;
        padding: 20px;
    }
    @for $i from 1 through length($bgcloors){
        .item-#{$i}{
            background: nth($bgcloors, $i)
        }
    }
    .item-2{  // 看這里看這里
        grid-column-start: 2;
        grid-column-end: 4;
        grid-row-start: 1;
        grid-row-end: 2;
    }
    .item-6{   // 你要先看上面再看這里
        grid-area: 3 / 1 / 4 / 4;
    }
}

先來看看我們的成果

grid

顯示網(wǎng)格線的圖片

網(wǎng)格線

參考上圖,我們來分析下css
1巩步、grid元素聲明grid布局旁赊,grid-template-columnsgrid-template-rows來創(chuàng)建一個兩行三列的網(wǎng)格,但是渲染的結(jié)果卻是三行三列椅野,為什么终畅?我們先接著往下分析
2、css文件中單獨(dú)設(shè)置item-2網(wǎng)格項的位置竟闪,
grid-column-start:2 垂直線開始位置為2
grid-column-end:4垂直線結(jié)束位置為4
grid-row-start:1 水平線開始位置為1
grid-row-end:2 水平線結(jié)束位置為2
3离福、通過單獨(dú)設(shè)置item-2的位置,把本身要在第一行的item-3給擠下來了炼蛤,然后 3妖爷、4、5按照300 200 150 排列
4理朋、這時候兩件三列排列完了絮识,但是還有個元素,此時剩下的元素就會獨(dú)自占一行的位置暗挑,它的大小一樣會按照網(wǎng)格容器定義的行高列寬來渲染
5笋除、最后我們給item-6來設(shè)置了終極簡寫方式,
終極簡寫:行開始 / 列開始 / 行結(jié)束 / 列結(jié)束炸裆,然后我們把位置對應(yīng)上
grid-area:3 / 1 / 4 / 4

通過設(shè)置網(wǎng)格項樣式屬性垃它,我們可以就實(shí)現(xiàn)很多復(fù)雜的布局結(jié)構(gòu)了。

幾種布局

最后我們結(jié)合上面所學(xué)到的實(shí)現(xiàn)幾個常見布局

1烹看、左右固定国拇,中間自適應(yīng)

設(shè)置網(wǎng)格容器的 grid-template-columns: 100px 1fr 100px或者grid-template-columns: 100px auto 100px就可以實(shí)現(xiàn),再簡單不過了

html

<div class="container">
    <div class="left">left</div>
    <div class="middle">middle</div>
    <div class="right">right</div>
</div>

css

.container{
    display: grid;
    grid-template-columns: 100px 1fr 100px;
    height: 200px;
}
.container div{
    text-align: center;
}
.left{
    background: greenyellow;
}
.middle{
    background: lightblue;
}
.right{
    background: greenyellow;
}
中間自適應(yīng)惯殊,兩側(cè)固定

2酱吝、九宮格
使用grid-gap設(shè)置網(wǎng)格項間距 使用fr來平分

html

<div class="container">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
    <div class="item">5</div>
    <div class="item">6</div>
    <div class="item">7</div>
    <div class="item">8</div>
    <div class="item">9</div>
</div>

css

.container{
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-template-rows: repeat(3, 1fr);
    height: 400px;
    width: 400px;
    grid-gap: 8px;
}
.item{
    background: lightskyblue;
}

顯示如下


九宮格

3、圣杯土思、雙飛翼
使用grid-area設(shè)置header元素和footer元素位置务热,結(jié)合grid-template-columnsgrid-template-rows實(shí)現(xiàn)布局
html

<div class="container">
    <div class="header">header</div>
    <div class="left">left</div>
    <div class="body">body</div>
    <div class="right">right</div>
    <div class="footer">footer</div>
</div>

css

.container{
    display: grid;
    grid-template-columns: 100px 1fr 100px;
    grid-template-rows: 50px 300px 50px;
}
.header{
    grid-area: 1 / 1 / 2 / 4;
}
.footer{
    grid-area: 3 / 1 / 4 / 4;
}
.header{
    background: lightsalmon;
}
.left{
    background: lightseagreen;
}
.body{
    background: lightslategray;
}
.right{
    background: lightyellow;
}
.footer{
    background: yellowgreen;
}
復(fù)雜布局
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忆嗜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子崎岂,更是在濱河造成了極大的恐慌捆毫,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冲甘,死亡現(xiàn)場離奇詭異绩卤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)江醇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進(jìn)店門濒憋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陶夜,你說我怎么就攤上這事凛驮。” “怎么了条辟?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵辐烂,是天一觀的道長。 經(jīng)常有香客問我捂贿,道長,這世上最難降的妖魔是什么胳嘲? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任厂僧,我火速辦了婚禮,結(jié)果婚禮上了牛,老公的妹妹穿的比我還像新娘颜屠。我一直安慰自己,他們只是感情好鹰祸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布甫窟。 她就那樣靜靜地躺著,像睡著了一般蛙婴。 火紅的嫁衣襯著肌膚如雪粗井。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天街图,我揣著相機(jī)與錄音浇衬,去河邊找鬼。 笑死餐济,一個胖子當(dāng)著我的面吹牛耘擂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播絮姆,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼醉冤,長吁一口氣:“原來是場噩夢啊……” “哼秩霍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蚁阳,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤铃绒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后韵吨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匿垄,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年归粉,在試婚紗的時候發(fā)現(xiàn)自己被綠了椿疗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡糠悼,死狀恐怖届榄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倔喂,我是刑警寧澤铝条,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站席噩,受9級特大地震影響班缰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悼枢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一埠忘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧馒索,春花似錦莹妒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜈块,卻和暖如春鉴腻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疯趟。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工拘哨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人信峻。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓倦青,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盹舞。 傳聞我的和親對象是個殘疾皇子产镐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評論 2 350