Svenska

Bemästra CSS container queries för äkta responsiv webbdesign. Lär dig anpassa layouter baserat på container-storlek, inte bara visningsområdet, för en sömlös användarupplevelse på alla enheter.

Bemästra responsiv design: En komplett guide till CSS Container Queries

I flera år har responsiv webbdesign främst förlitat sig på media queries, vilket gör att webbplatser kan anpassa sin layout och stil baserat på visningsområdets bredd och höjd. Även om detta är effektivt kan tillvägagångssättet ibland kännas begränsande, särskilt när man hanterar komplexa komponenter som behöver anpassas oberoende av den övergripande skärmstorleken. Här kommer CSS Container Queries – ett kraftfullt nytt verktyg som låter element reagera på storleken på sitt innehållande element, snarare än på själva visningsområdet. Detta öppnar upp för en ny nivå av flexibilitet och precision i responsiv design.

Vad är CSS Container Queries?

CSS Container Queries är en CSS-funktion som låter dig tillämpa stilar på ett element baserat på storleken eller andra egenskaper hos dess överordnade container. Till skillnad från media queries, som riktar sig mot visningsområdet, riktar sig container queries mot ett specifikt element. Detta gör det möjligt att skapa komponenter som anpassar sin stil baserat på det tillgängliga utrymmet i sin container, oavsett skärmstorlek.

Föreställ dig en kortkomponent som visas olika beroende på om den placeras i en smal sidofält eller ett brett huvudinnehållsområde. Med media queries skulle du kanske behöva justera kortets stil baserat på skärmstorleken, vilket kan leda till inkonsekvenser. Med container queries kan du definiera stilar som tillämpas specifikt när kortets container når en viss bredd, vilket säkerställer en konsekvent och responsiv upplevelse i olika layouter.

Varför använda Container Queries?

Container queries erbjuder flera fördelar jämfört med traditionella media queries:

Hur man implementerar CSS Container Queries

Implementering av CSS container queries innefattar två huvudsteg: att definiera containern och att skriva förfrågningarna.

1. Definiera containern

Först måste du utse ett element som en *container*. Detta görs med egenskapen container-type. Det finns två huvudsakliga värden för container-type:

Du kan också använda container-name för att ge din container ett namn, vilket kan vara till hjälp för att rikta in sig på specifika containrar i dina förfrågningar. Till exempel:

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

Denna kod deklarerar elementet med klassen .card-container som en container. Vi specificerar inline-size för att tillåta förfrågningar baserade på containerns bredd. Vi har också gett den namnet cardContainer.

2. Skriva Container Queries

När du har definierat containern kan du skriva container queries med @container at-regeln. Syntaxen liknar media queries:

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

Denna förfrågan tillämpar stilarna inom klammerparenteserna endast när containern med namnet cardContainer har en minsta bredd på 400px. Den riktar sig mot .card-elementet (förmodligen ett barn till .card-container) och justerar dess layout. Om containern är smalare än 400px kommer dessa stilar inte att tillämpas.

Kortform: Du kan också använda kortformen av @container-regeln när du inte behöver specificera ett container-namn:

@container (min-width: 400px) {
  /* Stilar att tillämpa när containern är minst 400px bred */
}

Praktiska exempel på Container Queries

Låt oss titta på några praktiska exempel på hur du kan använda container queries för att skapa mer responsiva och anpassningsbara layouter.

Exempel 1: Kortkomponent

Detta exempel visar hur man anpassar en kortkomponent baserat på dess containers bredd. Kortet kommer att visa sitt innehåll i en enda kolumn när containern är smal och i två kolumner när containern är bredare.

HTML:

Card Image

Card Title

This is some sample content for the card.

Learn More

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 detta exempel deklareras .card-container som container. När containerns bredd är mindre än 500px kommer .card att använda en kolumnlayout, där bilden och innehållet staplas vertikalt. När containerns bredd är 500px eller mer, kommer .card att byta till en radlayout och visa bilden och innehållet sida vid sida.

Exempel 2: Navigationsmeny

Detta exempel visar hur man anpassar en navigationsmeny baserat på det tillgängliga utrymmet. När containern är smal visas menyalternativen i en rullgardinsmeny. När containern är bredare visas menyalternativen horisontellt.

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 detta exempel deklareras .nav-container som container. När containerns bredd är mindre än 600px visas menyalternativen som en vertikal lista. När containerns bredd är 600px eller mer visas menyalternativen horisontellt med hjälp av flexbox.

Exempel 3: Produktlistning

En produktlistning för e-handel kan anpassa sin layout baserat på containerns bredd. I mindre containrar kan en enkel lista med produktbild, titel och pris fungera bra. När containern växer kan ytterligare information som en kort beskrivning eller kundbetyg läggas till för att förbättra presentationen. Detta möjliggör också en mer detaljerad kontroll än att enbart rikta sig mot visningsområdet.

HTML:

Product 1

Product Name 1

$19.99

Product 2

Product Name 2

$24.99

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%;
  }
}

Denna CSS-kod etablerar först `product-listing-container` som en container. För smala containrar (mindre än 400px) tar varje produktobjekt upp 100% av bredden. När containern växer bortom 400px arrangeras produktobjekten i två kolumner. Bortom 768px visas produktobjekten i tre kolumner.

Webbläsarstöd och Polyfills

Container queries har bra webbläsarstöd i moderna webbläsare, inklusive Chrome, Firefox, Safari och Edge. Äldre webbläsare kanske dock inte stöder dem inbyggt.

För att stödja äldre webbläsare kan du använda en polyfill. Ett populärt alternativ är container-query-polyfill, som finns på npm och GitHub. Polyfills fyller i luckan för funktioner som inte stöds, vilket gör att du kan använda container queries även i äldre webbläsare.

Bästa praxis för att använda Container Queries

Här är några bästa praxis att tänka på när du använder container queries:

Vanliga fallgropar och hur man undviker dem

Container Queries vs. Media Queries: Att välja rätt verktyg

Även om container queries erbjuder betydande fördelar, har media queries fortfarande sin plats i responsiv design. Här är en jämförelse för att hjälpa dig att avgöra vilket verktyg som är bäst för olika situationer:

Funktion Container Queries Media Queries
Mål Container-storlek Visningsområdets storlek
Responsivitet Komponentbaserad Sidbaserad
Flexibilitet Hög Medel
Kodduplicering Lägre Högre
Användningsfall Återanvändbara komponenter, komplexa layouter Globala layoutjusteringar, grundläggande responsivitet

I allmänhet, använd container queries när du behöver anpassa stilen på en komponent baserat på dess containers storlek, och använd media queries när du behöver göra globala layoutjusteringar baserat på visningsområdets storlek. Ofta är en kombination av båda teknikerna det bästa tillvägagångssättet.

Framtiden för responsiv design med Container Queries

Container queries representerar ett betydande steg framåt inom responsiv design och erbjuder större flexibilitet och kontroll över hur element anpassar sig till olika sammanhang. I takt med att webbläsarstödet fortsätter att förbättras kommer container queries sannolikt att bli ett allt viktigare verktyg för webbutvecklare. De ger designers och utvecklare möjlighet att skapa verkligt anpassningsbara och användarvänliga webbplatser som ger en sömlös upplevelse på alla enheter och skärmstorlekar.

Slutsats

CSS Container Queries är ett kraftfullt tillägg till verktygslådan för responsiv design. Genom att låta element reagera på storleken på sitt innehållande element möjliggör de äkta komponentbaserad responsivitet och öppnar upp för nya nivåer av flexibilitet och precision i webbdesign. Genom att förstå hur man implementerar och använder container queries effektivt kan du skapa mer anpassningsbara, underhållsvänliga och användarvänliga webbplatser som ger en bättre upplevelse för alla.

Resurser

Bemästra responsiv design: En komplett guide till CSS Container Queries | MLOG