CRAFTING UI

Frontend Design

Layout (del 1)

General patterns

Agenda

The Cascade

Selectors

Nesting

Grid vs. Flex

Defensive CSS

Agenda

  1. Blive bedre til CSS

  2. Forstå, hvordan Nesting hjælper med organisering

  3. Blive bedre til at bruge 

  4. Øvelser, øvelser og flere øvelser for at opbygge praktisk erfaring

Nesting

Defensive CSS

Nesting

  1. Forstå                           bedre

  2. Forstå, hvordan man opbygger robuste layouts med

  3. Forstå, hvordan                  hjælper med organisering

  4. Øvelser for at opbygge praktisk erfaring

Grid vs. Flex

Agenda

Agenda

Grid vs. Flex

Mål: Hvornår vælger man hvad?

Måske er det ikke det rigtige spørgsmål?

Hvordan gør jeg det nemmest for mig selv?

Erfaring

Flexbox

Grid

Flexbox

Grid

Normalt flow

Lav en klassisk navigationsmenu.

Flex eller Grid

Øvelse

Lav en enkelt række med både Flexbox og Grid.

Flex eller Grid

Øvelse

repeat(auto-fit,..),

flex-wrap,

auto-margin,

subgrid

Lav en række med kort med både Flexbox og Grid.

Flex eller Grid

Øvelse

Lav et responsivt layout, hvor rækkefølgen på billede og tekst skifter plads.

Flex eller Grid

Øvelse

Generelle mønstre

Flex Pattern

.task {
  flex: 1;
}

Lad elementerne definere pladsen

.stack {
  display: grid;
}

.stack > * {
  grid-area: 1 / 1;
}

Stack pattern

Generelle mønstre

Stack pattern

Generelle mønstre

Bento layout pattern

Generelle mønstre

Bento layout pattern

Generelle mønstre

title
title
cup
cup
tag
list
list
man
man
.bento {
  grid-template-areas:
    "               "
    "               "
    "               ";
}

Site layout pattern

Generelle mønstre

title
title
cup
cup
tag
list
list
man
man
.bento {
  grid-template-areas:
    "title title cup"
    "man   list  cup"
    "man   list  tag";
  
  @media (width < 650px) {
    grid-template-areas:
    "title title"
    "cup   man"
    "list  tag";
  }
}

Site layout pattern

Generelle mønstre

title
title
cup
cup
tag
list
list
man
man
.container {
  display: grid;
  grid-template-columns: 1fr minmax(0, 1200px) 1fr;
  column-gap: 1rem;
  
  > * {
    grid-column: 2;
  }
  
  .full-bleed {
    grid-column: 1 / -1;
  }
}

Site layout pattern

Generelle mønstre

Site layout pattern

Generelle mønstre

.container {
  display: grid;
  grid-template-columns: 1fr minmax(0, 1200px) 1fr;
  column-gap: 1rem;
  
  > * {
    grid-column: 2;
  }
  
  .full-bleed {
    grid-column: 1 / -1;
  }
}
.container {
  display: grid;
  grid-template-columns:
    [full-start] 1fr [content] minmax(0, 1200px) 1fr [full-end];
  column-gap: 1rem;
  
  > * {
    grid-column: content;
  }
  
  .full-bleed {
    grid-column: full;
  }
}

Site layout pattern

Generelle mønstre

.element {
  width: min-content | max-content | fit-content;
}

Intrinsic sizing

Generelle mønstre

.grid {
  grid-template-columns:
    min-content | max-content | fit-content() | auto;
}

Intrinsic sizing

Generelle mønstre

.grid {
  grid-template-columns:
    min-content | max-content | fit-content() | auto;
}
.element {
  width: min-content | max-content | fit-content;
}

Intrinsic sizing

Generelle mønstre

section {
  display: grid;
  grid-template-columns:
    repeat(auto-fill, minmax(150px, 1fr));
  gap: 1rlh;
}

Auto-fill/-fit

Generelle mønstre

Auto-fill/-fit

Generelle mønstre

Lav øvelsen, der ligger på git-branch'en "citd-1" på GitHub

Code in the dark:
Roles Section

Øvelse

Code in the dark:
Roles Section

Øvelse

Kan du løse den?

Code-golfing-challenge

Kan du løse den?

Code in the Dark: Profile Card

Øvelse

.container {
  display: grid;
  grid-template-rows: 1fr 1fr 1fr 1fr;
  gap: 20px;
}
.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr;
  gap: 20px;
}

.container

.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr;
  gap: 20px;
}

.container

.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr;
  gap: 20px;
}

.container

The Gotchas* of Layout

* works as documented but is counter-intuitive

😭

Layout er svært

Kan du løse denne?

.container {
  display: grid;
  grid-template-columns:
    [full-start] 1fr [content] minmax(0, 1200px) 1fr [full-end];
  column-gap: 1rem;
  
  > * {
    grid-column: content;
  }
  
  .full-bleed {
    grid-column: full;
  }
}

Lav øvelsen, der ligger på git-branch'en "breakout" på GitHub

Breakout Grid

Øvelse

calc()

Math og layout

Kan math-funktioner hjælpe med layout?

min()

max()

clamp()

calc(

)

100px * 2

calc(

)

100px * 2

calc(

)

100% - 1rem

.card {
  padding: 1rem;
  border-radius: 2.75rem;
  
  .inner {
    border-radius: calc(2.75rem - 1rem);
  }
}

min(

)

100px, 200px

min(

)

Brug den mindste værdi

100px, 200px

🤷‍♂️

min(

)

100px, 200px

🤔

100%, 200px

Brug den mindste værdi

Browseren omregner altid til px

.container {
  width: min(100%, 200px);
  
  /*
   width: 100%;
   max-width: 200px;
  */
}

min()

.container {
  width: min(100% - 2rem, 200px);
  
  /*
   width: calc(100% - 2rem);
   max-width: 200px;
  */
}

min()

65ch

3rem

.container {
  max-width: 65ch;
  margin-inline: 1rem;
  padding: .5rem;
  
  @media (width > 600px) {
  	padding: 3rem;
  	margin-inline: auto;
  }
}

auto

auto

.container {
  max-width: 65ch;
  margin-inline: 1rem;
  padding: .5rem;
  
  @media (width > 600px) {
  	padding: 3rem;
  	margin-inline: auto;
  }
}

< 100%

.container {  
  padding: min(3rem, 5%);
  width: min(65ch, 100% - 2rem);
  margin-inline: auto;
}

pattern

Kan typisk bruges til padding, margin og gap

min()

min()

.grid {  
  display: grid;
  grid-template-columns:
    repeat(auto-fill, minmax(275px, 1fr));
}

pattern

min()

min()

pattern

275px

275px

275px

min()

pattern

275px

275px

275px

Overflow

min()

pattern

100%

100%

100%

.grid {  
  display: grid;
  grid-template-columns:
    repeat(auto-fill, minmax(min(275px, 100%), 1fr));
}

min()

max(

)

100px, 200px

50%, 200px

Kan du regne det ud?

pattern

max()

Fra Tema-opgaven

main {  
  display: grid;
  grid-template-columns:
    1fr minmax(0, 1200px) 1fr;
  
  > * {
    grid-column: 2;
  }
  
  .full {
    grid-column: 1 / -1;
  }
}

1fr

1fr

minmax(0, 1200px)

pattern

max()

main {  
  display: grid;
  grid-template-columns:
    1fr minmax(0, 1200px) 1fr;
  ...
}



.scroller {
  padding-inline:
    max(1rem, 50% - 1200px / 2);
}

pattern

max()

:root {
  --content-width: 75rem;
}

main {
  grid-template-columns:
    1fr minmax(0, var(--content-width)) 1fr;
}

.scroller {
  padding-inline:
    max(1rem, 50% - var(--content-width) / 2);
}

pattern

max()

pattern

max()

Få bannerets tekst til flugte med de øvrige sektioners tekst ved at bruge max().

Fælles indholdskant

Øvelse

Lav øvelsen, der ligger på git-branch'en "scrolling-container" på GitHub

Scrolling Container

Øvelse

Slides

Kursusmateriale

Crafting UI: Layout, del 1

By Dannie Vinther

Crafting UI: Layout, del 1

Crafting UI with css

  • 17