CRAFTING UI
Frontend Design
General patterns
Blive bedre til CSS
Forstå, hvordan Nesting hjælper med organisering
Blive bedre til at bruge
Øvelser, øvelser og flere øvelser for at opbygge praktisk erfaring
Forstå bedre
Forstå, hvordan man opbygger robuste layouts med
Forstå, hvordan hjælper med organisering
Ø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
.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?
.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()
clamp()
.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