cards · responsive

Card adaptative (desktop/mobile)

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.

Voir le code source
<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>