utvikling

CSS-utvidelse skal gjøre det mye enklere å få til «masonry layout» på weben

Aktiveres med bare én kodelinje.

Pinterest er kjent for å bruke «masonry layout» i visningen av bilder i ulike størrelser. Den horisontale avstanden mellom bildene er omtrent den samme hele veien.
Pinterest er kjent for å bruke «masonry layout» i visningen av bilder i ulike størrelser. Den horisontale avstanden mellom bildene er omtrent den samme hele veien. Skjermbilde: Digi.no

«Masonry layout» er en utforming som er også populær å bruke i apper og på weben, ikke minst der hvor man ønsker å vise bildesamlinger hvor bildene har varierende høyde-/breddeforhold. For å få det til å se jevnt ut, brukes gjerne faste kolonner som fylles opp nedenfra, samtidig som den horisontale avstanden mellom hvert av bildene er fast. Det er altså ingen faste rader i en slik layout.

Et godt eksempel på dette finner man på nettstedet til Pinterest. Her vises bilder med ulike høyde- og breddeforhold om hverandre, samtidig som avstanden mellom bildene er (omtrent) like stor overalt.

Foreløpig må man bruke løsninger basert på for eksempel JavaScript eller CSS Multi-column Layout for å få til dette.

En ny layoutmodus

Snart kan dette bli betydelig enklere å få til med en kommende utvidelse til CSS Grid Layout. Spesifikasjonen for dette er på utkastnivå og heter CSS Grid Layout Module Level 3. Det den bringer på banen, er nettopp «masonry layout» som en ny layoutmodus for grid-konteinere.

I praksis opprettet man en grid-konteiner på vanlig måte, med CSS-regler for kolonnene (grid-template-columns) i konteineren og avstanden (gap) mellom barneelementene inne i konteineren.

I en slik container vil i utgangspunktet barneelementene (for eksempel bilder) vises fra venstre mot høyre inntil bredden på den øverste raden er fylt opp. Det neste barneelementet vil så vises helt til venstre på en ny rad i konteineren, og så fylles denne raden opp mot høyre. Og slik fortsetter det. På hver rad vil elementene være stilt vertikalt på linje, som på illustrasjonen under.

En CSS Grid uten bruk av masonry layout, vist i Chrome 88. Illustrasjon: Mozilla
En CSS Grid uten bruk av masonry layout, vist i Chrome 88.

Men så kan man ta i bruk følgende CSS-regel:

grid-template-rows: masonry;

Da blir layouten ovenfor seende slik ut:

En CSS Grid-konteiner med masonry layout, som vist i Firefox 85 med eksperimentell funksjonalitet aktivert. Illustrasjon: Mozilla
En CSS Grid-konteiner med masonry layout, som vist i Firefox 85 med eksperimentell funksjonalitet aktivert.

Den øverste raden vises likt i de to eksemplene, men fra og med den andre raden med barneelementer går nettleseren i det nederste eksempelet i gang med å tette de vertikale tomrommene. Dette gjør den blant annet å flytte rundt på barneelementene slik at kolonnene i stor grad fylles opp likt.

Kan aktiveres i Firefox

I virkeligheten er det nøyaktig den samme CSS-koden som er brukt i de to eksemplene. Men det øverste er vist i Chrome, som så langt ikke støtter masonry layout, mens det nederste er vist i Firefox, hvor støtten for masonry layout kan aktiveres ved å sette flagget:

layout.css.grid-template-masonry-value.enabled til verdien true.

CSS-koden til eksemplene over, er:

. grid {

display: grid;

gap: 10px;

grid-template-columns: repeat (auto-fill, minmax (120px, 1fr));

grid-template-rows: masonry;

}

HTML-koden er:

<div class="grid">

<div class="item" style="block-size: 2em;"></div>

<div class="item" style="block-size: 3em;"></div>

<div class="item" style="block-size: 1.6em;"></div>

<div class="item" style="block-size: 4em;"></div>

<div class="item" style="block-size: 2.2em;"></div>

<div class="item" style="block-size: 3em;"></div>

<div class="item" style="block-size: 4.5em;"></div>

<div class="item" style="block-size: 1em;"></div>

<div class="item" style="block-size: 3.5em;"></div>

<div class="item" style="block-size: 2.8em;"></div>

</div>

Kildekoden har vi lånt fra denne artikkelen hos Mozilla. Der er det også mulig å se hvordan koden gjengis i praksis av ulike nettlesere.

I eksemplene over har barneelementene fast bredde og ulike høyde. Det er også mulig å gjøre det motsatt, slik at man får faste rader istedenfor faste kolonner.

«Pakkefunksjonen» kan skrus av

Noen ganger kan det være ønskelig at barneelementene vises i den rekkefølgen de er oppgitt i HTML-koden, framfor å prioritere mest mulig jevn høyde på radene. Dette kan oppnås ved å sette inn følgende linje i CSS-koden over:

masonry-auto-flow: next;

Da blir det hele seende slik ut:

En CSS Grid-konteiner med Masonry Layout med «masonry-auto-flow» gitt verdien «next». Illustrasjon: Mozilla
En CSS Grid-konteiner med Masonry Layout med «masonry-auto-flow» gitt verdien «next».

Standardverdien til masonry-auto-flow er for øvrig pack.

Det er uvisst hvor raskt de ulike nettleser vil få støtte for masonry layout. Så langt tyder alt på at det kun er Firefox som har fått på plass en viss støtte for dette.

Uansett dreier det seg om et utkast til en spesifikasjon. Veien er lang før spesifikasjonen eventuelt blir en offisiell standard. Men det er mer regelen enn unntaket at nettlesere støtter nye webteknologier før de har rukket å bli webstandarder.

Powered by Labrador CMS