Leer hoe u CSS Container Queries kunt gebruiken om responsieve en adaptieve lay-outs te maken die reageren op de grootte van hun container, niet alleen op de viewport.
CSS Container Queries: Een Uitgebreide Gids voor de Definitie van Container Queries
Responsief webdesign is aanzienlijk geëvolueerd. Aanvankelijk waren media queries de hoeksteen, waardoor lay-outs zich konden aanpassen op basis van de grootte van de viewport. Naarmate websites echter complexer en componentgebaseerder worden, is de behoefte aan een meer granulaire en flexibele aanpak duidelijk geworden. Dit is waar CSS Container Queries een rol spelen.
Wat zijn CSS Container Queries?
Met CSS Container Queries kunnen ontwikkelaars stijlen toepassen op een element op basis van de grootte of staat van het omsluitende element, in plaats van de viewport. Deze fundamentele verschuiving maakt de creatie mogelijk van echt herbruikbare en aanpasbare componenten die naadloos kunnen integreren in verschillende contexten binnen een webpagina.
Stel je een kaartcomponent voor die zijn lay-out moet aanpassen, afhankelijk van of deze in een smalle zijbalk of een breed hoofdinhoudsgebied wordt geplaatst. Met container queries wordt deze aanpassing eenvoudig, wat zorgt voor een optimale presentatie ongeacht de omliggende context.
Waarom Container Queries gebruiken?
- Verbeterde Herbruikbaarheid van Componenten: Componenten worden echt onafhankelijk en aanpasbaar, wat het onderhoud vereenvoudigt en de consistentie bevordert over verschillende delen van een website.
- Meer Granulaire Controle: In tegenstelling tot media queries, die afhankelijk zijn van de viewport, bieden container queries fijnmazige controle over de styling op basis van de specifieke omgeving van een component.
- Vereenvoudigde Ontwikkeling: Verminder de noodzaak voor complexe JavaScript-oplossingen om de styling van componenten te beheren op basis van hun locatie in de lay-out.
- Verbeterde Gebruikerservaring: Lever optimale ervaringen op verschillende apparaten en schermformaten, en zorg ervoor dat de inhoud altijd op de meest geschikte manier wordt gepresenteerd.
Een Container Definiëren
Voordat u container queries kunt gebruiken, moet u definiëren welk element als container zal fungeren. Dit wordt gedaan met de container-type
eigenschap.
container-type
Eigenschap
De container-type
eigenschap specificeert of een element een query-container is, en zo ja, welk type container het is. Het accepteert de volgende waarden:
size
: De query-voorwaarden van de container zijn gebaseerd op de inline-grootte (breedte in horizontale schrijfmodi, hoogte in verticale schrijfmodi) en blok-grootte (hoogte in horizontale schrijfmodi, breedte in verticale schrijfmodi). Dit is de meest gebruikelijke en veelzijdige optie.inline-size
: De query-voorwaarden van de container zijn gebaseerd op de inline-grootte (breedte in horizontale schrijfmodi, hoogte in verticale schrijfmodi).normal
: Het element is geen query-container. Dit is de standaardwaarde.style
: Het element is een stijlcontainer. Stijlcontainers stellen aangepaste eigenschappen die erop zijn gedefinieerd bloot aan onderliggende elementen met behulp van de@container style()
query. Dit is nuttig voor styling op basis van aangepaste eigenschappen.
Voorbeeld:
.container {
container-type: size;
}
Dit codefragment definieert een element met de klasse container
als een query-container, waardoor de grootte beschikbaar wordt voor container queries.
Als alternatief kunt u container: inline-size
of container: size
gebruiken. De container
shorthand-eigenschap kan zowel container-type
als container-name
in één declaratie instellen. De containernaam wordt gebruikt om een specifieke container te targeten bij het nesten van containers.
Container Queries Gebruiken
Zodra u een container heeft gedefinieerd, kunt u de @container
at-rule gebruiken om stijlen toe te passen op basis van de grootte of staat ervan.
@container
At-Rule
De @container
at-rule is vergelijkbaar met de @media
at-rule, maar in plaats van de viewport te targeten, richt het zich op een specifieke container. De syntaxis is als volgt:
@container [container-name] (condition) {
/* Stijlen die worden toegepast als aan de voorwaarde wordt voldaan */
}
container-name
(Optioneel): Als u uw container een naam heeft gegeven met decontainer-name
eigenschap, kunt u deze hier specificeren om die specifieke container te targeten. Indien weggelaten, wordt het toegepast op de dichtstbijzijnde voorouder-container.condition
: De voorwaarde waaraan moet worden voldaan om de stijlen toe te passen. Dit kan gebaseerd zijn op de breedte, hoogte of andere eigenschappen van de container.
Voorbeeld:
.card {
display: flex;
flex-direction: column;
}
@container (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 40%;
}
.card__content {
width: 60%;
}
}
In dit voorbeeld zal het .card
element overschakelen van een kolomlay-out naar een rijlay-out wanneer de container minstens 400px breed is. De .card__image
en .card__content
elementen zullen hun breedtes ook dienovereenkomstig aanpassen.
Container Query Eenheden
Container queries introduceren nieuwe eenheden die relatief zijn aan de afmetingen van de container:
cqw
: 1% van de breedte van de container.cqh
: 1% van de hoogte van de container.cqi
: 1% van de inline-grootte van de container.cqb
: 1% van de blok-grootte van de container.cqmin
: De kleinste vancqi
ofcqb
.cqmax
: De grootste vancqi
ofcqb
.
Deze eenheden stellen u in staat om stijlen te creëren die echt relatief zijn aan de grootte van de container, waardoor uw componenten nog aanpasbaarder worden.
Voorbeeld:
.element {
font-size: 2cqw;
padding: 1cqh;
}
In dit voorbeeld zal de lettergrootte van het .element
2% van de breedte van de container zijn, en de padding zal 1% van de hoogte van de container zijn.
Praktijkvoorbeelden
Laten we enkele praktische voorbeelden bekijken van hoe container queries kunnen worden gebruikt om responsieve en aanpasbare componenten te creëren.
Voorbeeld 1: Kaartcomponent
Beschouw een kaartcomponent dat informatie over een product weergeeft. Dit component moet mogelijk zijn lay-out aanpassen, afhankelijk van waar het op de pagina wordt geplaatst.
HTML:
CSS:
.container {
container-type: inline-size;
width: 100%;
max-width: 800px;
margin: 0 auto;
}
.card {
display: flex;
flex-direction: column;
border: 1px solid #ccc;
padding: 16px;
}
.card__image {
width: 100%;
margin-bottom: 16px;
}
.card__title {
font-size: 1.5rem;
margin-bottom: 8px;
}
@container (min-width: 500px) {
.card {
flex-direction: row;
}
.card__image {
width: 40%;
margin-bottom: 0;
margin-right: 16px;
}
.card__content {
width: 60%;
}
}
In dit voorbeeld is het .container
element gedefinieerd als een inline-size container. Wanneer de container minder dan 500px breed is, zal de kaartcomponent de afbeelding en de inhoud in een kolomlay-out weergeven. Wanneer de container 500px of breder is, zal de kaartcomponent overschakelen naar een rijlay-out, met de afbeelding links en de inhoud rechts. Dit zorgt ervoor dat de kaartcomponent er goed uitziet, ongeacht waar deze op de pagina wordt geplaatst.
Voorbeeld 2: Navigatiemenu
Een ander veelvoorkomend gebruik van container queries is het aanpassen van een navigatiemenu op basis van de beschikbare ruimte.
HTML:
CSS:
.nav-container {
container-type: inline-size;
width: 100%;
background-color: #f0f0f0;
}
.nav {
padding: 16px;
}
.nav__list {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.nav__item {
margin-bottom: 8px;
}
.nav__link {
text-decoration: none;
color: #333;
padding: 8px 16px;
border: 1px solid #ccc;
border-radius: 4px;
}
@container (max-width: 400px) {
.nav__list {
flex-direction: column;
}
.nav__item {
margin-bottom: 16px;
}
.nav__link {
display: block;
width: 100%;
text-align: center;
}
}
In dit voorbeeld is het .nav-container
element gedefinieerd als een inline-size container. Wanneer de container 400px breed of minder is, zal het navigatiemenu overschakelen naar een kolomlay-out, waarbij elke link de volledige breedte van de container inneemt. Wanneer de container breder is dan 400px, zal het navigatiemenu de links in een rij weergeven, met ruimte ertussen. Hierdoor kan het navigatiemenu zich aanpassen aan verschillende schermformaten en oriëntaties.
Geneste Containers
Container queries kunnen worden genest, wat nog complexere en fijnmazigere controle over de styling mogelijk maakt. Om een specifieke container te targeten bij het nesten, kunt u de container-name
eigenschap gebruiken om uw containers unieke namen te geven. Vervolgens kunt u in uw @container
at-rule de naam van de container specificeren die u wilt targeten.
Voorbeeld:
Content
.outer-container {
container-type: inline-size;
container-name: outer;
}
.inner-container {
container-type: inline-size;
container-name: inner;
}
@container outer (min-width: 500px) {
.inner-container {
background-color: lightblue;
}
}
@container inner (min-width: 300px) {
p {
font-size: 1.2rem;
}
}
In dit voorbeeld heeft de .outer-container
de naam "outer" en de .inner-container
de naam "inner". De eerste @container
at-rule richt zich op de "outer" container en past een achtergrondkleur toe op de .inner-container
wanneer de "outer" container minstens 500px breed is. De tweede @container
at-rule richt zich op de "inner" container en verhoogt de lettergrootte van het p
element wanneer de "inner" container minstens 300px breed is.
Browserondersteuning
Container queries genieten van uitstekende en groeiende browserondersteuning. De meeste moderne browsers ondersteunen de container-type
, container-name
en @container
functies volledig. Het is altijd een goed idee om Can I use te controleren voor de laatste compatibiliteitsinformatie.
Voor oudere browsers die geen container queries ondersteunen, kunt u polyfills gebruiken om fallback-ondersteuning te bieden. Het is echter belangrijk op te merken dat polyfills het gedrag van native container queries mogelijk niet perfect repliceren en dat ze de laadtijd van de pagina kunnen verlengen.
Beste Praktijken
Hier zijn enkele beste praktijken om in gedachten te houden bij het werken met container queries:
- Begin met Mobile-First: Ontwerp uw componenten eerst voor de kleinste containergrootte en gebruik vervolgens container queries om de lay-out progressief te verbeteren voor grotere containers.
- Gebruik Betekenisvolle Containernamen: Als u containers nest, gebruik dan beschrijvende namen die duidelijk het doel van elke container aangeven.
- Vermijd Te Complexe Queries: Houd uw container queries eenvoudig en gefocust. Te veel complexe queries kunnen uw code moeilijk te begrijpen en te onderhouden maken.
- Test Grondig: Test uw componenten in verschillende containergroottes en contexten om ervoor te zorgen dat ze correct aanpassen.
- Houd Rekening met Prestaties: Wees u bewust van de prestatie-impact van container queries, vooral bij het gebruik van complexe queries of een groot aantal containers.
Toegankelijkheidsoverwegingen
Hoewel container queries zich voornamelijk richten op visuele lay-outaanpassingen, is het cruciaal om rekening te houden met toegankelijkheid om ervoor te zorgen dat uw componenten voor iedereen bruikbaar blijven.
- Behoud Semantische Structuur: Zorg ervoor dat de onderliggende HTML-structuur semantisch en toegankelijk blijft, ongeacht de grootte van de container.
- Test met Hulptechnologieën: Test uw componenten met schermlezers en andere hulptechnologieën om te verifiëren dat de inhoud nog steeds toegankelijk en begrijpelijk is.
- Bied Alternatieve Inhoud: Als de grootte van de container de inhoud aanzienlijk verandert, overweeg dan alternatieve inhoud of mechanismen te bieden om ervoor te zorgen dat gebruikers met een beperking toegang hebben tot de informatie.
Verder dan Grootte: State Queries
Hoewel op grootte gebaseerde container queries het meest voorkomen, reikt de toekomst van container queries verder dan alleen grootte. Er zijn opkomende specificaties en voorstellen voor style queries en state queries.
Met Style Queries kunt u stijlen toepassen op basis van aangepaste eigenschappen die op de container zijn gedefinieerd. Dit maakt krachtige styling mogelijk op basis van dynamische gegevens en configuratie.
Met State Queries zou u de staat van een container kunnen opvragen, zoals of deze gefocust is, eroverheen wordt bewogen, of een specifieke klasse heeft. Dit zou nog meer mogelijkheden kunnen openen voor adaptieve componenten die reageren op gebruikersinteractie.
Conclusie
CSS Container Queries zijn een krachtig hulpmiddel voor het maken van responsieve en aanpasbare webcomponenten. Door u in staat te stellen elementen te stijlen op basis van de grootte of staat van hun omsluitende element, bieden container queries een meer granulaire en flexibele benadering van responsief ontwerp dan traditionele media queries. Naarmate de browserondersteuning blijft verbeteren, staan container queries op het punt een essentieel onderdeel te worden van de toolkit van elke webontwikkelaar. Omarm ze om robuustere, herbruikbare en gebruiksvriendelijkere webervaringen te bouwen voor een wereldwijd publiek.
De mogelijkheden die door container queries worden ontsloten, gaan veel verder dan eenvoudige lay-outaanpassingen. Ze maken de creatie van contextbewuste componenten mogelijk die zich kunnen aanpassen aan verschillende situaties, wat resulteert in een meer naadloze en intuïtieve gebruikerservaring. Terwijl u deze krachtige functie verkent, overweeg dan hoe het de herbruikbaarheid, onderhoudbaarheid en aanpasbaarheid van uw webprojecten kan verbeteren, wat uiteindelijk bijdraagt aan een meer inclusief en wereldwijd toegankelijk web.
Door de kracht van container queries te benutten, kunt u webervaringen creëren die niet alleen visueel aantrekkelijk zijn, maar ook zeer aanpasbaar en gebruikersgericht, en die tegemoetkomen aan de uiteenlopende behoeften van een wereldwijd publiek.