Hopp til innhold

Grid

Bruk av grid

Vi bruker et grid til å styre layouten på sidene våre. På små skjermer er gridet på 4 kolonner, på mellomstore skjermer 6 kolonner og på store skjermer 12 kolonner.

Du kan la kolonner være bredere på små skjermer og smalere på mindre skjermer:

En rad kan ha mange forskjellige bakgrunnsfarger:

En kolonne kan også ha bakgrunnsfarger. De vil da være utfallende, slik at selve innholdet vil forholde seg til griden.

Grid

Gridet består av tre komponenter - <Grid />, <GridRow /> og <GridCol /> - grid, rad og kolonne.

Det kan være mange grids per side, men man kan ikke ha grids inni andre grids. Grid-komponenten brukes til å lage layout på side-nivå.

Det finnes en rekke modifiers på alle tre komponentene som lar deg manipulere hvor innholdet skal plassere seg i en kolonne. Ta en titt på prop-types for å finne disse.

Merk at designet for layout skal være basert på 4 kolonner på sm skjermer, 6 på md og 12 på lg mens i APIet til GridCol sendes det inn tall fra 0-12 for alle størrelsene. I praksis betyr det at man selv må konvertere fra 12 kolonner til riktig antall på sm og md. For sm innebærer det at hver kolonne har bredde 3, slik at man må bruke multiplum av 3 for alle verdier som sendes inn til cols eller offset propertyene. For md har hver kolonne bredde 2 og man må bruke multiplum av 2.

Riktig, oppgitte verdier er multiplum av 3 for sm og 2 for md:

<Grid>
    <GridRow>
        <GridCol sm={{ cols: 6, offset: 3 }} md={{ cols: 4, offset: 4 }} />
    </GridRow>
</Grid>

Galt:

<Grid>
    <GridRow>
        <GridCol sm={{ cols: 2, offset: 3 }} md={{ cols: 5, offset: 4 }} />
    </GridRow>
</Grid>

Det blir varslet om dette til console.error i dev-versjonen av FFE, men det er ingen varsler om man bygger prod-versjonen av koden. Selvom det fungerer å bruke andre verdier er det ikke meningen at man skal gjøre, og side-layout skal heller ikke være basert på at man må gjøre det annerledes.

Spacing

Det er i utgangspunktet ingen luft over eller under gridet. Mellom kolonnene (og til høyre og venstre for griden) er det imidlertid et mellomrom på 16px. Disse verdiene kan overstyres med modifiere.

Margin og padding

Margin og padding kan legges til i topp og bunn av en <GridRow> med modifierne margin og padding. Tillatte verdier samsvarer med felles variabler for spacing i ffe. Eksempel med 64px margin og 8px padding:

<Grid>
    <GridRow margin="3xl" padding="sm">
        <GridCol />
    </GridRow>
</Grid>

Sentrering

Innholdet i kolonner kan sentreres i begge akser ved hjelp av center-propen, eller man kan sentrere tekst med centerText.

<Grid>
    <GridRow>
        <GridCol centerText={true} center={true}>
            Sentrert kolonne
        </GridCol>
    </GridRow>
</Grid>

Gap

Mellomrommet mellom kolonnene internt i et grid er 16px som default. Tilsvarende luft finnes til høyre og venstre for gridet. Dette kan overstyres ved hjelp av gap-modifieren på <Grid>. Tillatte verdier samsvarer med felles variabler for spacing i ffe, men kan ikke være større enn 32px (lg). I tillegg kan spacingen fjernes helt med verdien none.

<Grid gap="none">
    <GridRow>
        <GridCol />
    </GridRow>
</Grid>

Responsiv spacing

Spacing kan også defineres responsivt ved hjelp av størrelsesmodifierne sm, md og lg. Dette gjør det mulig å ha ulik spacing på ulike skjermstørrelser. Props som kan endres på denne måten er gap<Grid>-elementet, samt margin og padding<GridRow>. Tillatte verdier er tilsvarende som for de ikke-responsive variantene av gap, margin og padding.

Et eksempel på responsiv spacing på et grid med progressiv økning av gap og margin/padding kan se slik ut:

<Grid sm={{ gap: 'sm' }} md={{ gap: 'md' }} lg={{ gap: 'lg' }}>
    <GridRow sm={{ margin: 'sm', padding: 'sm' }} md={{ margin: 'md', padding: 'md' }} lg={{ margin: 'lg', padding: 'lg' }}>
        <GridCol>
            ...
        </GridCol>
    </GridRow>
</Grid>

De responsive og ikke-responsive spacing-verdiene kan også kombineres. Responsive verdier overstyrer de ikke-responsive, som betyr at de ikke-responsive verdiene i praksis er default.

<GridRow margin="xs" sm={{ margin: 'sm' }} md={{ margin: 'md' }} lg={{ margin: 'lg' }} />

Offset

Kolonner kan gis innrykk ved hjelp av offset-propertyen. I praksis fungerer dette slik at gridet hopper over X antall kolonner før innholdet vises. Dette betyr blant annet at man kan sentrere grids med innhold som strekker seg over færre enn 12 kolonner.

Propertyen settes på <GridCol> i første kolonne i gridet som skal vises med innrykk. Verdien tilsvarer antall kolonner som skal hoppes over. Den må defineres for hver skjermstørrelse, samtidig som man definerer kolonnens bredde. Større skjermstørrelser arver verdien fra mindre. For eksempel vil offset som defineres i skjermstørrelse sm også gjelde for md og lg:

<Grid>
    <GridRow>
        <GridCol sm={{ cols: 6, offset: 2 }}>innhold</GridCol>
    </GridRow>
</Grid>

For å sentrere gridets innhold må man passe på at totalen av (offset x 2) og cols går opp i 12. For eksempel kan innhold over 8 kolonner løses slik:

<GridCol sm={{ cols: 8, offset: 2 }}>innhold</GridCol>

De to siste kolonnene i gridets totale bredde på 12 vil da være tomme, og på den måten skape lik spacing på begge sider.

|----|----|----|----|----|----|----|----|----|----|----|----|
|    |    |xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|xxxx|    |    |
|----|----|----|----|----|----|----|----|----|----|----|----|