La syntaxe des media queries

.cartes { display: grid; grid-template-columns: 1fr; }
@media (min-width: 768px) {
  .cartes { grid-template-columns: repeat(2, 1fr); }
}

La grille existe à toutes les largeurs. Seul le nombre de colonnes change à partir de 768 px. À 767 px, la base s’applique ; à 768 px, la règle conditionnelle devient applicable. Les autres propriétés restent déterminées par la cascade.

TermeSensConfusion fréquente
ViewportZone de présentation de la page.Ce n’est pas forcément la résolution physique de l’écran.
BreakpointSeuil choisi pour modifier la disposition.Ce n’est pas une marque d’appareil.
min-widthCondition au moins égale au seuil.Le cas exactement égal est inclus.
max-widthCondition au plus égale au seuil.Des conditions peuvent se chevaucher.

Media queries et cascade CSS

Si deux conditions correspondent en même temps, leurs déclarations participent à la cascade habituelle. Évitez des dizaines de seuils pour corriger chaque carte séparément. Commencez par les règles communes et ajoutez un seuil lorsque le contenu l’exige.

Largeurs minimales et débordements CSS

Testez une image large, un titre long, un lien contenant beaucoup de caractères et une navigation chargée. Une largeur fixe ou un enfant trop large peut faire déborder son conteneur. Un simple overflow: hidden masque parfois le défaut en coupant une information ; inspectez la boîte responsable avant de l’utiliser.

Une image fluide conserve généralement max-width: 100% et height: auto. Une navigation peut passer à la ligne. Les boutons ne doivent pas devenir inutilisables parce qu’un texte a été raccourci pour faire entrer une capture.

Les conditions min-width et max-width

Une media query applique des déclarations si sa condition est vraie. Elle décrit la zone d’affichage, pas une liste de modèles de téléphone. min-width: 700px inclut 700 ; max-width: 700px inclut également 700. Deux conditions peuvent donc être vraies au même seuil : l’ordre et les autres critères de cascade comptent.

.galerie {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem;
}

@media (min-width: 700px) {
  .galerie { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (min-width: 1000px) {
  .galerie { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

Prédiction : à 320 px, une colonne ; à 768 px, deux ; à 1024 px, trois. Dans ce fichier et cette couche, les sélecteurs ont la même spécificité : la dernière déclaration applicable fixe les colonnes. minmax(0, 1fr) autorise le rétrécissement des pistes, mais un contenu trop long peut encore nécessiter une règle adaptée.

Observer les seuils et les contenus longs

<style>
      * {
        box-sizing: border-box;
      }
      body {
        margin: 0;
        padding: 20px;
        font-family: system-ui, sans-serif;
        color: #18324c;
        background: #f1f5f9;
      }
      button,
      input,
      select,
      textarea {
        font: inherit;
        max-width: 100%;
      }
      button {
        padding: 8px 12px;
        cursor: pointer;
      }
      input,
      select,
      textarea {
        padding: 8px;
      }
      :focus-visible {
        outline: 3px solid #2563eb;
        outline-offset: 3px;
      }
      article,
      .panel {
        padding: 16px;
        background: white;
        border-radius: 12px;
        min-width: 0;
      }
      .cards {
        display: grid;
        gap: 16px;
      }
      label {
        display: block;
        margin-block: 12px 4px;
      }
      h1 {
        font-size: 1.4rem;
      }
      h2 {
        font-size: 1.15rem;
      }
      p,
      h2,
      a {
        overflow-wrap: anywhere;
      }
      .note {
        font-size: 0.9rem;
      }

      .cards {
        grid-template-columns: 1fr;
      }
      @media (min-width: 700px) {
        .cards {
          grid-template-columns: repeat(2, minmax(0, 1fr));
        }
      }
      @media (min-width: 1000px) {
        .cards {
          grid-template-columns: repeat(3, minmax(0, 1fr));
        }
      }
    </style>

<h1>Le contenu décide des seuils</h1>
    <section class="cards" id="grille">
      <article>
        <h2>Photo</h2>
        <p>Une description qui reste lisible.</p>
      </article>
      <article>
        <h2>Musique</h2>
        <p>Un titre et une description.</p>
      </article>
      <article>
        <h2>Sport</h2>
        <p>La grille suit l’espace disponible.</p>
      </article>
    </section>
    <p>Une colonne ; deux dès 700 px ; trois dès 1000 px.</p>

    <script></script>

Tableau de référence — notions et opérations

NotionRègle à retenir
Media queryUne media query applique des règles lorsque sa condition est satisfaite.
Minimummin-width: 700px signifie au moins 700 pixels CSS.
Maximummax-width: 700px signifie au plus 700 pixels CSS.
Pixels CSSLes seuils du cours utilisent la largeur en pixels CSS de la fenêtre.
BaseLe cours définit d’abord la grille pour une petite largeur.
Grille de baseLa grille du cours a une colonne sous 700 px.
Grille moyenneLa grille du cours a deux colonnes dès 700 px et avant 1000 px.
Grille largeLa grille du cours a trois colonnes dès 1000 px.
Activation de Griddisplay: grid active Grid.
Colonnes égalesrepeat(2, minmax(0, 1fr)) définit deux colonnes de fractions égales avec minimum zéro.
Espacementgap règle l’espace entre les cellules de grille.
CascadeÀ spécificité et priorité égales, une règle applicable placée après l’autre peut la remplacer.
Orientationorientation décrit le rapport largeur/hauteur de la zone d’affichage.
ViewportLa meta viewport permet notamment une largeur adaptée au dispositif sur mobile.
Largeur fluideUne largeur fluide s’adapte à l’espace disponible plutôt qu’imposer partout une grande largeur fixe.
Imagemax-width: 100% empêche une image de dépasser la largeur disponible de son conteneur.
Contenu longoverflow-wrap: anywhere permet de couper un contenu textuel long si nécessaire.
ZoomTester le zoom à 200 % vérifie que le contenu reste utilisable lorsque son affichage grossit.
Seuil de contenuUn breakpoint se choisit d’après les besoins du contenu.
Même documentLe responsive adapte le même contenu sans imposer un fichier HTML par largeur.

Exemple court — une longue chaîne ne dicte pas la largeur

La boîte est étroite et la chaîne peut se couper. Comparez overflow-wrap: anywhere avec white-space: nowrap dans le laboratoire. Une règle de coupure résout ici une contrainte de contenu ; masquer toute la page ne la résoudrait pas.

<p>https://example.org/projets/une-adresse-particulierement-longue</p>
<style>
  p {
    width: 14rem;
    max-width: 100%;
    overflow-wrap: anywhere;
    padding: 8px;
    border: 1px solid #2457a7;
    box-sizing: border-box;
  }
</style>
Une URL longue reste dans son conteneur — aperçu fixe