Layout: Responsive components
Crafting UI
Agenda
Subgrid
Container Queries
Øvelser
Subgrid
Container Queries
Øvelser
Agenda
Målet for i dag
-
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
Subgrid
Øvelser
Container Queries
Agenda
Målet for i dag
-
Forstå, hvordan Subgrid hjælper med komplekse layouts
Anvende Container Queries for at lave responsive komponenter
Øvelser, øvelser og flere øvelser for at opbygge praktisk erfaring
Subgrid
Mål: Forstå, hvordan det hjælper med komplekse layouts
Grid
.grid {
align-items: last baseline;
grid-template-columns: subgrid;
}
Nye funktionaliteter
Baseline alignment

Subgrid
Loading...
Full-bleed grid
.container {
display: grid;
grid-template-columns:
1fr minmax(0, 1200px) 1fr;
column-gap: 1rem;
> * {
grid-column: 2;
}
.full-bleed {
grid-column: 1 / -1;
}
}
Børnebørn følger ikke bredden
Full-bleed grid
.container {
display: grid;
grid-template-columns:
[full-bleed-start] 1fr [main] minmax(0, 1200px) 1fr [full-bleed-end];
column-gap: 1rem;
> * {
grid-column: main;
}
.full-bleed {
grid-column: full-bleed;
}
}
Navngiv grid-linjerne

Common pattern
Subgrid

.subgrid {
display: grid;
grid-template-rows:
[system-status] 3.5rem
[primary-nav] 3rem
[primary-header] 4rem
[main] auto
[footer] 4rem
[system-gestures] 2rem;
grid-template-columns:
[fullbleed-start] 1rem
[main-start] auto
[main-end] 1rem
[fullbleed-end];
}
Subgrid

nav {
grid-area: primary-nav / fullbleed;
display: grid;
grid-template-columns: subgrid;
}
nav > .content {
grid-area: main;
}
Subgrid

Subgrid-øvelse

.cards {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 1rem;
}
🤷♂️
Subgrid-øvelse

💩
Øvelse
Subgrid-øvelse

Ressourcer
Subgrid
øvelse
Subgrid
Lav øvelsen, der ligger på git-branch'en "subgrid-caption" på GitHub





Subgrid
Container Queries
Øvelser
Agenda
Målet for i dag
-
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
Container Queries
Mål: Lave responsive componenter
@media
Container Queries
Mål: Lave responsive componenter
@container
Container Queries
Mål: Lave responsive componenter
Container Queries
Container queries kan ikke lade sig gøre
?
Container Queries

?
Container Queries
Hvis containerens bredde er > 400px, så sæt containerens bredde til 300px
🤷♂️
Hvis containerens bredde er 300px, så sæt containerens bredde til 600px
Container Queries
Løsningen? Containment
I praksis betyder det: en ekstra <div>
Container Queries
Løsningen? Containment
I praksis betyder det: en ekstra <div>
Container Queries

"På små skærme"
"På store skærme"
Card component

"Når der er lidt plads"
"Når der er meget plads"
Card component
Container queries
vs media queries
@media (width > 900px) {...}
@container card (width > 400px) {...}

Container queries
vs media queries
Container queries
Container queries
@container (width > 640px) {
.card {
flex-direction: column;
}
}
Container queries
.card-wrapper {
container-type: inline-size;
}
@container (width > 640px) {
.card {
flex-direction: column;
}
}
Den ekstra div
Container queries
Container queries
Container queries
Øvelse

@container (width > 75px) {
span {
background: #ff6663;
}
}
Container queries
@container (width > 75px) {
span {
background: #ff6663;
}
}

Container queries
Nesting
span {
@container (width > 75px) {
background: #ff6663;
}
@container (width > 100px) {
background: #feb144;
}
...
}
@media -> @container
Øvelse
-
.card skal have
container-type: inline-size;
-
article skal spørge efter bredden på .card i stedet for viewporten med
@container (width > 400px) og
@container (width > 600px)

:has() + Container queries

:has() + Container queries
Øvelse
> 600px

< 600px
- Kortet med billedet skal først tildeles et grid med to kolonner (2fr 3fr), når .card-wrapper er større end 600px
- @container (width > 600px)
- .card-wrapper skal have containter-typen "inline-size"
- container-type: inline-size; */
:has() + Container queries
Øvelse
> 600px

< 600px
- Kortet med billedet skal tildeles et grid med to kolonner (2fr 3fr), når .card-wrapper er større end 600px
@container (width > 600px)
- .card-wrapper skal have containter-typen "inline-size"
container-type: inline-size;

Container queries
Container queries
.card-wrapper {
container-type: inline-size;
container-name: main;
}
@container main (width > 640px) {
.card {
flex-direction: column;
}
}
Container queries
.card-wrapper {
/* container-type: inline-size;
container-name: main; */
container: main / inline-size;
}
@container main (width > 640px) {
.card {
flex-direction: column;
}
}
Øvelse
> 600px

Container queries

< 400px
main
.card-wrapper
.card-wrapper {
container: card / inline-size;
}
Container query units
.card-wrapper {
container: card / inline-size;
}
.card {
font-size: clamp(1.45rem, 6cqw, 1.75rem);
}
cqw, cqh, cqi, cqb, cqmin, cqmax
6 % af bredden
Container query units
Øvelse
Container query units
h2 {
font-size: clamp(1.25rem, 5cqw, 2.5rem);
}

øvelse
Container Query
Lav øvelsen, der ligger på git-branch'en "bento-grid" på GitHub

øvelse
Container Query
Lav øvelsen, der ligger på git-branch'en "responsive-container" på GitHub

Slides
Crafting UI: Responsive components
By Dannie Vinther
Crafting UI: Responsive components
Crafting UI w/ CSS
- 155