Titre de l'article
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
DĂ©couvrez les requĂȘtes de conteneur CSS, la prochaine Ă©volution du design adaptatif. CrĂ©ez des composants flexibles basĂ©s sur la taille de leur conteneur, et non la fenĂȘtre d'affichage.
Le design adaptatif est une pierre angulaire du dĂ©veloppement web depuis plus d'une dĂ©cennie. Traditionnellement, nous nous sommes appuyĂ©s sur les media queries pour adapter nos mises en page en fonction de la taille de la fenĂȘtre d'affichage. Cependant, cette approche peut parfois sembler limitĂ©e, surtout lorsqu'il s'agit de designs complexes basĂ©s sur des composants. Voici les requĂȘtes de conteneur CSS â une nouvelle fonctionnalitĂ© puissante qui permet aux composants de s'adapter en fonction de la taille de leur Ă©lĂ©ment conteneur, et non seulement de la fenĂȘtre d'affichage.
Les requĂȘtes de conteneur changent la donne car elles permettent un design adaptatif basĂ© sur les Ă©lĂ©ments. Au lieu de demander "Quelle est la taille de l'Ă©cran ?", vous pouvez demander "De combien d'espace ce composant dispose-t-il ?". Cela ouvre un monde de possibilitĂ©s pour crĂ©er des composants vĂ©ritablement rĂ©utilisables et adaptables.
Imaginez un composant de carte qui pourrait apparaĂźtre dans divers contextes : une barre latĂ©rale Ă©troite, une large section d'en-tĂȘte, ou une grille Ă plusieurs colonnes. Avec les media queries, vous auriez besoin d'Ă©crire des rĂšgles spĂ©cifiques pour chacun de ces scĂ©narios basĂ©es sur la largeur de la fenĂȘtre d'affichage. Avec les requĂȘtes de conteneur, la carte peut ajuster intelligemment sa mise en page et son style en fonction des dimensions de son conteneur parent, quelle que soit la taille globale de l'Ă©cran.
Les requĂȘtes de conteneur offrent plusieurs avantages clĂ©s par rapport aux media queries traditionnelles :
Plongeons dans les aspects pratiques de l'utilisation des requĂȘtes de conteneur. La premiĂšre Ă©tape consiste Ă dĂ©clarer un conteneur. Vous pouvez le faire en utilisant la propriĂ©tĂ© container-type sur l'Ă©lĂ©ment parent :
La propriété container-type accepte plusieurs valeurs :
size : Les requĂȘtes de conteneur rĂ©agiront aux dimensions en ligne et en bloc du conteneur.inline-size : Les requĂȘtes de conteneur rĂ©agiront uniquement Ă la dimension en ligne (largeur dans les modes d'Ă©criture horizontale) du conteneur. C'est l'option la plus courante et souvent la plus utile.block-size : Les requĂȘtes de conteneur rĂ©agiront uniquement Ă la dimension en bloc (hauteur dans les modes d'Ă©criture horizontale) du conteneur.normal : L'Ă©lĂ©ment n'est pas un conteneur de requĂȘte. C'est la valeur par dĂ©faut.style : Les requĂȘtes de conteneur rĂ©agiront aux requĂȘtes de style et aux requĂȘtes de nom de conteneur (abordĂ©es plus tard), vous permettant d'interroger les propriĂ©tĂ©s personnalisĂ©es dĂ©finies sur le conteneur.Voici un exemple de dĂ©finition d'un conteneur qui rĂ©agit Ă sa taille en ligne :
.card-container {
container-type: inline-size;
}
Vous pouvez également utiliser la propriété raccourcie container pour spécifier à la fois le container-type et le container-name (que nous aborderons plus tard) en une seule déclaration :
.card-container {
container: card / inline-size;
}
Dans ce cas, 'card' est le nom du conteneur.
Une fois que vous avez dĂ©fini un conteneur, vous pouvez utiliser la rĂšgle at @container pour Ă©crire vos requĂȘtes. La syntaxe est similaire aux media queries, mais au lieu de cibler les dimensions de la fenĂȘtre d'affichage, vous ciblez les dimensions du conteneur :
@container card (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 50%;
}
.card__content {
width: 50%;
}
}
Dans cet exemple, nous ciblons le conteneur "card" et appliquons des styles aux éléments .card, .card__image et .card__content lorsque la largeur du conteneur est d'au moins 400px. Notez le `card` avant `(min-width: 400px)`. C'est crucial lorsque vous avez nommé votre conteneur en utilisant `container-name` ou la propriété raccourcie `container`.
Si vous n'avez pas nommé votre conteneur, vous pouvez omettre le nom du conteneur :
@container (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 50%;
}
.card__content {
width: 50%;
}
}
Vous pouvez utiliser la mĂȘme gamme de fonctionnalitĂ©s mĂ©dia disponibles dans les media queries, telles que min-width, max-width, min-height, max-height et l'orientation.
Nommer vos conteneurs peut ĂȘtre utile, surtout lorsque vous traitez avec des conteneurs imbriquĂ©s ou des mises en page complexes. Vous pouvez attribuer un nom Ă un conteneur en utilisant la propriĂ©tĂ© container-name :
.card-container {
container-name: card;
container-type: inline-size;
}
Ensuite, dans vos requĂȘtes de conteneur, vous pouvez cibler le conteneur par son nom :
@container card (min-width: 400px) {
/* Styles for the 'card' container */
}
Les requĂȘtes de style de conteneur vous permettent de rĂ©agir au style de votre conteneur plutĂŽt qu'Ă sa taille. C'est particuliĂšrement puissant lorsqu'elles sont combinĂ©es avec des propriĂ©tĂ©s personnalisĂ©es. Tout d'abord, vous devez dĂ©finir votre conteneur avec container-type: style :
.component-container {
container-type: style;
}
Ensuite, vous pouvez utiliser @container style(--theme: dark) pour interroger la valeur de la propriété personnalisée --theme :
.component-container {
--theme: light;
}
@container style(--theme: dark) {
.component {
background-color: black;
color: white;
}
}
Cela permet Ă vos composants de s'adapter en fonction d'une configuration dĂ©finie via CSS plutĂŽt que de la taille de la fenĂȘtre d'affichage. Cela ouvre de grandes possibilitĂ©s pour la thĂ©matisation et le style dynamique.
Examinons quelques exemples concrets de la façon dont les requĂȘtes de conteneur peuvent ĂȘtre utilisĂ©es dans des scĂ©narios rĂ©els :
Imaginez un composant de carte qui affiche des informations sur un produit. Dans un conteneur étroit, nous pourrions vouloir empiler l'image et le contenu verticalement. Dans un conteneur plus large, nous pouvons les afficher cÎte à cÎte.
HTML :
CSS :
.card-container {
container-type: inline-size;
}
.card {
display: flex;
flex-direction: column;
border: 1px solid #ccc;
padding: 16px;
}
.card__image {
width: 100%;
margin-bottom: 16px;
}
.card__content {
width: 100%;
}
@container (min-width: 400px) {
.card {
flex-direction: row;
}
.card__image {
width: 50%;
margin-bottom: 0;
}
.card__content {
width: 50%;
}
}
Dans cet exemple, la carte affichera initialement l'image et le contenu empilés verticalement. Lorsque la largeur du conteneur atteint 400px, la carte passera à une mise en page horizontale.
ConsidĂ©rez un menu de navigation qui doit s'adapter en fonction de l'espace disponible. Dans un conteneur Ă©troit (par exemple, une barre latĂ©rale mobile), nous pourrions vouloir afficher les Ă©lĂ©ments du menu dans une liste verticale. Dans un conteneur plus large (par exemple, un en-tĂȘte de bureau), nous pouvons les afficher horizontalement.
HTML :
CSS :
.nav-container {
container-type: inline-size;
}
.nav {
list-style: none;
padding: 0;
margin: 0;
}
.nav__item {
margin-bottom: 8px;
}
.nav__item a {
display: block;
padding: 8px 16px;
text-decoration: none;
color: #333;
}
@container (min-width: 600px) {
.nav {
display: flex;
}
.nav__item {
margin-right: 16px;
margin-bottom: 0;
}
.nav__item a {
display: inline-block;
}
}
Dans cet exemple, le menu de navigation affichera initialement les éléments dans une liste verticale. Lorsque la largeur du conteneur atteint 600px, le menu passera à une mise en page horizontale.
Imaginez une mise en page d'article qui doit s'adapter en fonction de son emplacement. Si elle se trouve dans une petite section de prĂ©visualisation, l'image doit ĂȘtre au-dessus du texte. S'il s'agit de l'article principal, l'image peut ĂȘtre sur le cĂŽtĂ©.
HTML
Titre de l'article
Lorem ipsum dolor sit amet, consectetur adipiscing elit...
CSS
.article-container {
container-type: inline-size;
}
.article {
display: flex;
flex-direction: column;
}
.article-image {
width: 100%;
margin-bottom: 10px;
}
.article-content {
width: 100%;
}
@container (min-width: 768px) {
.article {
flex-direction: row;
}
.article-image {
width: 40%;
margin-right: 20px;
margin-bottom: 0;
}
.article-content {
width: 60%;
}
}
Le support des requĂȘtes de conteneur est dĂ©sormais excellent sur les navigateurs modernes, y compris Chrome, Firefox, Safari et Edge. Il est important de consulter Can I Use pour les derniĂšres informations sur le support des navigateurs, car les fonctionnalitĂ©s et les dĂ©tails d'implĂ©mentation peuvent Ă©voluer.
Bien que les requĂȘtes de conteneur offrent une alternative puissante aux media queries, il est important de comprendre quand chaque approche est la plus appropriĂ©e.
Dans de nombreux cas, vous utiliserez probablement une combinaison de media queries et de requĂȘtes de conteneur. Utilisez les media queries pour Ă©tablir la mise en page globale de votre application, puis utilisez les requĂȘtes de conteneur pour affiner l'apparence et le comportement des composants individuels au sein de cette mise en page.
Les requĂȘtes de conteneur CSS reprĂ©sentent un pas en avant significatif dans l'Ă©volution du design adaptatif. En permettant l'adaptabilitĂ© basĂ©e sur les Ă©lĂ©ments, elles donnent aux dĂ©veloppeurs les moyens de crĂ©er des composants plus flexibles, rĂ©utilisables et maintenables. Ă mesure que le support des navigateurs continue de s'amĂ©liorer, les requĂȘtes de conteneur sont sur le point de devenir un outil essentiel dans l'arsenal de chaque dĂ©veloppeur web.
Lors de l'implĂ©mentation des requĂȘtes de conteneur pour un public mondial, tenez compte des points suivants :
inline-start et inline-end au lieu de propriĂ©tĂ©s physiques comme left et right.em, rem) pour vous assurer que votre texte s'adapte correctement.Les requĂȘtes de conteneur CSS sont un outil puissant pour construire des applications web vĂ©ritablement adaptatives et rĂ©actives. En adoptant le design adaptatif basĂ© sur les Ă©lĂ©ments, vous pouvez crĂ©er des composants qui s'adaptent parfaitement Ă diffĂ©rents contextes, simplifier votre code et amĂ©liorer l'expĂ©rience utilisateur globale. Ă mesure que le support des navigateurs continue de croĂźtre, les requĂȘtes de conteneur sont sur le point de devenir une partie fondamentale du dĂ©veloppement web moderne. Adoptez cette technologie, expĂ©rimentez ses capacitĂ©s et dĂ©bloquez un nouveau niveau de flexibilitĂ© dans vos designs adaptatifs. Cette approche permet une meilleure rĂ©utilisabilitĂ© des composants, une meilleure maintenabilitĂ© et un processus de design plus intuitif, ce qui en fait un atout inestimable pour les dĂ©veloppeurs front-end du monde entier. La transition vers les requĂȘtes de conteneur encourage une approche de design plus centrĂ©e sur les composants, ce qui se traduit par des expĂ©riences web plus robustes et adaptables pour les utilisateurs du monde entier.