CRAFTING UI
Frontend Design
General patterns
Forstå bedre
Forstå, hvordan man opbygger robuste layouts med
Kan -funktioner hjælpe med layout?
Øvelser for at opbygge praktisk erfaring
Forstå bedre
Forstå, hvordan man opbygger robuste layouts med
Kan -funktioner hjælpe med layout?
Øvelser for at opbygge praktisk erfaring
Mål: Hvornår vælger man hvad?
Hvordan gør jeg det nemmest for mig selv?
Erfaring
Lav en klassisk navigationsmenu.
Øvelse
Lav en enkelt række med både Flexbox og Grid.
Øvelse
repeat(auto-fit,..),
flex-wrap,
auto-margin,
subgrid
Lav en række med kort med både Flexbox og Grid.
Øvelse
Lav et responsivt layout, hvor rækkefølgen på billede og tekst skifter plads.
Øvelse
Flex Pattern
.task {
flex: 1;
}Lad elementerne definere pladsen
.stack {
display: grid;
}
.stack > * {
grid-area: 1 / 1;
}Stack pattern
Stack pattern
Bento layout pattern
Bento layout pattern
titletitlecupcuptaglistlistmanman.bento {
grid-template-areas:
" "
" "
" ";
}Site layout pattern
titletitlecupcuptaglistlistmanman.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
titletitlecupcuptaglistlistmanman.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
Site layout pattern
.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
.element {
width: min-content | max-content | fit-content;
}Intrinsic sizing
.grid {
grid-template-columns:
min-content | max-content | fit-content() | auto;
}Intrinsic sizing
.grid {
grid-template-columns:
min-content | max-content | fit-content() | auto;
}.element {
width: min-content | max-content | fit-content;
}Intrinsic sizing
section {
display: grid;
grid-template-columns:
repeat(auto-fill, minmax(150px, 1fr));
gap: 1rlh;
}Auto-fill/-fit
Auto-fill/-fit
Lav øvelsen, der ligger på git-branch'en "citd-1" på GitHub
Øvelse
Øvelse
Kan du løse den?
Code-golfing-challenge
Kan du løse den?
Øvelse
Robuste layouts
.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
* works as documented but is counter-intuitive
Kan du løse denne?
Hvad med 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
Øvelse
calc()
Kan math-funktioner hjælpe med layout?
min()
max()
mm.
.card {
padding: 1rem;
border-radius: 2.75rem;
.inner {
border-radius: calc(2.75rem - 1rem);
}
}Brug den mindste værdi
Brug den mindste værdi
Browseren omregner altid til px
.container {
width: min(100%, 200px);
/*
width: 100%;
max-width: 200px;
*/
}.container {
width: min(100% - 2rem, 200px);
/*
width: calc(100% - 2rem);
max-width: 200px;
*/
}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
.grid {
display: grid;
grid-template-columns:
repeat(auto-fill, minmax(275px, 1fr));
}pattern
pattern
275px
275px
275px
pattern
275px
275px
275px
Overflow
pattern
100%
100%
100%
.grid {
display: grid;
grid-template-columns:
repeat(auto-fill, minmax(min(275px, 100%), 1fr));
}Kan du regne det ud?
pattern
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
main {
display: grid;
grid-template-columns:
1fr minmax(0, 1200px) 1fr;
...
}
.scroller {
padding-inline:
max(1rem, 50% - 1200px / 2);
}pattern
: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
pattern
Få bannerets tekst til flugte med de øvrige sektioners tekst ved at bruge max().
Øvelse
Lav øvelsen, der ligger på git-branch'en "scrolling-container" på GitHub
Øvelse