天天看點

CSS:前端布局——網格布局Grid

Grid網格布局介紹

  1. 網格布局(Grid)是一種更為強大的CSS布局方案,就像是flex布局的更新版。Grid将元素劃分成一個個網格,實作任意組合,做出各種布局。
  2. 相較于felx布局,Flex 布局是軸線布局,隻能指定"項目"針對軸線的位置,可以看作是一維布局。Grid 布局則是将容器劃分成"行"和"列",産生單元格,然後指定"項目所在"的單元格,可以看作是二維布局。

Grid布局屬性

Grid 布局的屬性分成兩類。一類定義在容器上面,稱為容器屬性;另一類定義在項目上面,稱為項目屬性。這部分先介紹容器屬性。

一、display 屬性

  1. display: grid

    指定一個容器采用網格布局。
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .container{
                display: grid;
                grid-template-columns: 50px 50px 50px;
                grid-template-rows: 50px 50px 50px;
            }
            .item{
                font-size: 24px;
                text-align: center;
                border: 1px solid #fff;
            }
        </style>
    </head>
    <body style="padding-left: 500px;padding-top: 300px;">
        <span style="font-size: 24px">head</span>
        <div class="container">
            <div class="item item1" style="background-color: Aqua;">1</div>
            <div class="item item2" style="background-color: Blue;">2</div>
            <div class="item item3" style="background-color: Fuchsia;">3</div>
            <div class="item item4" style="background-color: Green;">4</div>
            <div class="item item5" style="background-color: Maroon;">5</div>
            <div class="item item6" style="background-color: Navy;">6</div>
            <div class="item item7" style="background-color: Olive;">7</div>
            <div class="item item8" style="background-color: Red;">8</div>
            <div class="item item9" style="background-color: Yellow;">9</div>
        </div>
        <span style="font-size: 24px">foot</span>
    </body>
    </html>
               
    運作效果:
    CSS:前端布局——網格布局Grid
  2. display: inline-grid

    指定指定元素為行内元素,采用網格布局。

    代碼同上,display改為inline-grid

    運作效果:

    CSS:前端布局——網格布局Grid
  3. ps:設為網格布局以後,容器子元素(項目)的float、display: inline-block、display: table-cell、vertical-align和column-*等設定都将失效。

二、grid-template-columns 屬性、grid-template-rows 屬性

  1. 指定子元素為網格布局後,可以使用

    grid-template-columns

    grid-template-rows

    屬性指定

    每一列的列寬

    和每

    一行的行高

    如:指定一行3行3列寬高均為80的元素。

    .container{
        display: inline-grid;
        grid-template-columns: 80px 80px 80px;
        grid-template-rows: 80px 80px 80px;
    }
               
  2. 除了使用絕對高度,也可以使用百分比。(需要指定父元素的寬高。)
    .container{
        width: 306px;
        height: 306px;
        display: inline-grid;
        grid-template-columns: 33.3% 33.3% 33.3%;
        grid-template-rows: 33.3% 33.3% 33.3%;
    }
               
  3. 當元素數量過多時,顯然全部寫出來會非常繁瑣。此時可以使用

    repeat()

    函數。repeat()函數接收兩個參數值,第一個參數值是重複的次數,第二個參數是重複的值。

    如:将上述用repeat()重寫後為:、

    .container{
        width: 306px;
        height: 306px;
        display: inline-grid;
        grid-template-columns: repeat(3,33.3%);
        grid-template-rows: repeat(3,33.3%);
    }
               
    除了接收固定的次數與值,

    repeat()

    函數也可以接收重複的次數和某種模式。

    如:列寬定義重複兩次,每次三列,第一列寬度為33px,第二列寬度為66px,第三列寬度為99px

    行高定義重複兩次,每行高33%

    .container{
        width: 306px;
        height: 306px;
        display: grid;
        grid-template-columns: repeat(2, 33px 66px 99px);
        grid-template-rows: repeat(2,33%);
    }
               
    運作效果:
    CSS:前端布局——網格布局Grid
  4. 有時,單元格的大小是固定的,但是容器的大小不确定。如果希望每一行(或每一列)容納盡可能多的單元格,這時可以使用

    auto-fill

    關鍵字表示自動填充。

    如:指定元素每列寬度為300px,然後自動填充,直到容器不能放置更多的列。

    .container{
        display: grid;
        grid-template-columns: repeat(auto-fill, 300px);
        grid-template-rows: repeat(2,100px);
    }
               
    CSS:前端布局——網格布局Grid
    如:指定元素每列寬度為100px,然後自動填充,直到容器不能放置更多的列。
    .container{
        display: grid;
        grid-template-columns: repeat(auto-fill, 100px);
        grid-template-rows: repeat(2,100px);
    }
               
    CSS:前端布局——網格布局Grid
    如:指定元素每列寬度為60px,然後自動填充,直到容器不能放置更多的列。
    .container{
        display: grid;
        grid-template-columns: repeat(auto-fill, 60px);
        grid-template-rows: repeat(2,100px);
    }
               
    CSS:前端布局——網格布局Grid
  5. 為了友善表示比例關系,網格布局提供了

    fr

    關鍵字(fraction 的縮寫,意為"片段")。如果四列的寬度分别為1fr、2fr、4fr、6fr,就表示後面每列依次為第一列2倍、4倍、6倍。
    .container{
    	display: grid;
    	grid-template-columns: 1fr 2fr 4fr 6fr;
    	grid-template-rows: repeat(3,33%);
    } 
               
    CSS:前端布局——網格布局Grid

    fr

    關鍵字可以與絕對寬度配合使用,非常友善。
    .container{
        display: grid;
        grid-template-columns: 100px 1fr 2fr 1fr 100px;
        grid-template-rows: repeat(2,100px);
    }
               
    CSS:前端布局——網格布局Grid
  6. minmax()

    函數産生一個長度範圍,表示長度就在這個範圍之中。它接受兩個參數,分别為最小值和最大值。

    如:表示列寬不小于100px,不大于3fr。

    .container{
        display: grid;
        grid-template-columns: 1fr 2fr minmax(100px, 3fr);
        grid-template-rows: repeat(3,100px);
    }
               
    CSS:前端布局——網格布局Grid
  7. auto

    關鍵字表示由浏覽器自己決定長度。

    如:第一列和第三列為100px,第二列自動調節。第二列的寬度,基本上等于該列單元格的最大寬度,除非單元格内容設定了

    min-width

    ,且這個值大于最大寬度。
    .container{
        display: grid;
        grid-template-columns: 100px auto 100px;
        grid-template-rows: repeat(3,100px);
    }
               
    CSS:前端布局——網格布局Grid
  8. grid-template-columns

    屬性和

    grid-template-rows

    屬性裡面,還可以使用

    方括号

    ,指定每一根網格線的名字,友善以後的引用。

    如:代碼指定網格布局為3行 x 3列,是以有4根垂直網格線和4根水準網格線。方括号裡面依次是這八根線的名字。

    網格布局允許同一根線有多個名字,比如

    [fifth-line row-5]

    .container{
    	display: grid;
    	grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4];
    	grid-template-rows: [r1] 100px [r2] 100px [r3] auto [r4];
    }
               
    CSS:前端布局——網格布局Grid
  9. 實用案例

    ① 兩欄布局

    .wrapper {
      display: grid;
      grid-template-columns: 70% 30%;
    }
               
    ② 十二網格
    grid-template-columns: repeat(12, 1fr);
               

三、grid-row-gap 屬性、grid-column-gap 屬性、grid-gap 屬性

  1. grid-row-gap

    屬性設定行與行的間隔(行間距),

    grid-column-gap

    屬性設定列與列的間隔(列間距)。

    如:指定每行每列之間間距20px

    .container{
    	    display: grid;
    	    grid-template-columns: repeat(3, 100px);
    	    grid-template-rows: repeat(3, 100px);
    	    grid-row-gap: 20px;
    	    grid-column-gap: 20px;
    	}
               
CSS:前端布局——網格布局Grid
  1. grid-gap

    grid-column-gap

    grid-row-gap

    合并簡寫。文法:

    grid-gap: <grid-row-gap> <grid-column-gap>;

    如果grid-gap省略了第二個值,浏覽器認為第二個值等于第一個值。

    如:上述代碼用grid-gap改寫

    .container{
        display: grid;
        grid-template-columns: repeat(3, 100px);
        grid-template-rows: repeat(3, 100px);
        grid-gap: 20px 20px;
    }
               
    CSS:前端布局——網格布局Grid
  2. 根據最新标準,上面三個屬性名的

    grid-

    字首已經删除,

    grid-column-gap

    grid-row-gap

    寫成

    column-gap

    row-gap

    grid-gap

    寫成

    gap

四、grid-template-areas 屬性

網格布局允許指定"區域"(area),一個區域由單個或多個單元格組成。

grid-template-areas

屬性用于定義區域。

如:下述代碼先劃分出9個單元格,然後将其定名為

a

i

的九個區域,分别對應這九個單元格。

.container{
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    grid-template-areas: 'a b c'
                         'd e f'
                         'g h i';
}
           

如:多個單元格合并成一個區域的寫法如下。将9個單元格分成

a

b

c

三個區域。

.container{
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    grid-template-areas: 'a a a'
                         'b b b'
                         'c c c';
}
           

如:執行個體頂部是頁眉區域

header

,底部是頁腳區域

foote

r,中間部分則為

main

sidebar

.container{
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    grid-template-areas: "header header header"
                     	 "main main sidebar"
                     	 "footer footer footer";
}
           

如果某些區域不需要利用,則使用"點"(.)表示。

.container{
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    grid-template-areas: 'a . a'
                         'b b .'
                         '. c c';
}
           

注意,區域的命名會影響到網格線。每個區域的起始網格線,會自動命名為區域名-start,終止網格線自動命名為區域名-end。比如,區域名為header,則起始位置的水準網格線和垂直網格線叫做header-start,終止位置的水準網格線和垂直網格線叫做header-end。

五、grid-auto-flow 屬性

劃分網格以後,容器的子元素會按照順序,自動放置在每一個網格。預設的放置順序是"先行後列",即先填滿第一行,再開始放入第二行,即下圖數字的順序。

CSS:前端布局——網格布局Grid

這個順序由

grid-auto-flow

屬性決定,預設值是

row

,即"先行後列"。也可以将它設成

column

,變成"先列後行"。

.container{
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    grid-auto-flow: column;
}
           
CSS:前端布局——網格布局Grid

grid-auto-flow

屬性除了設定成

row

column

,還可以設成

row dense

column dense

。這兩個值主要用于,某些項目指定位置以後,剩下的項目怎麼自動放置。

如:指定1、2各占兩個單元格,在預設情況下,3會跟在2後面,形成以下樣式

.container{
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px 100px;
    grid-auto-flow: row;
}
.item{
    font-size: 24px;
    text-align: center;
    border: 1px solid #fff;
}
.item1, .item2{
    grid-column-start: 1;
    grid-column-end: 3;
}
           
CSS:前端布局——網格布局Grid

設定

grid-auto-flow: row dense;

表示"先行後列",并且盡可能緊密填滿,盡量不出現空格。形成以下樣式:

.container{
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px 100px;
    grid-auto-flow: row dense;
}
           
CSS:前端布局——網格布局Grid

如果設定

grid-auto-flow: column dense;

,改為先列後行,出現以下樣式。

.container{
	display: grid;
	grid-template-columns: 100px 100px 100px;
	grid-template-rows: 100px 100px 100px 100px;
	grid-auto-flow: column dense;
}
           
CSS:前端布局——網格布局Grid

六、justify-items 屬性、align-items 屬性、place-items 屬性

flex

布局類似,

justify-items

屬性設定單元格内容的水準位置(左中右),

align-items

屬性設定單元格内容的垂直位置(上中下)。

.container {
  justify-items: start | end | center | stretch;
  align-items: start | end | center | stretch;
}
           

這兩個屬性可以取以下值:

  • start

    :對齊單元格的起始邊緣。
  • end

    :對齊單元格的結束邊緣。
  • center

    :單元格内部居中。
  • stretch

    :拉伸,占滿單元格的整個寬度(預設值)。
.container{
	display: grid;
	grid-template-columns: 100px 100px 100px;
	grid-template-rows: 100px 100px 100px;
	justify-items: start;
}
           
CSS:前端布局——網格布局Grid
.container{
	display: grid;
	grid-template-columns: 100px 100px 100px;
	grid-template-rows: 100px 100px 100px;
	justify-items: center;
}
           
CSS:前端布局——網格布局Grid

place-items屬性是align-items屬性和justify-items屬性的合并簡寫形式。

place-items: <align-items> <justify-items>;

如果省略第二個值,則浏覽器認為與第一個值相等。

.container{
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    place-items: start end;
}
           
CSS:前端布局——網格布局Grid

七、justify-content 屬性、align-content 屬性、place-content 屬性

justify-content

屬性是整個内容區域在容器裡面的水準位置(左中右),

align-content

屬性是整個内容區域的垂直位置(上中下)。

.container {
  justify-content: 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

    :項目與項目的間隔相等,項目與容器邊框之間也是同樣長度的間隔。

如:start

.container{
    width: 350px;
    height: 350px;
    border: 1px solid #000;
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    justify-content: start;
}
           
CSS:前端布局——網格布局Grid

center

CSS:前端布局——網格布局Grid

space-around

CSS:前端布局——網格布局Grid

space-between

CSS:前端布局——網格布局Grid

place-content

屬性是

align-content

屬性和

justify-content

屬性的合并簡寫形式。

place-content: <align-content> <justify-content>

如:

.container{
    width: 350px;
    height: 350px;
    border: 1px solid #000;
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    place-content:center space-evenly ;
}
           
CSS:前端布局——網格布局Grid

八、grid-auto-columns 屬性、grid-auto-rows 屬性

有時候,一些項目的指定位置,在現有網格的外部。比如網格隻有3列,但是某一個項目指定在第5行。這時,浏覽器會自動生成多餘的網格,以便放置項目。

grid-auto-columns

屬性和

grid-auto-row

s屬性用來設定,浏覽器自動建立的多餘網格的列寬和行高。它們的寫法與

grid-template-columns

grid-template-rows

完全相同。如果不指定這兩個屬性,浏覽器完全根據單元格内容的大小,決定新增網格的列寬和行高。

如:

.container{
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
    grid-auto-rows: 50px;
}
.item{
    font-size: 24px;
    text-align: center;
    border: 1px solid #fff;
}
.item8{
    grid-row-start: 4;
    grid-column-start: 2;
}
           
CSS:前端布局——網格布局Grid

九、grid-template 屬性、grid 屬性

grid-template

屬性是

grid-template-columns

grid-template-rows

grid-template-areas

這三個屬性的合并簡寫形式。

grid

屬性是

grid-template-rows

grid-template-columns

grid-template-areas

grid-auto-rows

grid-auto-column

s、

grid-auto-flow

這六個屬性的合并簡寫形式。

從易讀易寫的角度考慮,還是建議不要合并屬性

項目屬性

一、grid-column-start 屬性、grid-column-end 屬性、grid-row-start 屬性、grid-row-end 屬性

項目的位置是可以指定的,具體方法就是指定項目的四個邊框,分别定位在哪根網格線。

  • grid-column-start屬性:左邊框所在的垂直網格線
  • grid-column-end屬性:右邊框所在的垂直網格線
  • grid-row-start屬性:上邊框所在的水準網格線
  • grid-row-end屬性:下邊框所在的水準網格線
.container{
    display: grid;
    grid-template-columns: 100px 100px 100px;
    grid-template-rows: 100px 100px 100px;
}
.item{
    font-size: 24px;
    text-align: center;
    border: 1px solid #fff;
}
.item2{
    grid-column-start: 2;
    grid-column-end: 4;
}
           
CSS:前端布局——網格布局Grid

這四個屬性的值,除了指定為第幾個網格線,還可以指定為網格線的名字。

.item-1 {
  grid-column-start: header-start;
  grid-column-end: header-end;
}
           

這四個屬性的值還可以使用

span

關鍵字,表示"跨越",即左右邊框(上下邊框)之間跨越多少個網格。

.item-1 {
  grid-column-start: span 2;
}
           

二、grid-column 屬性、grid-row 屬性

grid-column

屬性是

grid-column-start

grid-column-end

的合并簡寫形式

grid-row

屬性是

grid-row-start

屬性和

grid-row-end

的合并簡寫形式。

grid-column: / ;

grid-row: / ;

.item-1 {
  grid-column: 1 / 3;
  grid-row: 1 / 2;
}
/* 等同于 */
.item-1 {
  grid-column-start: 1;
  grid-column-end: 3;
  grid-row-start: 1;
  grid-row-end: 2;
}
           

三、grid-area 屬性

grid-area屬性指定項目放在哪一個區域。

.item-1 {
  grid-area: e;
}
           
.item {
  grid-area: <row-start> / <column-start> / <row-end> / <column-end>;
}
           

四、justify-self 屬性、align-self 屬性、place-self 屬性

.item {
  justify-self: start | end | center | stretch;
  align-self: start | end | center | stretch;
}
           
  • start:對齊單元格的起始邊緣。
  • end:對齊單元格的結束邊緣。
  • center:單元格内部居中。
  • stretch:拉伸,占滿單元格的整個寬度(預設值)。