自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

簡(jiǎn)明 CSS Grid 布局教程

開發(fā) 前端
網(wǎng)格布局是由一系列水平及垂直的線構(gòu)成的一種布局模式,使用網(wǎng)格,我們能夠?qū)⒃O(shè)計(jì)元素進(jìn)行排列,幫助我們?cè)O(shè)計(jì)一系列具有固定位置以及寬度的元素的頁(yè)面,使我們的網(wǎng)站頁(yè)面更加統(tǒng)一。

[[437778]]

網(wǎng)格布局是由一系列水平及垂直的線構(gòu)成的一種布局模式,使用網(wǎng)格,我們能夠?qū)⒃O(shè)計(jì)元素進(jìn)行排列,幫助我們?cè)O(shè)計(jì)一系列具有固定位置以及寬度的元素的頁(yè)面,使我們的網(wǎng)站頁(yè)面更加統(tǒng)一。

一個(gè)網(wǎng)格通常具有許多的「列(column)與行(row)」,以及行與行、列與列之間的間隙,這個(gè)間隙一般被稱為「溝槽(gutter)」。

一、定義一個(gè)網(wǎng)格

我們可以將 display 屬性設(shè)為 grid 來(lái)定義一個(gè)網(wǎng)格。與彈性盒子一樣,將父容器改為網(wǎng)格布局后,他的直接子項(xiàng)會(huì)變?yōu)榫W(wǎng)格項(xiàng)。

  1. .container { 
  2.   display: grid; 

1.1 設(shè)置列(column)與行(row)

grid-template-columns 用于設(shè)置列,grid-template-rows 用于設(shè)置行。

  1. .container { 
  2.   display: grid; 
  3.   grid-template-columns: 100px 200px; 

這里我們創(chuàng)建了兩列,寬度分別為 100px和200px。當(dāng)然,這里可以使用任何長(zhǎng)度單位以及百分比。

grid-template 是 grid-template-rows 和 grid-template-columns 的簡(jiǎn)寫,例如:grid-template: 50px 50px / 100px;會(huì)創(chuàng)建兩個(gè) 50px 高的行以及一個(gè)100px寬的列。

1.1.1 使用 fr 單位

除了長(zhǎng)度和百分比,我們也可以用fr這個(gè)單位來(lái)靈活地定義網(wǎng)格的行與列的大小。這個(gè)單位表示了可用空間的一個(gè)比例,類似 flex 布局的 flex-grow / flex-shrink。

  1. .container { 
  2.   display: grid; 
  3.   grid-template-columns: 1fr 1fr; 

上面我們創(chuàng)建了等分的兩列。如果希望兩列的比例是 1:2,可以這么設(shè)置:

  1. .container { 
  2.   display: grid; 
  3.   grid-template-columns: 1fr 2fr; 

另外,fr可以與一般的長(zhǎng)度單位混合使用,比如grid-template-columns: 100px 1fr 2fr的結(jié)果就是第一列寬度是 100px,剩下的兩列會(huì)根據(jù)去掉 100px 后的可用空間按比例 1: 2 來(lái)分配。

1.1.2 重復(fù)設(shè)置列 / 行

我們可以使用repeat函數(shù)來(lái)重復(fù)創(chuàng)建具有某些寬度配置的列。如果要?jiǎng)?chuàng)建多個(gè)等寬列,可以用這么寫:

  1. .container { 
  2.   display: grid; 
  3.   grid-template-columns: repeat(3, 1fr); 

傳入repeat函數(shù)的第一個(gè)參數(shù)表明了后續(xù)列寬配置要重復(fù)多少次,而第二個(gè)參數(shù)表示需要重復(fù)的配置,這個(gè)配置還可以具有多個(gè)長(zhǎng)度設(shè)定,舉個(gè)例子:repeat(2, 100px 200px)會(huì)得到這樣的效果:

1.1.3 自動(dòng)填充

某些情況下,我們需要給網(wǎng)格創(chuàng)建很多列來(lái)填滿整個(gè)容器,而容器的寬度是可變的,也就沒辦法確定 repeat 的次數(shù)了,這時(shí)可以使用 repeat 函數(shù)中的關(guān)鍵字auto-fill來(lái)實(shí)現(xiàn)這個(gè)效果。

  1. .container { 
  2.   display: grid; 
  3.   grid-template-columns: repeat(auto-fill, 150px); 

 

可以看到在 500px 寬度的容器上創(chuàng)建了三個(gè)150px的列,剩余的 50px 不足以再創(chuàng)建一列,所以第四個(gè)元素就被放置到了第二行。

1.1.4 minmax() 函數(shù)

我們可以使用 minmax函數(shù)設(shè)置一個(gè)范圍。

  1. .container { 
  2.   display: grid; 
  3.   grid-template-columns: 100px minmax(100px, 300px) 100px; 

1.2 網(wǎng)格間隙

使用column-gap屬性來(lái)定義列間隙;使用row-gap來(lái)定義行間隙;使用gap可以同時(shí)設(shè)定兩者。

  1. .container { 
  2.   display: grid; 
  3.   grid-template-columns: repeat(auto-fill, 150px); 
  4.   gap: 10px 20px; 

 

*gap屬性曾經(jīng)有一個(gè)grid-前綴,不過后來(lái)的標(biāo)準(zhǔn)進(jìn)行了修改,目的是讓他們能夠在不同的布局方法中都能起作用。盡管現(xiàn)在這個(gè)前綴不會(huì)影響語(yǔ)義,但為了代碼的健壯性,可以把兩個(gè)屬性都寫上。

另外,雖然 gap 屬性在 grid 布局的兼容性挺好的,但在 flex 布局的兼容性目前看起來(lái)還不行:

二、放置元素

2.1 基于線的放置元素

我們的網(wǎng)格中有許多的分隔線,我們可以根據(jù)這些分割線來(lái)放置元素:

  • grid-column-start 開始的列網(wǎng)格線
  • grid-column-end結(jié)束的列網(wǎng)格線
  • grid-row-start開始的行網(wǎng)格線
  • grid-row-end結(jié)束的列網(wǎng)格線

我們還可以使用 grid-column 、grid-row同時(shí)指定開始和結(jié)束的線。需要注意的是,開始和結(jié)束的線的序號(hào)要用 / 分開。

  1. .container { 
  2.   display: grid; 
  3.   grid-template-columns: 100px 400px; 
  4.   grid-template-rows: 50px 150px 50px; 
  5.   gap: 10px 
  6.  
  7. .header { 
  8.   grid-column: 1 / 3; 
  9.  
  10. .sidebar { 
  11.   grid-column: 1 / 2; 
  12.  
  13. .content { 
  14.   grid-column: 2 / 3; 
  15.  
  16. .footer { 
  17.   grid-column: 1 / 3; 

我們還可以使用負(fù)數(shù)來(lái)指定分隔線,-n就代表倒數(shù)第n 條網(wǎng)格線。有時(shí)候我們不好確定列數(shù),但又想定位到最后一列,這就可以考慮使用負(fù)數(shù)網(wǎng)格線了,例如上面的 header 可以這么寫:

  1. .header { 
  2.   grid-column: 1 / -1; 

2.1.1 使用 span

除了使用開始和結(jié)束的分隔線來(lái)指定位置,我們還可以使用 span 來(lái)指定元素占的列數(shù) / 行數(shù):

  1. .header { 
  2.   grid-column: 1 / span 2; 
  3.  
  4. // 這么寫也行 
  5. .header { 
  6.   grid-column: span 2 / -1; 

效果跟上圖一樣。

2.1.2 使用 grid-area

我們還可以使用 grid-area 來(lái)一次性指定所有的行/列序號(hào): / / / ,也就是先指定開始坐標(biāo)的行/列序號(hào),再指定結(jié)束坐標(biāo)的行/列序號(hào)。

  1. .header { 
  2.   grid-area: 1 / 1 / 2 / 3; 

2.2 使用grid-tempate-areas放置元素

另一種放置元素的方式是用grid-template-areas屬性,并且要命名一些元素并在屬性中使用這些名字作為一個(gè)區(qū)域。

grid-template-areas屬性的使用規(guī)則如下:

  • 需要填滿網(wǎng)格的每個(gè)格子
  • 對(duì)于某個(gè)橫跨多個(gè)格子的元素,重復(fù)寫上那個(gè)元素grid-area屬性定義的區(qū)域名字
  • 所有名字只能出現(xiàn)在一個(gè)連續(xù)的區(qū)域,不能在不同的位置出現(xiàn)
  • 一個(gè)連續(xù)的區(qū)域必須是一個(gè)矩形
  • 使用.符號(hào),讓一個(gè)格子留空
  1. .container { 
  2.   display: grid; 
  3.   grid-template-columns: 100px 400px; 
  4.   grid-template-rows: 50px 150px 50px; 
  5.   grid-template-areas:  
  6.     "header  header" 
  7.     "sidebar content" 
  8.     "footer  footer"
  9.   gap: 10px 
  10.  
  11. .header { 
  12.   grid-area: header; 
  13.  
  14. .sidebar { 
  15.   grid-area: sidebar; 
  16.  
  17. .content { 
  18.   grid-area: content; 
  19.  
  20. .footer { 
  21.   grid-area: footer; 
  22. }  

如果想把 sidebar 延伸到底部,只需要把 grid-template-areas 改成這樣:

  1. .container { 
  2.   // ... 
  3.   grid-template-areas:  
  4.     "header  header" 
  5.     "sidebar content" 
  6.     "sidebar  footer"

效果如下:

通過命名的方式來(lái)放置元素是一種非常直觀的方式,你在CSS中看到的就是實(shí)際會(huì)出現(xiàn)的排版效果了。

三、顯式網(wǎng)格與隱式網(wǎng)格

顯式網(wǎng)格是我們用grid-template-columns或 grid-template-rows 屬性創(chuàng)建的,而隱式網(wǎng)格則是當(dāng)「網(wǎng)格項(xiàng)被放到已定義的網(wǎng)格外」或「網(wǎng)格項(xiàng)的數(shù)量多于網(wǎng)格的數(shù)量」時(shí)才會(huì)自動(dòng)生成。

假設(shè)現(xiàn)在我們定義一個(gè) 1 行x 2 列的寬高都為 100px 的網(wǎng)格容器,并在其中放置了 a 和 b 兩個(gè)網(wǎng)格項(xiàng):

如果我們把網(wǎng)格項(xiàng) a 和 b 放置到已定義的網(wǎng)格之外的話:

  1. .a { 
  2.   grid-column: 3; 
  3.  
  4. .b { 
  5.   grid-row: 2; 

可以看到比之前定義的網(wǎng)格多了一些,而這些多出來(lái)的的網(wǎng)格就是隱式網(wǎng)格。另外,不僅網(wǎng)格多了,網(wǎng)格線也多了,列網(wǎng)格線 4 以及行網(wǎng)格線 3 都是自動(dòng)生成的隱式網(wǎng)格線。

3.1 給隱式網(wǎng)格設(shè)置大小

上圖的 a 和 b 有點(diǎn)區(qū)別是,網(wǎng)格 a 寬度自動(dòng)鋪滿了容器,而網(wǎng)格 b 的高度則是內(nèi)容的高度,這是默認(rèn)行為。我們可以給網(wǎng)格容器設(shè)置 grid-auto-rows 和 grid-auto-columns 屬性來(lái)指定隱式網(wǎng)格的大?。?/p>

  1. .container { 
  2.   grid-auto-rows: 100px; 
  3.   grid-auto-columns: 100px; 

現(xiàn)在隱式網(wǎng)格的大小也都是 100px * 100px 了。

3.2 自動(dòng)放置

上面提過,當(dāng)網(wǎng)格項(xiàng)的數(shù)量多于網(wǎng)格的數(shù)量時(shí)也會(huì)自動(dòng)生成隱式網(wǎng)格,默認(rèn)情況下元素會(huì)逐行放置,不夠空間的話再生成新的行。我們可以通過 grid-auto-flow 屬性來(lái)修改這個(gè)行為。

例如現(xiàn)在有 3 x 3 的網(wǎng)格容器,a 、b都占兩列,默認(rèn)情況下由于 b 在第一行不夠空間,最終會(huì)放到第二行,然后 c 在 b 后面。

如果修改成grid-auto-flow: column,會(huì)逐列放置元素,此時(shí) c 會(huì)被放在第三行:

如果修改成grid-auto-flow: dense,則會(huì)在 row 的基礎(chǔ)上填充前面網(wǎng)格留下來(lái)的空白:

還有column dense之類的值,具體可以去看 MDN: grid-auto-flow

四、調(diào)整對(duì)齊方式

下面的例子都基于這個(gè)網(wǎng)格容器:

  1. .container { 
  2.   display: grid; 
  3.   grid-template-columns: repeat(2, 100px); 
  4.   grid-template-rows: repeat(2, 50px); 
  5.   gap: 10px 

4.1justify-items

沿行軸對(duì)齊網(wǎng)格項(xiàng)。

start

end

center

4.2align-items

沿列軸對(duì)齊網(wǎng)格項(xiàng)。

start

end

 

center

4.3justify-content

如果網(wǎng)格容器的尺寸比整個(gè)網(wǎng)格內(nèi)容的大,這時(shí)候就可以使用 justify-content 或 align-content 來(lái)調(diào)整網(wǎng)格內(nèi)容的對(duì)齊了。具體就參考 flex 布局吧。

start

end

center

space-between

space-around

space-evenly

4.4align-content

參考上面的吧

五、其他

最近在實(shí)現(xiàn)一個(gè)兩欄布局的時(shí)候用了 grid 布局,但效果看起來(lái)有點(diǎn) bug,這里簡(jiǎn)單分享一下。

首先假設(shè) html 和 css 長(zhǎng)這樣:

  1. <div class="container"
  2.   <div></div> 
  3.   <div>abcdefg</b> 
  4. </div> 
  1. .container { 
  2.   display: grid; 
  3.   grid-template-columns: 100px 1fr; 
  4.   gap: 10px; 
  5.   width: 150px; 
  6.   border: 2px solid red; 

在寬度 150px 的容器里,我定義了兩列:100px 固定寬度和 1fr 鋪滿剩余空間。其中第二列里的內(nèi)容是一串連續(xù)字符,由于沒有特意設(shè)置 work-bread 屬性,所以顯然第二列的內(nèi)容會(huì)超出預(yù)期的寬度:

這種問題設(shè)置下 word-break: break-word 就好,但這是最簡(jiǎn)單的情景,如果遇上了 pre,情況就會(huì)有點(diǎn)迷惑。假設(shè) html 變成了這樣里面是 pre:

  1. <div class="container"
  2.   <div></div> 
  3.   <div width=100> 
  4.    <div overflow> 
  5.      <pre>123456789</pre> 
  6.    </div> 
  7.   </div> 
  8. </div> 

 

可以看到代碼塊溢出了。通常我們都是想 pre 代碼塊過長(zhǎng)時(shí)可以左右滾動(dòng),那給 pre 的父元素加個(gè) overflow: auto 是不是能解決問題呢?其實(shí)不能...而如果給第二列加一個(gè)固定寬度,的確可以解決問題,但這就不是預(yù)期的 1fr 了。

其實(shí)只要給第二列加一個(gè) min-width: 0 就能解決問題,在 grid 的配置里的話就是可以把上面的 1fr 改成 minmax(0, 1fr) ...

參考文檔:

https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Grids

https://developer.mozilla.org/zh-CN/docs/Web/CSS/grid-auto-flow

https://css-tricks.com/snippets/css/complete-guide-grid/

https://css-tricks.com/difference-explicit-implicit-grids/

https://cssgridgarden.com/

 

責(zé)任編輯:姜華 來(lái)源: Tecvan
相關(guān)推薦

2022-10-13 09:01:24

GridCSS二維布局

2022-10-08 00:02:00

CSS工具系統(tǒng)

2023-02-07 09:01:22

CSS

2024-04-09 10:10:23

GridCSS網(wǎng)格

2020-03-26 10:43:57

CSS Grid Ge Grid代碼

2018-08-08 15:57:05

csshtml前端

2025-04-27 09:12:42

2017-10-10 15:52:17

前端FlexboxCSS Grid

2025-04-08 05:55:00

CSS布局Grid

2017-03-12 10:38:56

Chromewindows

2022-03-23 08:01:36

CSSGrid小游戲

2022-04-15 14:57:57

Flex布局鴻蒙操作系統(tǒng)

2013-12-03 13:05:30

Lua腳本語(yǔ)言

2010-08-17 13:28:31

DIVCSS

2010-08-16 09:32:01

DivCSS

2010-09-10 15:36:29

CSS縮寫

2014-06-20 10:51:35

Linux LVM邏輯卷

2012-03-29 09:35:32

WEBCSS

2012-03-19 09:55:38

CSS

2011-06-03 08:49:54

Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)