<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                &emsp;&emsp;網格布局(Grid Layout)也叫柵格布局,與表格布局類似,也依賴行和列。但與之不同的是,網格布局能直接控制HTML文檔中元素的順序、位置和大小等,而不用再借助輔助元素。 ## 一、術語 &emsp;&emsp;下圖展示了CSS規范中定義的網格。 :-: ![](https://img.kancloud.cn/bb/6a/bb6a137cc4006d6d512da2bbd000178c_782x691.png =400x) &emsp;&emsp;(1)網格容器(grid container)由display屬性的兩個特殊值(grid和inline-grid)所創建,由于它不是塊級容器,因此其布局不受浮動和外邊距塌陷的影響。 &emsp;&emsp;(2)網格項(grid item)也叫網格元素,是網格容器的子元素,注意,它的后代元素不是網格項,但它自身也能變為網格容器。 &emsp;&emsp;(3)網格線(grid line)為網格容器劃分不同的區域,注意,網格線的數量沒有限制。 &emsp;&emsp;(4)網格單元(grid cell)是由四條網格線限定的區域,其內部不會有其它的網格線。 &emsp;&emsp;(5)網格區域(grid area)由一個或多個相鄰的網格單元組成的矩形區域,最大的網格區域會包含所有的網格單元。 &emsp;&emsp;(6)網格軌道(grid track)是由兩條網格線夾住的區域,從容器的一邊延伸到另一邊,水平方向的叫網格行(grid row),垂直方向的叫網格列(grid column),它們的尺寸由網格線的位置決定。 ## 二、行和列 &emsp;&emsp;grid-template-rows和grid-template-columns兩個屬性可以定義網格線的名稱和網格軌道的尺寸,前者可聲明行的數量,后者可聲明列的數量。 &emsp;&emsp;在下面的示例中,將網格容器分成兩行三列,其中第一列的寬度是50px(即第二條網格線在距離容器左邊界50px的位置),第二列的寬度是容器寬度的一半(即第三條網格線距離上一條網格線的偏移是容器寬度的一半),第三列的寬度是30px。 ~~~html <style> div { display: grid; width: 200px; height: 100px; grid-template-rows: 50px 50px; grid-template-columns: 50px 50% 30px; } </style> <div> <section>1</section> <section>2</section> <section>3</section> <section>4</section> <section>5</section> <section>6</section> </div> ~~~ &emsp;&emsp;下圖的左側是上述代碼的效果,右側中的虛線是生成的網格線,后文會反復使用這種格式的標注圖。注意,網格線可以不與容器的邊界接觸,兩個屬性中的百分數參照的是網格容器的寬度或高度。 :-: ![](https://img.kancloud.cn/80/a1/80a18657b36d31e668910acfa7b21c46_855x213.png =400x) &emsp;&emsp;如果要占滿網格容器的橫向空間,那么可以使用minmax()函數,如下所示。minmax(30px, 100%)表示該列所占的空間在30px和容器寬度之間,即不能小于30px并且不能大于容器寬度,效果如下圖所示。 ~~~css div { grid-template-columns: 50px 50% minmax(30px, 100%); } ~~~ :-: ![](https://img.kancloud.cn/57/0e/570e4c8785a019f53c5c7b92406758ff_855x213.png =400x) &emsp;&emsp;如果要為網格線命名,那么可以將名稱放在值的恰當位置(例如名稱在值之前,樣式如下),并用方括號包裹。 ~~~css div { grid-template-columns: [col-a] 50px [col-b] 50% [col-c] minmax(30px, 100%) [col-d]; } ~~~ **1)fr** &emsp;&emsp;在網格布局中,包含一個全新的fr單位,能將空間分成一定份數,彈性的分配給行或列,這個單位的作用類似于彈性盒中的flex-grow屬性。在下面的示例中,將容器均分為3列,效果如下圖所示。 ~~~css div { grid-template-columns: 1fr 1fr 1fr; } ~~~ :-: ![](https://img.kancloud.cn/cb/83/cb83decdf66e8cfdd46b128259d14f19_855x213.png =400x) &emsp;&emsp;注意,fr可與其它長度單位混合使用,其作用的是可用空間,即剩余空間。在下面的示例中,將第一列寬度固定,剩余的空間由兩列均分,效果如下圖所示。 ~~~css div { grid-template-columns: 30px 1fr 1fr; } ~~~ :-: ![](https://img.kancloud.cn/45/cc/45cc9fe78d71bed64b4f02c9dd18c4f9_855x213.png =400x) **2)min-content和max-content** &emsp;&emsp;當網格軌道的尺寸與其內容有關時,可使用這兩個關鍵字。min-content會占據內容所需的最小空間,例如將min-content應用于網格容器的第二列,樣式如下,效果如下圖所示,網格項中有大量的斷行。 ~~~html <style> div { grid-template-columns: 30px min-content 1fr; } </style> <div> <section>1</section> <section>2 2 2</section> <section>3</section> <section>4</section> <section>5</section> <section>6</section> </div> ~~~ :-: ![](https://img.kancloud.cn/67/5a/675af563bed3655dea272511c3b5218f_855x213.png =400x) &emsp;&emsp;max-content的作用正好與min-content相反,它會占據內容所需的最大空間。將max-content也應用到上面的第二列,樣式如下,效果如下圖所示,網格項為了防止文本換行,會不斷地擴大其寬度。 ~~~css div { grid-template-columns: 30px max-content 1fr; } ~~~ :-: ![](https://img.kancloud.cn/21/2b/212bb3763c47c5b4b059a2f2cd342bde_855x213.png =400x) **3)fit-content()** &emsp;&emsp;該函數的參數是一個長度值或百分數,能將占用空間指定成特定的值,它相當于下面等號右邊的公式。 ~~~ fit-content(argument) = min(max-content, max(min-content, argument)) ~~~ &emsp;&emsp;先將接收的參數與min-content比較,得出較大值,再將該值與max-content比較,得到較小值。理解起來比較拗口,如果換成minmax()函數,含義就比較清晰了,與fit-content(argument)等價的公式如下。 ~~~ minmax(min-content, max-content) ~~~ **4)repeat()** &emsp;&emsp;該函數能為網格軌道聲明重復的行或列,它的第一個參數是重復次數,第二個參數是軌道尺寸,例如將網格容器均分成三列,樣式如下。 ~~~css div { grid-template-columns: repeat(3, 1fr); /* 等價于 */ grid-template-columns: repeat(1fr, 1fr, 1fr); } ~~~ &emsp;&emsp;注意,軌道尺寸不局限于一個,可以指定多個,樣式如下,效果如下圖所示。 ~~~css div { grid-template-columns: repeat(2, 20px 1fr); } ~~~ :-: ![](https://img.kancloud.cn/d9/7f/d97f4f6ae4eb6334396847d405dee83e_855x213.png =400x) ## 三、網格項 &emsp;&emsp;通過起始和終止處的網格線的名稱或編號可指定網格項的位置,其中列的編號從左到右依次遞增,行的編號從上到下依次遞增,如下圖所示。 :-: ![](https://img.kancloud.cn/34/c2/34c2f44bba0689196e30dd8aadb61372_287x219.png =300x) &emsp;&emsp;在下面的示例中,將網格容器均分成三行四列,并且把第一個section元素指定到第二行第二列的位置,效果如下圖所示。 ~~~html <style> div { grid-template-rows: repeat(3, 1fr); grid-template-columns: repeat(4, 1fr); } .one { grid-row-start: 2; grid-row-end: 3; grid-column-start: 2; grid-column-end: 3; } </style> <div> <section class="one">1</section> <section>2</section> <section>3</section> <section>4</section> <section>5</section> <section>6</section> <section>7</section> <section>8</section> <section>9</section> <section>10</section> </div> ~~~ :-: ![](https://img.kancloud.cn/01/d8/01d87a7c0dec3a5506e3975f7c009c10_855x213.png =400x) &emsp;&emsp;將下面的樣式添加給第一個section元素,可以得到跨列的效果,如下圖所示。 ~~~css .two { grid-row-start: 2; grid-row-end: 3; grid-column-start: 2; grid-column-end: 4; } ~~~ :-: ![](https://img.kancloud.cn/ac/52/ac5207b276fa711dc834dc3f74aed1e2_855x213.png =400x) &emsp;&emsp;網格線的編號支持負數,也就是以相反的方式計數,從后往前或從下往上,例如將第一個section元素放置在容器的右下角,樣式如下,效果如下圖所示。 ~~~css .three { grid-row-start: -2; grid-row-end: -1; grid-column-start: -2; grid-column-end: -1; } ~~~ :-: ![](https://img.kancloud.cn/5e/30/5e30676c8524d1db39741ed65c45864d_855x213.png =400x) **1)span** &emsp;&emsp;還有另一種方式可用來指定網格項的位置,即用span和正整數組合,表示要跨的網格軌道數目。在下面的樣式中,“span 2”用于跨過兩列。 ~~~css .four { grid-row-start: 2; grid-row-end: 3; grid-column-start: 2; grid-column-end: span 2; } ~~~ &emsp;&emsp;當把span應用于grid-row-start或grid-column-start屬性時,將會沿著網格開始的方向計數,樣式如下,效果如下圖所示。 ~~~css .five { grid-row-start: 2; grid-row-end: 3; grid-column-start: span 2; grid-column-end: 3; } ~~~ :-: ![](https://img.kancloud.cn/78/04/780491cb0e2fedb7442ce2b8b9f7eb7d_855x213.png =400x) &emsp;&emsp;注意,span后面可以省略數字,默認是1,但不能跟零或負數。 **2)簡寫屬性** &emsp;&emsp;grid-row是grid-row-start和grid-row-end的簡寫屬性,grid-column是grid-column-start和grid-column-end的簡寫屬性。 &emsp;&emsp;grid-row和grid-column可分別將行和列的起止網格線聲明在一行,并用斜杠(/)分隔,如下所示。 ~~~css .six { grid-row: 2 / 3; grid-column: 2 / span 2; } ~~~ &emsp;&emsp;注意,由于默認跨度是1,因此可以省略grid-row和grid-column斜杠后的數字,如下所示。 ~~~css .seven { grid-row: 2; grid-column: 2; } ~~~ &emsp;&emsp;grid-area是grid-row-start、grid-row-end、grid-column-start和grid-column-end的簡寫屬性,也可用斜杠(/)將值分隔,如下所示。 ~~~css .eight { grid-area: 2 / 2 / 3 / span 2; } ~~~ &emsp;&emsp;注意,網格線值的順序是:起始行、起始列、終止行、終止列,圍繞網格項逆時針排列。 **3)重疊** &emsp;&emsp;當兩個網格項發生重疊時,可通過z-index屬性來決定誰在上,誰在下。例如為兩個section元素分別添加下面的樣式,效果如下圖所示,第二個section元素覆蓋了第一個section元素。 ~~~html <style> .overlap1 { grid-row: 1; grid-column: 1 / span 2; } .overlap2 { grid-row: 1; grid-column: 2 / span 2; } </style> <div> <section class="overlap1">1</section> <section class="overlap2">2</section> <section>3</section> <section>4</section> <section>5</section> <section>6</section> <section>7</section> <section>8</section> <section>9</section> <section>10</section> </div> ~~~ :-: ![](https://img.kancloud.cn/ab/fa/abfa6ff59980f4cf46f9f380581f346a_412x213.png =300x) &emsp;&emsp;當為第一個section元素添加z-index屬性后(樣式如下),就會覆蓋第二個section元素,效果如下圖所示。 ~~~css .overlap1 { z-index: 1; } ~~~ :-: ![](https://img.kancloud.cn/09/15/09153c411166b7ce2cfa0ac2fc90c843_411x213.png =300x) **4)自動增加網格線** &emsp;&emsp;當網格項超出容器邊界時,可通過grid-auto-rows和grid-auto-columns分別控制行和列的尺寸。 &emsp;&emsp;在下面的示例中,將網格容器分成兩行三列,它的第七個超出邊界的網格項的高度默認是內容的高度,即“height:auto”,效果如下圖所示。 ~~~html <style> div { grid-template-rows: 50px 50px; grid-template-columns: repeat(3, 1fr); } </style> <div> <section>1</section> <section>2</section> <section>3</section> <section>4</section> <section>5</section> <section>6</section> <section>7</section> </div> ~~~ :-: ![](https://img.kancloud.cn/1c/b1/1cb142d4042893dc14af75bdacb99187_413x258.png =300x) &emsp;&emsp;當為網格容器添加grid-auto-rows屬性后,就能改變網格項的高度,如下所示,效果如下圖所示。 ~~~css div { grid-auto-rows: 50px; } ~~~ :-: ![](https://img.kancloud.cn/49/10/491056c21185691a2c2a6d8c211da8f7_413x310.png =300x) &emsp;&emsp;grid-auto-columns的用法與之類似,但修改的是超出邊界的網格項的寬度。在下圖中,左側是默認超出時的寬度,即內容的寬度(width:auto);右側是為容器添加下面樣式后的寬度。 ~~~css div { grid-auto-flow: column; grid-auto-columns: 50px; } ~~~ :-: ![](https://img.kancloud.cn/2b/21/2b21813c8540c2452745491e89ab618c_855x213.png =400x) &emsp;&emsp;注意,grid-auto-flow是一個網格流屬性,可讓網格項按列排序,后文第五節會重點講解。 ## 四、網格區域 &emsp;&emsp;通過grid-template-areas屬性能夠以可視化的方式聲明網格布局,其值是用空格或換行符分隔的字符串列表,每段字符串又是以空格分隔的自定義標識符,如下所示。 ~~~css div { grid-template-areas: "a b b" "a . c"; } ~~~ &emsp;&emsp;每個標識符表示一個網格單元,注意,組合在一起的形狀必須得是矩形。當只需要占位時,可以使用點號(.)創建匿名單元。 &emsp;&emsp;為了將網格項與網格區域關聯,需要使用grid-area屬性。通過它來引用命名好的網格區域,如下所示,grid-area的屬性值就是grid-template-areas屬性中的標識符,效果如下圖所示。 ~~~html <style> .a { grid-area: a; } .b { grid-area: b; } .c { grid-area: c; } </style> <div> <section class="a">a</section> <section class="b">b</section> <section class="c">c</section> </div> ~~~ :-: ![](https://img.kancloud.cn/6b/b9/6bb98a59c2791a99446d9409c95e199d_855x213.png =400x) ## 五、網格流 &emsp;&emsp;網格流可由grid-auto-flow屬性控制,它分為兩種填充方式:逐行和逐列,并且兩者都可通過稠密模式更高效地占用網格單元。 &emsp;&emsp;在下面的示例中,第一個div元素中的網格項會先填滿一行再換到下一行,效果如下圖的左側;第二個div元素中的網格項會先填滿一列再換到下一列,效果如下圖的右側。 ~~~html <style> .row { grid-auto-flow: row; } .column { grid-auto-flow: column; } </style> <div class="row"> <section>1</section> <section>2</section> <section>3</section> <section>4</section> <section>5</section> <section>6</section> </div> <div class="column"> <section>1</section> <section>2</section> <section>3</section> <section>4</section> <section>5</section> <section>6</section> </div> ~~~ :-: ![](https://img.kancloud.cn/4f/77/4f77b96d5f0be498130a81676de0db69_855x213.png =400x) &emsp;&emsp;grid-auto-flow屬性默認是稀疏模式,而稠密模式會盡力找出最前面的空位置。假設網格容器包含三個網格項,其中有兩個會占用兩個網格單元,樣式如下,效果如下圖所示,第一個網格項之后的網格單元閑置著。 ~~~html <style> .across { grid-column: auto / span 2; } </style> <div class="row"> <section class="across">1</section> <section class="across">2</section> <section>3</section> </div> ~~~ :-: ![](https://img.kancloud.cn/a9/cd/a9cd4583c2742c1c25104e50d26f3580_413x213.png =300x) &emsp;&emsp;當為網格容器的grid-auto-flow屬性添加dense后,就能觸發稠密模式,得到的效果如下圖所示,第三個網格項會移動到第一個之后。 ~~~css .row { grid-auto-flow: row dense; } ~~~ :-: ![](https://img.kancloud.cn/e7/81/e7819ef0855a049b19a3aff7653a5b55_413x213.png =300x) ## 六、間距 &emsp;&emsp;間距(gutter)也叫空距或欄距,用于控制兩個網格軌道之間的距離,類似于將網格線加粗,使其具有寬度。 &emsp;&emsp;間距可由grid-row-gap和grid-column-gap兩個屬性設定,但要注意,現在這兩個屬性已改名成row-gap和column-gap,它們相當于表格樣式中的border-spacing屬性。在下面的示例中,為網格容器添加了兩個方向的間距,效果如下圖所示。 ~~~css div { row-gap: 10px; column-gap: 20px; } ~~~ :-: ![](https://img.kancloud.cn/77/55/7755da4755098838d3729c5d139e9fa0_412x211.png =300x) &emsp;&emsp;grid-gap是一個簡寫屬性,可將行和列的間距組合在一起定義,下面樣式的效果與上圖一樣。注意,該屬性現已改名成gap。 ~~~css div { gap: 10px 20px; } ~~~ &emsp;&emsp;順便說一句,CSS規范提供了一個簡寫屬性:grid,可將上述grid-template-rows、grid-auto-rows、row-gap等屬性組合在一起聲明。 ## 七、對齊方式 &emsp;&emsp;網格布局中的對齊屬性與彈性盒中的類似,也是使用下表中的相關屬性。 :-: ![](https://img.kancloud.cn/72/c7/72c7e4a745f17e787272b4d376e15605_739x517.png =500x) **1)對齊網格項** &emsp;&emsp;justify-self和align-self兩個屬性適用于單個網格項,它們的默認值都是stretch,其它可選的關鍵字包括start、end和center等。 &emsp;&emsp;假設有一個兩行三列的網格容器,為它的四個網格項分別添加四個不同關鍵字的justify-self屬性,效果如下圖所示。 ~~~html <style> div { display: grid; grid-template-rows: repeat(2, 1fr); grid-template-columns: repeat(3, 1fr); } .justify-self-start { justify-self: start; } .justify-self-end { justify-self: end; } .justify-self-center { justify-self: center; } .justify-self-stretch { justify-self: stretch; } </style> <div> <section class="justify-self-start">start</section> <section class="justify-self-center">center</section> <section class="justify-self-end">end</section> <section class="justify-self-stretch">stretch</section> </div> ~~~ :-: ![](https://img.kancloud.cn/c0/85/c08570e3cfef0e68bdf0ddbd15f0f577_813x213.png =400x) &emsp;&emsp;將這四個關鍵字賦給align-self屬性,再應用到另一個兩行三列的網格容器中,得到的效果如下圖所示。 :-: ![](https://img.kancloud.cn/92/2e/922ebb8c818ef6037d9f814993c122a8_811x213.png =400x) &emsp;&emsp;justify-items和align-items兩個屬性適用于網格容器,它們的默認值也是stretch,可選的關鍵字與之前的兩個屬性類似,下面的樣式在為之前的div元素(網格容器)添加justify-items屬性。 ~~~css div { justify-items: start; } ~~~ **2)對齊網格軌道** &emsp;&emsp;justify-content和align-content兩個屬性適用于網格容器,可用的關鍵字包括start、end、center、space-between和space-around等。 &emsp;&emsp;下圖展示了這五個關鍵字賦給justify-content屬性后,再分別應用于網格容器的效果。 :-: ![](https://img.kancloud.cn/51/fb/51fb79f421e6841d71fe3e57d4904e45_1600x562.png =800x) &emsp;&emsp;下圖展示了這五個關鍵字賦給align-content屬性后,再分別應用于網格容器的效果。 :-: ![](https://img.kancloud.cn/17/6c/176c28a59f524066353d831bdee6c6b0_1600x564.png =800x) ## 八、排序 &emsp;&emsp;在網格布局中,也可以像彈性盒那樣使用order屬性調整網格項的順序。注意,order屬性作用于網格項,其值是一個整數,包括零和負數。在下面的示例中,將第一個和第三個section元素調換了次序,效果如下圖所示。 ~~~html <style> .first { order: 1; } .second { order: 2; } .third { order: 3; } </style> <div> <section class="third">1</section> <section class="second">2</section> <section class="first">3</section> </div> ~~~ :-: ![](https://img.kancloud.cn/9a/b2/9ab29fe716762f40c56fda2405433390_410x103.png) ***** > 原文出處: [博客園-CSS躬行記](https://www.cnblogs.com/strick/category/1667864.html) [知乎專欄-CSS躬行記](https://zhuanlan.zhihu.com/pwcss) 已建立一個微信前端交流群,如要進群,請先加微信號freedom20180706或掃描下面的二維碼,請求中需注明“看云加群”,在通過請求后就會把你拉進來。還搜集整理了一套[面試資料](https://github.com/pwstrick/daily),歡迎瀏覽。 ![](https://box.kancloud.cn/2e1f8ecf9512ecdd2fcaae8250e7d48a_430x430.jpg =200x200) 推薦一款前端監控腳本:[shin-monitor](https://github.com/pwstrick/shin-monitor),不僅能監控前端的錯誤、通信、打印等行為,還能計算各類性能參數,包括 FMP、LCP、FP 等。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看