📚 Cours SCSS (Sass) 📍 Chapitre 16 / 21

Responsive design avec SCSS

Le responsive design consiste à adapter l'interface à toutes les tailles d'écran (smartphone, tablette, desktop…). SCSS ne rend pas un site "responsive" tout seul, mais il t'aide à organiser et industrialiser ta logique responsive : breakpoints centralisés, mixins, patterns réutilisables, et styles plus cohérents.

Objectifs du chapitre

  • Définir des breakpoints propres et cohérents.
  • Mettre en place une mixin responsive réutilisable.
  • Comprendre l'approche mobile-first (recommandée).
  • Créer des patterns responsives pro (grilles, typographie, espacements).
  • Éviter les erreurs courantes (duplication, breakpoints "au hasard").
À retenir

Le responsive se pense en système : breakpoints + composants + règles cohérentes. SCSS est excellent pour centraliser ces décisions.

Explications théoriques détaillées

Mobile-first : le réflexe à adopter

L'approche mobile-first consiste à écrire d'abord les styles pour petit écran, puis à ajouter des améliorations pour les écrans plus grands via @media (min-width: ...).

  • Base simple et légère (mobile).
  • Améliorations progressives (tablette, desktop).
  • Meilleure cohérence globale.
Conseil terrain

Si tu fais l'inverse (desktop-first), tu ajoutes souvent des surcharges et des exceptions. Mobile-first est généralement plus stable.

Breakpoints : centraliser pour éviter le chaos

Un breakpoint, c'est une largeur d'écran à partir de laquelle tu changes la mise en page. L'erreur classique : écrire 783px ici, 820px là, 991px ailleurs… sans logique.

Avec SCSS, on centralise dans une map.

3 styles responsives fréquents

  • Layout : passer de 1 colonne à 2-3 colonnes.
  • Typographie : ajuster légèrement les tailles.
  • Espacements : augmenter padding/margin sur grand écran.

Exemples simples

Définir des breakpoints dans une map

SCSS :

SCSS
$breakpoints: (
  sm: 576px,
  md: 768px,
  lg: 1024px,
  xl: 1280px
);

Mixin responsive réutilisable (mobile-first)

On crée une mixin mq() qui prend une clé (md, lg…).

SCSS :

SCSS
$breakpoints: (
  md: 768px,
  lg: 1024px
);

@mixin mq($key) {
  @if map-has-key($breakpoints, $key) {
    @media (min-width: map-get($breakpoints, $key)) {
      @content;
    }
  } @else {
    @warn "Breakpoint inconnu : #{$key}";
  }
}

.card {
  padding: 12px;

  @include mq(md) {
    padding: 16px;
  }

  @include mq(lg) {
    padding: 24px;
  }
}

CSS généré :

CSS
.card {
  padding: 12px;
}

@media (min-width: 768px) {
  .card {
    padding: 16px;
  }
}

@media (min-width: 1024px) {
  .card {
    padding: 24px;
  }
}
À retenir

@content permet d'injecter le bloc de styles dans la media query. C'est ce qui rend la mixin si puissante et réutilisable.

Exemples concrets et professionnels

Cas pro 1 : grille responsive simple

Sur mobile : 1 colonne. Sur tablette : 2 colonnes. Sur desktop : 3 colonnes.

SCSS :

SCSS
$breakpoints: (
  md: 768px,
  lg: 1024px
);

@mixin mq($key) {
  @media (min-width: map-get($breakpoints, $key)) {
    @content;
  }
}

.grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;

  @include mq(md) {
    grid-template-columns: repeat(2, 1fr);
  }

  @include mq(lg) {
    grid-template-columns: repeat(3, 1fr);
  }
}

Cas pro 2 : responsive spacing (espacements)

On augmente progressivement les espacements sur les écrans plus grands.

SCSS :

SCSS
$breakpoints: (
  md: 768px,
  lg: 1024px
);

@mixin mq($key) {
  @media (min-width: map-get($breakpoints, $key)) {
    @content;
  }
}

.section {
  padding: 16px;

  @include mq(md) {
    padding: 24px;
  }

  @include mq(lg) {
    padding: 40px;
  }
}
Conseil terrain

Sur mobile, garde des espacements raisonnables. Sur desktop, tu peux "respirer" davantage. L'espace blanc aide à la lisibilité.

Cas pro 3 : responsive "composant" propre (pattern recommandé)

Un bon réflexe : garder le responsive au niveau du composant, pas "au hasard" dans le projet.

SCSS :

SCSS
$breakpoints: (
  md: 768px,
  lg: 1024px
);

@mixin mq($key) {
  @media (min-width: map-get($breakpoints, $key)) { @content; }
}

.card {
  display: grid;
  gap: 12px;
  padding: 16px;

  .card__media {
    aspect-ratio: 16 / 9;
    border-radius: 12px;
    background: rgba(255,255,255,.08);
  }

  .card__content {
    display: grid;
    gap: 8px;
  }

  @include mq(md) {
    grid-template-columns: 220px 1fr;
    align-items: center;
  }

  @include mq(lg) {
    grid-template-columns: 280px 1fr;
  }
}

CSS généré (extrait pour md) :

CSS
.card {
  display: grid;
  gap: 12px;
  padding: 16px;
}

.card .card__media {
  aspect-ratio: 16 / 9;
  border-radius: 12px;
  background: rgba(255,255,255,.08);
}

.card .card__content {
  display: grid;
  gap: 8px;
}

@media (min-width: 768px) {
  .card {
    grid-template-columns: 220px 1fr;
    align-items: center;
  }
}

@media (min-width: 1024px) {
  .card {
    grid-template-columns: 280px 1fr;
  }
}
À retenir

Le responsive "par composant" est généralement plus maintenable que des fichiers pleins de media queries globales. Chaque composant porte sa propre logique responsive.

Bonnes pratiques

  • Adopter mobile-first (min-width) sauf exception.
  • Centraliser les breakpoints dans une map.
  • Créer une mixin mq() unique pour tout le projet.
  • Garder les media queries proches du composant concerné.
  • Limiter le nombre de breakpoints : 3–5 suffisent souvent.
  • Utiliser des noms sémantiques (sm, md, lg) plutôt que des noms d'appareils.
Conseil terrain

Ne crée pas un breakpoint juste pour "corriger un pixel". Si un composant casse, corrige le composant ou sa grille. Les breakpoints doivent représenter des changements significatifs de mise en page.

Erreurs courantes

Erreur 1 : breakpoints incohérents

Des breakpoints "au hasard" rendent le responsive difficile à raisonner. Centralise et nomme tes breakpoints pour une cohérence globale.

Erreur 2 : duplication de media queries

Réécrire des @media partout au lieu d'utiliser une mixin crée vite un code lourd et répétitif. Une seule mixin bien conçue suffit.

Erreur 3 : trop de surcharges desktop-first

Si tu pars du desktop et que tu "démontes" tout pour mobile, tu finis souvent avec des exceptions. Mobile-first est plus naturel et produit généralement moins de code.

Résumé du chapitre

Ce que vous avez appris
Le responsive design se structure mieux avec des breakpoints centralisés dans une map.
Mobile-first (min-width) est généralement recommandé pour une approche progressive.
Une mixin mq() rend les media queries plus lisibles, réutilisables et maintenables.
Les patterns pro : grilles responsive, espacements adaptatifs et responsive par composant.

Prochain chapitre : Architecture SCSS professionnelle

Dans le prochain chapitre, nous verrons l'architecture SCSS professionnelle : conventions de dossiers, organisation du code, approche 7-1, et méthodes pour garder un projet propre dans la durée.

  • Patterns d'organisation (7-1, ITCSS, etc.)
  • Conventions de nommage et structure de dossiers
  • Gestion des dépendances entre fichiers
  • Documentation et maintenabilité à long terme