À la une cette semaine
Lisbonne, 5 nuits
Vol et hôtel dans l'Alfama, petit-déjeuner compris.
Fjords en train, 7 nuits
Bergen, Flåm et la ligne de montagne en voiture panoramique.
Carte image + texte qui passe d'une pile verticale à une rangée dès que son conteneur atteint 280 px, sans media query ni JavaScript.
Mis à jour le
Le layout passe de colonne à rangée selon la largeur du conteneur.
Cet effet est gratuit — la catégorie Utilitaires en contient 43 au total, dont 3 gratuits. Effect.Labs regroupe 840 effets vanilla. Découvrir la catégorie →
À la une cette semaine
Vol et hôtel dans l'Alfama, petit-déjeuner compris.
Bergen, Flåm et la ligne de montagne en voiture panoramique.
Faites glisser la poignée : sous 280 px, la carte empile l'image au-dessus du texte.
Deux jours de vannerie en forêt.
Nous avons quitté le village avant le lever du jour, frontale allumée, le col encore caché dans les nuages.
À midi, le sentier devient pierrier et les premières marmottes sifflent.
La racine .fx-0745-root déclare container: adc-card / inline-size : c'est elle que le navigateur mesure, pas la fenêtre. Elle prend width: 100% de son parent, avec un fond #0a0a0f et des coins de 14 px. À l'intérieur, .adc-card est une boîte flex en colonne : l'image .adc-img (80 px de haut, dégradé violet → rose) occupe toute la largeur, puis viennent le titre, le paragraphe et les étiquettes .adc-tag.
Une seule règle @container adc-card (min-width: 280px) fait le travail : la carte passe en flex-direction: row, alignée au centre, et l'image devient un carré de 100 × 100 px à gauche du texte. Sous 280 px, on revient à la pile. Comme la règle interroge la carte elle-même, la même carte peut être en rangée dans une colonne large et en pile dans une barre latérale, sur la même page, au même instant.
Le passage d'une forme à l'autre est accompagné d'une transition all 0.3s ease sur la carte et l'image (l'image glisse vers sa taille carrée). Aucun script : le code complet tient dans le HTML et le CSS fournis.
<a> plutôt que la boîte entière..adc-img est une div à fond dégradé, ignorée par les technologies d'assistance. Si votre visuel porte une information, placez-y un <img alt="…">.prefers-reduced-motion: reduce, les transitions de la carte et de l'image sont coupées ; le changement de disposition se fait d'un coup.Repose sur les requêtes de conteneur (container-type, @container). Mesuré dans Chromium 151, Firefox 153 et WebKit 26.5 : bascule à 280 px identique, aucun débordement à 390 px, deux copies indépendantes sur la même page.
Un navigateur plus ancien ignore la règle @container : la carte reste en pile verticale, lisible à toutes les largeurs.
Copiez les deux blocs (HTML et CSS) dans votre page. Aucun JavaScript, aucune dépendance.
<div class="fx-0745-root">
<div class="adc-card">
<div class="adc-img"></div>
<div class="adc-body">
<h4>Carte Adaptive</h4>
<p>Le layout passe de colonne à rangée selon la largeur du conteneur.</p>
<div class="adc-tags">
<span class="adc-tag">@container</span>
<span class="adc-tag">CSS</span>
</div>
</div>
</div>
</div>
.fx-0745-root,
.fx-0745-root *,
.fx-0745-root *::before,
.fx-0745-root *::after {
box-sizing: border-box
}
.fx-0745-root {
container: adc-card / inline-size;
display: block;
width: 100%;
background: #0a0a0f;
border-radius: 14px;
color: #fff;
font-family: sans-serif;
}
.fx-0745-root .adc-card {
display: flex;
flex-direction: column;
gap: 12px;
padding: 16px;
background: rgba(255, 255, 255, 0.04);
border-radius: 14px;
transition: all 0.3s ease;
}
.fx-0745-root .adc-img {
width: 100%;
height: 80px;
border-radius: 10px;
background: linear-gradient(135deg, #8b5cf6, #ec4899);
background-size: cover;
background-position: center;
flex-shrink: 0;
transition: all 0.3s ease;
}
.fx-0745-root .adc-body {
min-width: 0;
}
.fx-0745-root .adc-body h4 {
font-size: 0.85rem;
font-weight: 700;
color: #fff;
margin: 0 0 4px;
}
.fx-0745-root .adc-body p {
font-size: 0.72rem;
color: rgba(255, 255, 255, 0.6);
margin: 0 0 8px;
line-height: 1.5;
}
.fx-0745-root .adc-tags {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
.fx-0745-root .adc-tag {
padding: 3px 8px;
border-radius: 6px;
background: rgba(139, 92, 246, 0.15);
font-size: 0.6rem;
font-weight: 600;
color: #a78bfa;
}
@container adc-card (min-width: 280px) {
.fx-0745-root .adc-card {
flex-direction: row;
align-items: center;
}
.fx-0745-root .adc-img {
width: 100px;
height: 100px;
}
}
@media (prefers-reduced-motion: reduce) {
.fx-0745-root .adc-card,
.fx-0745-root .adc-img {
transition: none;
}
}
CSS pur — aucun JavaScript requis.
Options passées à l'API ou attributs data-* :
| Option / propriété | Défaut | Effet |
|---|---|---|
Palier de bascule (CSS — @container adc-card (min-width: 280px)) |
280 px | Montez à 340 px si votre texte est long, descendez à 240 px pour une rangée plus tôt. Une seconde règle (ex. min-width: 480px) peut agrandir l'image dans les grandes colonnes. |
Visuel (CSS ou HTML — .adc-img) |
Dégradé #8b5cf6 → #ec4899 |
Posez votre photo avec style="background-image:url(…)" ; background-size: cover est déjà prévu. Pour une image informative, mettez un <img> dans la div. |
Taille de l'image en rangée (CSS — width/height dans la règle @container) |
100 × 100 px | 120 × 120 px pour une vignette plus présente, 72 × 72 px pour une liste dense. |
Hauteur de l'image en pile (CSS — .adc-img { height }) |
80 px | Passez à 140 px pour une carte plus « photo » dans les colonnes étroites. |
Fond et coins (CSS — .fx-0745-root et .adc-card) |
#0a0a0f, carte rgba(255,255,255,.04), rayon 14 px |
Pour un thème clair : fond blanc sur la racine, texte sombre sur h4 et p. |
Étiquettes (HTML — .adc-tag) |
2 étiquettes | Ajoutez ou supprimez des <span class="adc-tag"> ; la rangée passe à la ligne toute seule. |
Durée de transition (CSS — transition: all 0.3s) |
0,3 s | none pour une bascule sèche ; la règle de mouvement réduit le fait déjà pour qui le demande. |
Un conteneur inline-size ne tire pas sa largeur de son contenu. La racine a width: 100%, ce qui suffit dans un bloc ou une grille en 1fr ; dans une rangée flex, donnez-lui flex: 1 ou une largeur explicite.
Une media query regarde la fenêtre : toutes les cartes changeraient en même temps. Ici chaque carte regarde la place qu'elle a réellement, donc une carte de barre latérale reste en pile pendant que celle du contenu principal est en rangée.
Oui : chaque .fx-0745-root est son propre conteneur. Dans grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)), chaque carte choisit sa forme selon la largeur de sa case.