Subgrid
åºçº¿
广æ³å¯ç¨
èª 2023å¹´9æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
CSS ç½æ ¼å¸å±æ¨¡å为 grid-template-columns å grid-template-rows æä¾äºä¸ä¸ª subgrid åå¼ãæ¬æå详ç»ä»ç»äºåç½æ ¼çä½ç¨ï¼å¹¶å举ä¸äºè¯¥ç¹æ§éç¨çä¾åå设计模å¼ã
åç½æ ¼ç®ä»
å½ä½ ä¸ºç½æ ¼å®¹å¨æ·»å display: grid æ ·å¼æ¶ï¼åªæç´æ¥åå
ç´ ä¼æä¸ºç½æ ¼é¡¹ï¼è¿äºç½æ ¼é¡¹éåå¯è¢«æ¾ç½®å¨ä½ å建çç½æ ¼ä¸ï¼èè¿äºç½æ ¼é¡¹çåå
ç´ ä»ä¼ä»¥å¸¸è§æµå¸å±å±ç¤ºã
ä½ å¯ä»¥éè¿å°ç½æ ¼é¡¹è®¾ç½®ä¸ºç½æ ¼å®¹å¨çæ¹å¼æ¥å®ç°ç½æ ¼çâåµå¥âã使¯ï¼è¿äºåµå¥ç½æ ¼ç¬ç«äºç¶ç½æ ¼ï¼å½¼æ¤ä¹ç¸äºç¬ç«ãè¿æå³çï¼å®ä»¬ä¸ä¼ç»§æ¿ç¶ç½æ ¼ç轨é尺寸ï¼è¿ä½¿å¾è®©åµå¥ç½æ ¼é¡¹ä¸ä¸»ç½æ ¼å¯¹é½åå¾ååå°é¾ã
å¦æä½ å¨ grid-template-columnsãgrid-template-rows æä¸ºäºè
åæ¶è®¾ç½® subgrid 屿§å¼ï¼é£ä¹è¯¥åµå¥ç½æ ¼ä¸ä¼çææ°ç轨éå表ï¼èæ¯ç´æ¥ç»§æ¿ç¶ç½æ ¼ä¸å®ä¹ç轨éã
ä¾å¦ï¼è¥ä½ 为åµå¥ç½æ ¼è®¾ç½® grid-template-columns: subgridï¼ä¸è¯¥åµå¥ç½æ ¼è·¨å ç¶ç½æ ¼çä¸å轨éï¼é£ä¹è¿ä¸ªåµå¥ç½æ ¼å°ä¼æä¸ç¶ç½æ ¼ç¸å大å°çä¸å轨éãå°½ç®¡ç½æ ¼é´è·ä¹ä¼è¢«ç»§æ¿ï¼ä½å¯ä»¥éè¿ä¸åç gap å¼è¿è¡è¦çãå
·åç½æ ¼çº¿å¯ä»¥ä»ç¶ç½æ ¼ä¼ éå°åç½æ ¼ï¼åç½æ ¼ä¹å¯ä»¥å£°æèªå·±çå
·åç½æ ¼çº¿ã
ååç½æ ¼
å¨ä¸æ¹ç¤ºä¾ä¸ï¼è¯¥ç½æ ¼å¸å±å
å« 9 个宽度为 1fr çå轨éï¼ä»¥å 4 è¡æå°é«åº¦ä¸º 100px çè¡è½¨éã
.item å
ç´ è¢«æ¾ç½®å¨ç¬¬ 2 è³ç¬¬ 7 åç½æ ¼çº¿ä¹é´ï¼ä½äºç¬¬ 2 è¡å°ç¬¬ 4 è¡ãè¯¥ç½æ ¼é¡¹èªèº«éè¿ä½¿ç¨ display: grid 被设å®ä¸ºç½æ ¼ï¼ç¶åå°å
¶å轨é设置为åç½æ ¼ï¼å³è®¾ç½® grid-template-columns: subgridï¼ï¼åæ¶ä½¿ç¨å¸¸è§çè¡è½¨éå®ä¹ï¼ä½¿å
¶æä¸ºä¸ä¸ªåæ¹ååç½æ ¼ãç±äºè¯¥åç½æ ¼è·¨å äº 5 å轨éï¼å æ¤å®èªèº«ä¹æ¥æ 5 å轨éã
å 为 .item å
ç´ æ¯ä¸ä¸ªåç½æ ¼ï¼å°½ç®¡ .subitem å
ç´ ä¸æ¯å¤å± .grid ç½æ ¼å®¹å¨çç´æ¥å项ï¼å®ä»ç¶å¯ä»¥è¢«æ¾ç½®å¨å¤å±ç½æ ¼ä¸ï¼å¹¶ä¸å®çåä¸å¤å±ç½æ ¼çå对é½ãç±äºå®çè¡è½¨é䏿¯åç½æ ¼ï¼å æ¤å
¶è¡ä¸ºå°±åä¸ä¸ªåµå¥çç½æ ¼ä¸æ ·ãç¶ç½æ ¼çåºå伿©å±å°è¶³å¤å¤§ä»¥å®¹çº³è¿ä¸ªåµå¥ç½æ ¼ã
<div class="grid">
<div class="item">
<div class="subitem"></div>
</div>
</div>
.grid {
display: grid;
grid-template-columns: repeat(9, 1fr);
grid-template-rows: repeat(4, minmax(100px, auto));
}
.item {
display: grid;
grid-column: 2 / 7;
grid-row: 2 / 4;
grid-template-columns: subgrid;
grid-template-rows: repeat(3, 80px);
}
.subitem {
grid-column: 3 / 6;
grid-row: 1 / 3;
}
注æï¼åç½æ ¼å çè¡å·ä¼éæ°å¼å§ââå½å¨åç½æ ¼å æ¶ï¼ç¬¬ 1 åå°±æ¯åç½æ ¼çç¬¬ä¸æ¡çº¿ãåç½æ ¼å ç´ ä¸ä¼ç»§æ¿ç¶ç½æ ¼å ç´ çè¡å·ãè¿æå³çä½ å¯ä»¥å®å ¨å°å¸å±ä¸ä¸ªç»ä»¶ï¼å°½ç®¡å®å¯è½ä¼è¢«æ¾ç½®å¨ä¸»ç½æ ¼çä¸åä½ç½®ä¸ï¼ä½ç»ä»¶ä¸çè¡å·å°å§ç»ä¿æä¸è´ã
è¡åç½æ ¼
è¿ä¸ªç¤ºä¾ä½¿ç¨äºä¸ä¸é¢ç¸åç HTMLï¼ä½æ¤å¤ subgrid æ¯ä»¥ grid-template-rows 弿¥åºç¨çï¼åæ¶å¯¹å轨éè¿è¡äºæ¾å¼å®ä¹ãå¨è¿ç§æ
åµä¸ï¼å轨éç表ç°ä¸å¸¸è§åµå¥ç½æ ¼ä¸è´ï¼èè¡è½¨éåä¸ .item å
ç´ æè·¨å ç两æ¡è½¨éç»å®ã
.grid {
display: grid;
grid-template-columns: repeat(9, 1fr);
grid-template-rows: repeat(4, minmax(100px, auto));
}
.item {
display: grid;
grid-column: 2 / 7;
grid-row: 2 / 4;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: subgrid;
}
.subitem {
grid-column: 2 / 4;
grid-row: 1 / 3;
}
两个维度ä¸çåç½æ ¼
æ¤ç¤ºä¾ä¸ï¼è¡ååå被å®ä¹ä¸ºåç½æ ¼ï¼ä½¿å¾è¯¥åç½æ ¼å¨ä¸¤ä¸ªç»´åº¦ä¸åä¸ç¶ç½æ ¼ç轨éç»å®ã
.grid {
display: grid;
grid-template-columns: repeat(9, 1fr);
grid-template-rows: repeat(4, minmax(100px, auto));
}
.item {
display: grid;
grid-column: 2 / 7;
grid-row: 2 / 4;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
}
.subitem {
grid-column: 3 / 6;
grid-row: 1 / 3;
}
åç½æ ¼ç»´åº¦ä¸æ²¡æéå¼ç½æ ¼
妿éè¦è®©é¡¹ç®èªå¨å¸å±ï¼å¹¶ä¸æ æ³ç¡®å®é¡¹ç®æ°éï¼é£ä¹å¨å建åç½æ ¼æ¶éè¦æ ¼å¤æ³¨æââå 为åç½æ ¼ä¼é»æ¢é¢å¤çè¡è¢«å建æ¥å®¹çº³è¿äºé¡¹ç®ã
æ¥çä¸ä¸ä¸ªç¤ºä¾ââ该示ä¾ä½¿ç¨äºä¸ä¸æç¤ºä¾ç¸åçç¶ç½æ ¼ååç½æ ¼ãåç½æ ¼å å ±æ 12 个项ï¼è¿äºé¡¹è¯å¾èªå¨æ¾ç½®å° 10 ä¸ªç½æ ¼åå ä¸ãç±äºè¯¥åç½æ ¼åæ¶ä½ç¨äºè¡åå两个维度ï¼å©ä½çä¸¤ä¸ªé¡¹ç®æ²¡æå°æ¹å¯ä»¥æ¾ç½®ï¼åªè½è¢«æ¾ç½®å°ç½æ ¼çæåä¸ä¸ªè½¨éãè¿æ¯è§èä¸å®ä¹çè¡ä¸ºã
<div class="grid">
<div class="item">
<div class="subitem">1</div>
<div class="subitem">2</div>
<div class="subitem">3</div>
<div class="subitem">4</div>
<div class="subitem">5</div>
<div class="subitem">6</div>
<div class="subitem">7</div>
<div class="subitem">8</div>
<div class="subitem">9</div>
<div class="subitem">10</div>
<div class="subitem">11</div>
<div class="subitem">12</div>
</div>
</div>
.grid {
display: grid;
grid-template-columns: repeat(9, 1fr);
grid-template-rows: repeat(4, minmax(100px, auto));
}
.item {
display: grid;
grid-column: 2 / 7;
grid-row: 2 / 4;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
}
ç§»é¤ grid-template-rows çå¼åï¼å¸¸è§çéå¼è½¨éçææºå¶ä¾¿ä¼è¢«æ¿æ´»ï¼ä¼æ ¹æ®éè¦èªå¨å建足å¤çè¡ãè¿äºè¡å°ä¸ä¼ä¸ç¶ç½æ ¼ç轨é对é½ã
<div class="grid">
<div class="item">
<div class="subitem">1</div>
<div class="subitem">2</div>
<div class="subitem">3</div>
<div class="subitem">4</div>
<div class="subitem">5</div>
<div class="subitem">6</div>
<div class="subitem">7</div>
<div class="subitem">8</div>
<div class="subitem">9</div>
<div class="subitem">10</div>
<div class="subitem">11</div>
<div class="subitem">12</div>
</div>
</div>
.grid {
display: grid;
grid-template-columns: repeat(9, 1fr);
grid-template-rows: repeat(4, minmax(100px, auto));
}
.item {
display: grid;
grid-column: 2 / 7;
grid-row: 2 / 4;
grid-template-columns: subgrid;
grid-auto-rows: minmax(100px, auto);
}
é´é屿§ä¸åç½æ ¼
ç¶ç½æ ¼ä¸è®¾ç½®çä»»ä½ gapãcolumn-gap æ row-gap çå¼é½ä¼ä¼ éå°åç½æ ¼ï¼ä½¿åç½æ ¼è½¨éä¹é´çé´è·ä¸ç¶ç½æ ¼ä¿æä¸è´ã该é»è®¤è¡ä¸ºå¯ä»¥éè¿å¨åç½æ ¼å®¹å¨ä¸åºç¨ gap-* 屿§æ¥è¦çã
å¨è¿ä¸ªç¤ºä¾ä¸ï¼ç¶ç½æ ¼çè¡ååé´è·ä¸º 20pxï¼èåç½æ ¼ç row-gap 被设置为 0ã
<div class="grid">
<div class="item">
<div class="subitem"></div>
<div class="subitem2"></div>
</div>
</div>
.grid {
display: grid;
grid-template-columns: repeat(9, 1fr);
grid-template-rows: repeat(4, minmax(100px, auto));
gap: 20px;
}
.item {
display: grid;
grid-column: 2 / 7;
grid-row: 2 / 4;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
row-gap: 0;
}
.subitem {
grid-column: 3 / 6;
grid-row: 1 / 3;
}
.subitem2 {
background-color: rgb(0 0 0 / 0.5);
grid-column: 2;
grid-row: 1;
}
å¦æä½ å¨å¼åè
å·¥å
·çç½æ ¼æ£æ¥å¨ä¸æ¥çï¼ä½ å°ä¼æ³¨æå°åç½æ ¼ç线ä½äºé´è·ä¸å¤®ãå°é´é设置为 0 çææç±»ä¼¼äºç»å
ç´ è®¾ç½®è´å¤è¾¹æ¡ï¼è½æåæ¬ç±é´è·å æ®ç空é´è¿ç»ç½æ ¼é¡¹ç®ã

å ·åç½æ ¼çº¿
ä½¿ç¨ CSS ç½æ ¼æ¶ï¼ä½ å¯ä»¥ä¸ºç½æ ¼çº¿å½åï¼ç¶åæ ¹æ®è¿äºç½æ ¼çº¿åç§°èéç½æ ¼çº¿ç¼å·æ¥å®ä½é¡¹ç®ãç¶ç½æ ¼çº¿ä¸ç线åä¼è¢«ä¼ éå°åç½æ ¼ï¼ä½ å¯ä»¥ä½¿ç¨è¿äºçº¿åæ¥æ¾ç½®é¡¹ç®ãå¨ä¸é¢ç示ä¾ä¸ï¼ç¶ç½æ ¼çå
·å线 col-start å col-end è¢«ç¨æ¥æ¾ç½®å项ç®ã
<div class="grid">
<div class="item">
<div class="subitem"></div>
</div>
</div>
.grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr [col-start] 1fr 1fr 1fr [col-end] 1fr 1fr 1fr;
grid-template-rows: repeat(4, minmax(100px, auto));
gap: 20px;
}
.item {
display: grid;
grid-column: 2 / 7;
grid-row: 2 / 4;
grid-template-columns: subgrid;
grid-template-rows: subgrid;
}
.subitem {
grid-column: col-start / col-end;
grid-row: 1 / 3;
}
ä½ ä¹å¯ä»¥ä¸ºåç½æ ¼æå®ç½æ ¼çº¿åç§°ãè¿å¯ä»¥éè¿å¨ subgrid å
³é®ååæ·»å ç¨æ¹æ¬å·æ¬èµ·æ¥çç½æ ¼çº¿åç§°å表æ¥å®ç°ãä¾å¦ï¼å¦æä½ çåç½æ ¼æåæ¡çº¿ï¼è¦ä¸ºå®ä»¬å½åï¼å¯ä»¥ä½¿ç¨è¯æ³ grid-template-columns: subgrid [line1] [line2] [line3] [line4]ã
å¨åç½æ ¼ä¸æå®ç线ä¼è¢«æ·»å å°ç¶ç½æ ¼ä¸æå®ç线ä¸ï¼å æ¤ä½ å¯ä»¥ä½¿ç¨ç¶ç½æ ¼ç线ãåç½æ ¼ççº¿ï¼æè 两è é½ä½¿ç¨ãå¨è¿ä¸ªç¤ºä¾ä¸ï¼ä¸ä¸ªé¡¹ç®æ¯ä½¿ç¨ç¶ç½æ ¼ç线æ¾ç½®çï¼å¦ä¸ä¸ªå使ç¨åç½æ ¼ç线æ¾ç½®ã
<div class="grid">
<div class="item">
<div class="subitem"></div>
<div class="subitem2"></div>
</div>
</div>
.grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr [col-start] 1fr 1fr 1fr [col-end] 1fr 1fr 1fr;
grid-template-rows: repeat(4, minmax(100px, auto));
gap: 20px;
}
.item {
display: grid;
grid-column: 2 / 7;
grid-row: 2 / 4;
grid-template-columns: subgrid [sub-a] [sub-b] [sub-c] [sub-d] [sub-e] [sub-f];
grid-template-rows: subgrid;
}
.subitem {
grid-column: col-start / col-end;
grid-row: 1 / 3;
}
.subitem2 {
background-color: rgb(0 0 0 / 0.5);
grid-column: sub-b / sub-d;
grid-row: 1;
}
使ç¨åç½æ ¼
åç½æ ¼çè¡ä¸ºä¸åµå¥ç½æ ¼é常ç¸ä¼¼ï¼å¯ä¸çåºå«æ¯åç½æ ¼ç轨é尺寸æ¯å¨ç¶ç½æ ¼ä¸è®¾ç½®çãç¶èï¼åä»»ä½åµå¥ç½æ ¼ä¸æ ·ï¼åç½æ ¼ç轨é尺寸ä¼éçå 容大尿¹åï¼åææ¯ä½¿ç¨ç轨éå°ºå¯¸æ¹æ³å 许å 容影å大å°ãå¨è¿ç§æ åµä¸ï¼èªå¨è°æ´å¤§å°çè¡è½¨é伿 ¹æ®ç¶ç½æ ¼ååç½æ ¼çå 容èªå¨æ©å±æ¥éåºå 容ã
ç±äºåç½æ ¼çä½ç¨æ¹å¼ä¸å¸¸è§çåµå¥ç½æ ¼è¡ä¸ºé常ç¸ä¼¼ï¼å æ¤å¨ä¸¤è
ä¹é´åæ¢é常容æãä¾å¦ï¼å¦æä½ åç°éè¦ä¸ºè¡å建ä¸ä¸ªéå¼ç½æ ¼ï¼åéè¦ç§»é¤ grid-template-rows ä¸ç subgrid 屿§å¼ï¼å¹¶å¯è½éè¦ä¸º grid-auto-rows 屿§è®¾ç½®ä¸ä¸ªå¼ï¼ä»¥æ¤æ§å¶éå¼è½¨éç尺寸ã
è§è
| è§è |
|---|
| CSS Grid Layout Module Level 2 > # subgrids > |
æµè§å¨å ¼å®¹æ§
åè§
- è§é¢ï¼ä½¿ç¨åç½æ ¼æå¸è¡¨åï¼2019ï¼
- è§é¢ï¼ä¸è¦ç¹è±«ï¼ç«å³ä½¿ç¨åç½æ ¼æ¥ä¼åå¡çå¸å±ï¼2019ï¼
- è§é¢ï¼ä½ 好ï¼åç½æ ¼ï¼ï¼æ¥èª CSSConf.eu çæ¼è®²ï¼2019ï¼