Norsk

Mestre CSS container queries for ekte responsivt webdesign. Lær å tilpasse layouter basert på containerstørrelse, ikke bare viewport, for en sømløs brukeropplevelse på alle enheter.

Lås opp responsivt design: En omfattende guide til CSS Container Queries

I årevis har responsivt webdesign hovedsakelig stolt på media queries, som lar nettsider tilpasse layout og stil basert på viewportens bredde og høyde. Selv om dette er effektivt, kan tilnærmingen noen ganger føles begrensende, spesielt når man jobber med komplekse komponenter som må tilpasse seg uavhengig av den totale skjermstørrelsen. Her kommer CSS Container Queries inn – et kraftig nytt verktøy som lar elementer respondere på størrelsen til sitt inneholdende element, i stedet for selve viewporten. Dette åpner for et nytt nivå av fleksibilitet og presisjon i responsivt design.

Hva er CSS Container Queries?

CSS Container Queries er en CSS-funksjon som lar deg bruke stiler på et element basert på størrelsen eller andre egenskaper ved dets foreldre-container. I motsetning til media queries, som retter seg mot viewporten, retter container queries seg mot et spesifikt element. Dette gjør det mulig å lage komponenter som tilpasser stilen sin basert på den tilgjengelige plassen i containeren, uavhengig av skjermstørrelsen.

Se for deg en kortkomponent som vises forskjellig avhengig av om den er plassert i en smal sidekolonne eller et bredt hovedinnholdsområde. Med media queries måtte du kanskje justert kortets stil basert på skjermstørrelsen, noe som kunne ført til inkonsistens. Med container queries kan du definere stiler som gjelder spesifikt når kortets container når en viss bredde, noe som sikrer en konsekvent og responsiv opplevelse på tvers av ulike layouter.

Hvorfor bruke Container Queries?

Container queries tilbyr flere fordeler fremfor tradisjonelle media queries:

Hvordan implementere CSS Container Queries

Implementering av CSS container queries innebærer to hovedtrinn: å definere containeren og å skrive spørringene.

1. Definere containeren

Først må du utpeke et element som en *container*. Dette gjøres ved hjelp av container-type-egenskapen. Det er to hovedverdier for container-type:

Du kan også bruke container-name for å gi containeren din et navn, noe som kan være nyttig for å målrette mot spesifikke containere i spørringene dine. For eksempel:

.card-container {
  container-type: inline-size;
  container-name: cardContainer;
}

Denne koden erklærer elementet med klassen .card-container som en container. Vi spesifiserer inline-size for å tillate spørringer basert på containerens bredde. Vi har også gitt den navnet cardContainer.

2. Skrive container-spørringene

Når du har definert containeren, kan du skrive container queries ved hjelp av @container at-regelen. Syntaksen ligner på media queries:

@container cardContainer (min-width: 400px) {
  .card {
    flex-direction: row;
  }
  .card-image {
    width: 40%;
  }
  .card-content {
    width: 60%;
  }
}

Denne spørringen bruker stilene innenfor krøllparentesene bare når containeren med navnet cardContainer har en minimumsbredde på 400px. Den retter seg mot .card-elementet (antagelig et barn av .card-container) og justerer layouten. Hvis containeren er smalere enn 400px, vil disse stilene ikke bli brukt.

Kortform: Du kan også bruke kortversjonen av `@container`-regelen når du ikke trenger å spesifisere et containernavn:

@container (min-width: 400px) {
  /* Stiler som skal brukes når containeren er minst 400px bred */
}

Praktiske eksempler på Container Queries

La oss se på noen praktiske eksempler på hvordan du kan bruke container queries til å lage mer responsive og tilpasningsdyktige layouter.

Eksempel 1: Kortkomponent

Dette eksempelet viser hvordan man kan tilpasse en kortkomponent basert på containerens bredde. Kortet vil vise innholdet i en enkelt kolonne når containeren er smal, og i to kolonner når containeren er bredere.

HTML:

Kortbilde

Korttittel

Dette er litt eksempelinnhold for kortet.

Les mer

CSS:

.card-container {
  container-type: inline-size;
  border: 1px solid #ccc;
  margin-bottom: 20px;
}

.card {
  display: flex;
  flex-direction: column;
}

.card-image {
  width: 100%;
  height: auto;
}

.card-content {
  padding: 10px;
}

@container (min-width: 500px) {
  .card {
    flex-direction: row;
  }
  .card-image {
    width: 40%;
  }
  .card-content {
    width: 60%;
  }
}

I dette eksempelet er .card-container erklært som containeren. Når containerens bredde er mindre enn 500px, vil .card bruke en kolonne-layout, som stabler bildet og innholdet vertikalt. Når containerens bredde er 500px eller mer, vil .card bytte til en rad-layout, som viser bildet og innholdet side om side.

Eksempel 2: Navigasjonsmeny

Dette eksempelet demonstrerer hvordan man kan tilpasse en navigasjonsmeny basert på den tilgjengelige plassen. Når containeren er smal, vil menyelementene vises i en nedtrekksmeny. Når containeren er bredere, vil menyelementene vises horisontalt.

HTML:


CSS:

.nav-container {
  container-type: inline-size;
  background-color: #f0f0f0;
  padding: 10px;
}

.nav-container ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

.nav-container li {
  margin-bottom: 5px;
}

.nav-container a {
  display: block;
  padding: 5px 10px;
  text-decoration: none;
  color: #333;
}

@container (min-width: 600px) {
  .nav-container ul {
    display: flex;
  }

  .nav-container li {
    margin-right: 10px;
    margin-bottom: 0;
  }

  .nav-container a {
    display: inline-block;
  }
}

I dette eksempelet er .nav-container erklært som containeren. Når containerens bredde er mindre enn 600px, vil menyelementene vises som en vertikal liste. Når containerens bredde er 600px eller mer, vil menyelementene vises horisontalt ved hjelp av flexbox.

Eksempel 3: Produktoppføring

En produktoppføring i en nettbutikk kan tilpasse sin layout basert på containerens bredde. I mindre containere kan en enkel liste med produktbilde, tittel og pris fungere bra. Etter hvert som containeren vokser, kan tilleggsinformasjon som en kort beskrivelse eller kundevurdering legges til for å forbedre presentasjonen. Dette gir også en mer finkornet kontroll enn å kun målrette mot viewporten.

HTML:

Produkt 1

Produktnavn 1

199,-

Produkt 2

Produktnavn 2

249,-

CSS:

.product-listing-container {
  container-type: inline-size;
  display: flex;
  flex-wrap: wrap;
}

.product-item {
  width: 100%;
  margin-bottom: 20px;
  border: 1px solid #eee;
  padding: 10px;
}

.product-item img {
  width: 100%;
  height: auto;
  margin-bottom: 10px;
}

.product-item h3 {
  margin-top: 0;
  font-size: 1.2em;
}

.product-item .price {
  font-weight: bold;
  color: #007bff;
}

@container (min-width: 400px) {
  .product-item {
    width: 50%;
    padding: 15px;
  }
}

@container (min-width: 768px) {
  .product-item {
    width: 33.33%;
  }
}

Denne CSS-koden etablerer først `product-listing-container` som en container. For smale containere (mindre enn 400px), tar hvert produktelement 100% av bredden. Når containeren blir bredere enn 400px, blir produktelementene arrangert i to kolonner. Over 768px blir produktelementene vist i tre kolonner.

Nettleserstøtte og Polyfills

Container queries har god nettleserstøtte i moderne nettlesere, inkludert Chrome, Firefox, Safari og Edge. Eldre nettlesere støtter dem imidlertid kanskje ikke.

For å støtte eldre nettlesere kan du bruke en polyfill. Et populært alternativ er container-query-polyfill, som finnes på npm og GitHub. Polyfills fyller gapet for funksjoner som ikke støttes, slik at du kan bruke container queries selv i eldre nettlesere.

Beste praksis for bruk av Container Queries

Her er noen beste praksiser å huske på når du bruker container queries:

Vanlige fallgruver og hvordan du unngår dem

Container Queries vs. Media Queries: Velge riktig verktøy

Selv om container queries tilbyr betydelige fordeler, har media queries fortsatt sin plass i responsivt design. Her er en sammenligning for å hjelpe deg med å bestemme hvilket verktøy som er best for ulike situasjoner:

Funksjon Container Queries Media Queries
Mål Containerstørrelse Viewport-størrelse
Responsivitet Komponentbasert Sidebasert
Fleksibilitet Høy Middels
Kodeduplisering Lavere Høyere
Bruksområder Gjenbrukbare komponenter, komplekse layouter Globale layoutjusteringer, grunnleggende responsivitet

Generelt sett, bruk container queries når du trenger å tilpasse stilen til en komponent basert på containerens størrelse, og bruk media queries når du trenger å gjøre globale layoutjusteringer basert på viewport-størrelsen. Ofte er en kombinasjon av begge teknikkene den beste tilnærmingen.

Fremtiden for responsivt design med Container Queries

Container queries representerer et betydelig skritt fremover i responsivt design, og tilbyr større fleksibilitet og kontroll over hvordan elementer tilpasser seg ulike kontekster. Etter hvert som nettleserstøtten fortsetter å forbedres, vil container queries sannsynligvis bli et stadig viktigere verktøy for webutviklere. De gir designere og utviklere mulighet til å lage virkelig adaptive og brukervennlige nettsteder som gir en sømløs opplevelse på tvers av alle enheter og skjermstørrelser.

Konklusjon

CSS Container Queries er et kraftig tillegg til verktøykassen for responsivt design. Ved å la elementer respondere på størrelsen til sitt inneholdende element, muliggjør de ekte komponentbasert responsivitet og åpner for nye nivåer av fleksibilitet og presisjon i webdesign. Ved å forstå hvordan man implementerer og bruker container queries effektivt, kan du lage mer tilpasningsdyktige, vedlikeholdbare og brukervennlige nettsteder som gir en bedre opplevelse for alle.

Ressurser