cards · responsive
Une SEULE carte qui change de mise en page selon la largeur de son conteneur (container queries CSS), pas selon la taille de l'écran. Colle-la n'importe où, elle s'adapte toute seule.
<style>
@import url('https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Inter:wght@400;500&display=swap');
.bn-adaptive-demo {
display: flex;
flex-wrap: wrap;
align-items: flex-start;
gap: 2rem;
padding: 2.5rem;
font-family: 'Inter', sans-serif;
background: #0B0F10;
}
.bn-adaptive-demo__label {
display: block;
margin-bottom: 0.6rem;
font-size: 0.7rem;
letter-spacing: 0.06em;
text-transform: uppercase;
color: #979793;
}
/* ------------------------------------------------------------
L'INGRÉDIENT CLÉ : "container-type: inline-size" transforme ce
div en "conteneur interrogeable" — les règles @container plus
bas ne regardent PLUS la taille de l'écran (comme une media
query classique), mais la largeur de CE conteneur précis.
C'est ce qui permet à la même carte de s'adapter différemment
selon où tu la colles sur la page, peu importe la taille de
l'écran du visiteur.
------------------------------------------------------------ */
.bn-responsive-wrap {
container-type: inline-size;
}
.bn-card-adaptive {
display: flex;
gap: 0.75rem;
background: #1D2324;
border: 1px solid rgba(230, 228, 221, 0.1);
border-radius: 6px;
overflow: hidden;
}
.bn-card-adaptive__media {
flex: 0 0 40%;
}
.bn-card-adaptive__media img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.bn-card-adaptive__body {
padding: 0.75rem;
display: flex;
flex-direction: column;
justify-content: center;
gap: 0.3rem;
min-width: 0;
}
.bn-card-adaptive__kicker {
font-size: 0.6rem;
letter-spacing: 0.08em;
text-transform: uppercase;
color: #979793;
}
.bn-card-adaptive__title {
font-family: 'Bebas Neue', sans-serif;
font-size: 1rem;
letter-spacing: 0.02em;
color: #E6E4DD;
margin: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.bn-card-adaptive__link {
font-size: 0.7rem;
color: #E6E4DD;
text-decoration: none;
}
/* En dessous de 260px de large : la carte passe en pile verticale
(image au-dessus du texte) au lieu d'être côte à côte */
@container (max-width: 260px) {
.bn-card-adaptive {
flex-direction: column;
}
.bn-card-adaptive__media {
flex: none;
height: 90px;
}
}
/* En dessous de 150px : plus assez de place pour le kicker et le
lien, on ne garde que l'essentiel (image + titre) */
@container (max-width: 150px) {
.bn-card-adaptive__kicker,
.bn-card-adaptive__link {
display: none;
}
.bn-card-adaptive__title {
font-size: 0.75rem;
white-space: normal;
}
.bn-card-adaptive__body {
padding: 0.5rem;
}
}
</style>
<div class="bn-adaptive-demo">
<div class="bn-responsive-wrap" style="width: 320px;">
<span class="bn-adaptive-demo__label">320px de large</span>
<article class="bn-card-adaptive">
<div class="bn-card-adaptive__media">
<img src="https://placehold.co/300x300" alt="Vignette du projet" />
</div>
<div class="bn-card-adaptive__body">
<span class="bn-card-adaptive__kicker">Projet</span>
<h4 class="bn-card-adaptive__title">Entre ombre et silence</h4>
<a href="#" class="bn-card-adaptive__link">Voir le projet →</a>
</div>
</article>
</div>
<div class="bn-responsive-wrap" style="width: 200px;">
<span class="bn-adaptive-demo__label">200px de large</span>
<article class="bn-card-adaptive">
<div class="bn-card-adaptive__media">
<img src="https://placehold.co/300x300" alt="Vignette du projet" />
</div>
<div class="bn-card-adaptive__body">
<span class="bn-card-adaptive__kicker">Projet</span>
<h4 class="bn-card-adaptive__title">Entre ombre et silence</h4>
<a href="#" class="bn-card-adaptive__link">Voir le projet →</a>
</div>
</article>
</div>
<div class="bn-responsive-wrap" style="width: 120px;">
<span class="bn-adaptive-demo__label">120px de large</span>
<article class="bn-card-adaptive">
<div class="bn-card-adaptive__media">
<img src="https://placehold.co/300x300" alt="Vignette du projet" />
</div>
<div class="bn-card-adaptive__body">
<span class="bn-card-adaptive__kicker">Projet</span>
<h4 class="bn-card-adaptive__title">Entre ombre et silence</h4>
<a href="#" class="bn-card-adaptive__link">Voir le projet →</a>
</div>
</article>
</div>
</div>