Hvor er Subgrid gavnligt?
Et grid styrer sine direkte børn. Når et barn selv bliver et grid, får det normalt sine egne spor. Derfor kan overskrifter, tekst og knapper i nabokort miste deres fælles alignment, selv om kortene står pænt i det overordnede grid.
Med subgrid deler et nested grid de spor, det spænder over i parentens grid. Du vælger selv, om det gælder rækker, kolonner eller begge akser. Det er nyttigt til både card-lister og full-bleed-sektioner, hvis indhold skal følge resten af siden.
Fælles rækker i cards
Tre kort med hver sit grid-template-rows: auto auto auto beregner deres rækker uafhængigt. En lang overskrift i ét kort flytter derfor ikke automatisk teksten i nabokortene.
Lad kortene dele rækker i stedet:
.cards { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-rows: auto auto auto; gap: 1rem;}
.card { display: grid; grid-template-rows: subgrid; grid-row: span 3;}grid-row: span 3 giver hvert kort tre rækker at dele, fx overskrift, tekst og footer. Indhold i kortene bidrager til de fælles rækkers størrelse, så en høj overskrift giver plads i samme række på tværs af kortene.
Hvis der kommer flere kort end de tre kolonner kan rumme, opretter parent-gridet flere implicitte rækker. Kortene på næste række deler deres egen gruppe af spor. De arver ikke automatisk samme højder som gruppen ovenover.
Prøv længere overskrifter og mere brødtekst i demoen. Se især, hvordan fælles rækker adskiller sig fra blot at give kortene samme samlede højde.
Øvelse: Fix alignment
Få labels og værdier i specifikationslisterne til at flugte som i referencen. Hver række har i udgangspunktet sit eget grid med max-content 1fr, så labelbredden kan variere mellem rækkerne.
Undersøg, hvilket element der skal definere de fælles kolonner, og lad rækkerne låne dem med subgrid. Husk både display: grid og at spænde over de spor, der skal deles. Test med et længere label, når linjerne flugter.
Page layout og full-bleed
I layoutmønstrene fra del 1 placeres almindeligt indhold i midterkolonnen, mens en full-bleed-sektion spænder over hele gridet. Men sektionens børn får ikke automatisk adgang til sidens kolonner.
Undersøg først problemet i demoen: hvilke elementer følger indholdsbredden, og hvilke ligger inde i en wrapper, der afbryder forbindelsen?
Lad full-bleed-sektionen dele sidens kolonner:
.container { display: grid; grid-template-columns: [full-start] 1fr [content] minmax(0, 1200px) 1fr [full-end]; column-gap: 1rem;
> * { grid-column: content; }}
.container > .full-bleed { grid-column: full; display: grid; grid-template-columns: subgrid;
> * { grid-column: content; }}Sektionen spænder over sidens grid, men dens indhold kan stadig placeres på linjen content. Hvis der er flere wrappers imellem, skal forbindelsen etableres gennem de relevante grid-items på hvert niveau.
Giv grid-linjerne navne
Et subgrid nummererer sine linjer lokalt fra 1. Derfor peger grid-column: 3 ikke på samme linje i parent og subgrid. Navngivne linjer fra parenten er også tilgængelige i subgridet på den delte akse og inden for dets spænd. Se mere i nedenstående demo.
Gør .box-2 til et subgrid, og sammenlign placering med linjenummer og linjenavn. Navngiv den relevante linje c, og brug grid-column: c på både .box-1 og .box-2b.
Øvelse
Makro-layout med full-bleed
Lad body definere sidens spor. Lad derefter de relevante wrappers dele kolonnerne med subgrid, og placér deres indhold på content-sporet. Start eventuelt med tal, og omskriv derefter til navngivne linjer.
Faldgruber
Hvis linjerne ikke flugter, så kontrollér:
- Er elementet både et grid-item og selv sat til
display: grid? - Deler du den rigtige akse med
grid-template-rowsellergrid-template-columns? - Spænder elementet over alle de spor, det skal dele?
- Forveksler du subgridets lokale linjenumre med parentens?
- Afbryder en wrapper forbindelsen til det overordnede grid?