Débutant 19 min de lecture · 4 065 mots

Design responsive : Mobile-first et breakpoints

Design responsive : Mobile-first et breakpoints
Débutant · 2026.05.09

Introduction

En 2024, plus de 60% du trafic web mondial provient d’appareils mobiles. Le design responsive n’est plus une option, c’est une nécessité. Google privilégie les sites mobile-friendly dans son classement, et les utilisateurs abandonnent les sites non optimisés en moins de 3 secondes.

Dans cet article, vous découvrirez l’approche mobile-first, comprendrez le système de breakpoints, et apprendrez à créer des interfaces qui s’adaptent parfaitement à tous les écrans.

Qu’est-ce que le design responsive ?

Le design responsive est une approche qui permet à un site web de s’adapter automatiquement à la taille de l’écran de l’utilisateur, qu’il utilise un smartphone, une tablette, un ordinateur portable ou un grand écran desktop.

Les trois piliers du responsive

1. Grilles fluides (Fluid Grids)

Des layouts basés sur des pourcentages plutôt que des pixels fixes.

/* Mauvais exemple - Largeurs fixes */
.container-bad {
  width: 960px;  /* Ne s'adapte pas */
}

.sidebar-bad {
  width: 300px;  /* Rigide */
}

/* Bon exemple - Largeurs fluides */
.container-good {
  width: 90%;
  max-width: 1200px;  /* Limite sur grands écrans */
  margin: 0 auto;
  padding: 0 1rem;
}

.grid-container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 1.5rem;
}

/* Les colonnes s'adaptent automatiquement */
.card {
  background: #ffffff;
  padding: 1.5rem;
  border-radius: 0.5rem;
}

2. Images flexibles

Images qui s’adaptent à leur conteneur.

/* Images responsive de base */
img {
  max-width: 100%;
  height: auto;
  display: block;
}

/* Image avec ratio préservé */
.image-container {
  position: relative;
  width: 100%;
  padding-bottom: 56.25%;  /* Ratio 16:9 (9/16 * 100) */
  overflow: hidden;
}

.image-container img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;  /* Remplit le conteneur en gardant le ratio */
}

/* Images responsive modernes avec aspect-ratio */
.modern-image {
  width: 100%;
  aspect-ratio: 16/9;
  object-fit: cover;
  border-radius: 0.5rem;
}

/* Images adaptatives (différentes images selon l'écran) */
<picture>
  <!-- Image pour grands écrans -->
  <source media="(min-width: 1024px)" srcset="hero-desktop.jpg">
  <!-- Image pour tablettes -->
  <source media="(min-width: 768px)" srcset="hero-tablet.jpg">
  <!-- Image par défaut pour mobile -->
  <img src="hero-mobile.jpg" alt="Hero image" class="responsive-img">
</picture>

3. Media queries

Règles CSS qui s’appliquent selon les caractéristiques de l’appareil.

/* Media query de base */
.element {
  font-size: 1rem;
  padding: 1rem;
}

@media (min-width: 768px) {
  .element {
    font-size: 1.125rem;
    padding: 1.5rem;
  }
}

@media (min-width: 1024px) {
  .element {
    font-size: 1.25rem;
    padding: 2rem;
  }
}

L’approche Mobile-First

Pourquoi mobile-first ?

Avantages :

  • Performance : Chargez d’abord le minimum, ajoutez pour les écrans plus grands
  • Priorité au contenu : Force à identifier l’essentiel
  • Progressive Enhancement : Amélioration progressive de l’expérience
  • SEO : Google indexe la version mobile en priorité
  • Réalité du marché : La majorité des utilisateurs sont sur mobile
  • Desktop-first vs Mobile-first

/* DESKTOP-FIRST (approche traditionnelle - à éviter) */
.container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);  /* 4 colonnes par défaut */
  gap: 2rem;
  padding: 3rem;
  font-size: 1.125rem;
}

/* On retire des fonctionnalités en descendant */
@media (max-width: 1024px) {
  .container {
    grid-template-columns: repeat(2, 1fr);
    padding: 2rem;
  }
}

@media (max-width: 768px) {
  .container {
    grid-template-columns: 1fr;
    padding: 1rem;
    font-size: 1rem;
  }
}

/* MOBILE-FIRST (approche moderne - recommandée) */
.container {
  display: grid;
  grid-template-columns: 1fr;  /* 1 colonne par défaut (mobile) */
  gap: 1rem;
  padding: 1rem;
  font-size: 1rem;
}

/* On ajoute des fonctionnalités en montant */
@media (min-width: 768px) {
  .container {
    grid-template-columns: repeat(2, 1fr);
    gap: 1.5rem;
    padding: 2rem;
  }
}

@media (min-width: 1024px) {
  .container {
    grid-template-columns: repeat(4, 1fr);
    gap: 2rem;
    padding: 3rem;
    font-size: 1.125rem;
  }
}

HTML de base responsive

<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8">

  <!-- ESSENTIEL : Viewport meta tag -->
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <!-- Prévenir le zoom automatique sur iOS lors du focus sur input -->
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">

  <title>Site Responsive</title>
</head>
<body>
  <!-- Votre contenu -->
</body>
</html>

Attention : Sans <meta name="viewport">, votre site s’affichera comme si l’écran faisait 980px sur mobile !

Système de breakpoints

Breakpoints standards

Les breakpoints sont les points de rupture où le design s’adapte. Voici les standards de l’industrie :

/* Système de breakpoints moderne (basé sur Tailwind CSS) */
:root {
  /* Mobile first : pas de breakpoint pour mobile */
  --screen-sm: 640px;   /* Petites tablettes */
  --screen-md: 768px;   /* Tablettes */
  --screen-lg: 1024px;  /* Desktop */
  --screen-xl: 1280px;  /* Large desktop */
  --screen-2xl: 1536px; /* Très large desktop */
}

/* Usage */
/* Mobile (défaut) : 0-639px */
.element {
  padding: 1rem;
  font-size: 0.875rem;
}

/* Small (sm) : 640px+ */
@media (min-width: 640px) {
  .element {
    padding: 1.25rem;
    font-size: 1rem;
  }
}

/* Medium (md) : 768px+ */
@media (min-width: 768px) {
  .element {
    padding: 1.5rem;
    font-size: 1rem;
  }
}

/* Large (lg) : 1024px+ */
@media (min-width: 1024px) {
  .element {
    padding: 2rem;
    font-size: 1.125rem;
  }
}

/* Extra Large (xl) : 1280px+ */
@media (min-width: 1280px) {
  .element {
    padding: 2.5rem;
    font-size: 1.125rem;
  }
}

/* 2XL : 1536px+ */
@media (min-width: 1536px) {
  .element {
    padding: 3rem;
    font-size: 1.25rem;
  }
}

Breakpoints par catégorie d’appareil

/* APPROCHE PAR APPAREIL (moins flexible, mais parfois utile) */

/* Smartphones portrait : 320px - 479px */
@media (min-width: 320px) and (max-width: 479px) {
  .mobile-only {
    display: block;
  }
}

/* Smartphones paysage : 480px - 767px */
@media (min-width: 480px) and (max-width: 767px) {
  .mobile-landscape {
    display: flex;
  }
}

/* Tablettes portrait : 768px - 1023px */
@media (min-width: 768px) and (max-width: 1023px) {
  .tablet-portrait {
    grid-template-columns: repeat(2, 1fr);
  }
}

/* Tablettes paysage et petits desktops : 1024px - 1279px */
@media (min-width: 1024px) and (max-width: 1279px) {
  .tablet-landscape {
    grid-template-columns: repeat(3, 1fr);
  }
}

/* Desktop standard : 1280px+ */
@media (min-width: 1280px) {
  .desktop {
    grid-template-columns: repeat(4, 1fr);
  }
}

Breakpoints personnalisés

Adaptez selon votre contenu, pas seulement selon les appareils.

/* Breakpoint basé sur le contenu */
.text-content {
  max-width: 100%;
  padding: 1rem;
}

/* À 600px, le texte devient trop large pour être confortable */
@media (min-width: 600px) {
  .text-content {
    max-width: 65ch;  /* 65 caractères max */
    margin: 0 auto;
  }
}

/* À 900px, on peut ajouter une sidebar */
@media (min-width: 900px) {
  .layout-with-sidebar {
    display: grid;
    grid-template-columns: 250px 1fr;
    gap: 2rem;
  }
}

Techniques responsive essentielles

1. Navigation responsive

<header class="site-header">
  <div class="header-container">
    <a href="/" class="logo">MonSite</a>

    <!-- Bouton hamburger (visible mobile uniquement) -->
    <button class="menu-toggle" aria-label="Menu" aria-expanded="false">
      <span class="hamburger"></span>
    </button>

    <!-- Navigation -->
    <nav class="main-nav">
      <ul class="nav-list">
- <a href="/services">Services</a>
- <a href="/portfolio">Portfolio</a>
- <a href="/blog">Blog</a>
- <a href="/contact">Contact</a>
    </nav>
  </div>
</header>
/* Mobile first : Menu empilé */
.site-header {
  background: #ffffff;
  border-bottom: 1px solid #e5e7eb;
  padding: 1rem;
}

.header-container {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.logo {
  font-size: 1.5rem;
  font-weight: 700;
  color: #1f2937;
  text-decoration: none;
}

/* Menu hamburger visible sur mobile */
.menu-toggle {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  width: 40px;
  height: 40px;
  background: none;
  border: none;
  cursor: pointer;
  padding: 0;
}

.hamburger {
  width: 24px;
  height: 2px;
  background: #1f2937;
  position: relative;
  transition: background 0.3s ease;
}

.hamburger::before,
.hamburger::after {
  content: '';
  position: absolute;
  width: 24px;
  height: 2px;
  background: #1f2937;
  transition: transform 0.3s ease;
}

.hamburger::before {
  top: -8px;
}

.hamburger::after {
  bottom: -8px;
}

/* Animation hamburger en X */
.menu-toggle[aria-expanded="true"] .hamburger {
  background: transparent;
}

.menu-toggle[aria-expanded="true"] .hamburger::before {
  transform: rotate(45deg);
  top: 0;
}

.menu-toggle[aria-expanded="true"] .hamburger::after {
  transform: rotate(-45deg);
  bottom: 0;
}

/* Navigation mobile : verticale et cachée par défaut */
.main-nav {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  background: #ffffff;
  border-bottom: 1px solid #e5e7eb;
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.3s ease;
}

.main-nav.is-open {
  max-height: 400px;
}

.nav-list {
  list-style: none;
  padding: 1rem;
  margin: 0;
}

.nav-list li {
  margin: 0;
}

.nav-list a {
  display: block;
  padding: 0.75rem 1rem;
  color: #374151;
  text-decoration: none;
  font-weight: 500;
  transition: background 0.2s ease;
}

.nav-list a:hover {
  background: #f3f4f6;
  color: #2563eb;
}

/* Tablette et desktop : Navigation horizontale */
@media (min-width: 768px) {
  .menu-toggle {
    display: none;  /* Cache le hamburger */
  }

  .main-nav {
    position: static;
    max-height: none;
    overflow: visible;
    border: none;
  }

  .nav-list {
    display: flex;
    gap: 0.5rem;
    padding: 0;
  }

  .nav-list a {
    padding: 0.5rem 1rem;
    border-radius: 0.375rem;
  }
}
// JavaScript pour le menu mobile
const menuToggle = document.querySelector('.menu-toggle');
const mainNav = document.querySelector('.main-nav');

menuToggle.addEventListener('click', () => {
  const isOpen = menuToggle.getAttribute('aria-expanded') === 'true';
  menuToggle.setAttribute('aria-expanded', !isOpen);
  mainNav.classList.toggle('is-open');
});

2. Grilles responsive

/* Grille CSS moderne avec auto-fit */
.products-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 1.5rem;
  padding: 1rem;
}

/* Les cartes s'adaptent automatiquement :
   - Mobile : 1 colonne (si largeur < 280px + gap)
   - Tablette : 2-3 colonnes
   - Desktop : 3-4 colonnes
   Sans media query ! */

/* Contrôle plus précis avec media queries */
.custom-grid {
  display: grid;
  gap: 1rem;
  padding: 1rem;
}

/* Mobile : 1 colonne */
.custom-grid {
  grid-template-columns: 1fr;
}

/* Tablette : 2 colonnes */
@media (min-width: 640px) {
  .custom-grid {
    grid-template-columns: repeat(2, 1fr);
    gap: 1.25rem;
  }
}

/* Desktop : 3 colonnes */
@media (min-width: 1024px) {
  .custom-grid {
    grid-template-columns: repeat(3, 1fr);
    gap: 1.5rem;
    padding: 2rem;
  }
}

/* Large desktop : 4 colonnes */
@media (min-width: 1280px) {
  .custom-grid {
    grid-template-columns: repeat(4, 1fr);
    gap: 2rem;
  }
}

3. Typographie responsive

/* Approche avec clamp() (moderne et recommandée) */
:root {
  /* Typographie fluide entre min et max */
  --font-size-sm: clamp(0.875rem, 0.8rem + 0.25vw, 1rem);
  --font-size-base: clamp(1rem, 0.9rem + 0.5vw, 1.125rem);
  --font-size-lg: clamp(1.125rem, 1rem + 0.625vw, 1.25rem);
  --font-size-xl: clamp(1.25rem, 1.1rem + 0.75vw, 1.5rem);
  --font-size-2xl: clamp(1.5rem, 1.2rem + 1.5vw, 2rem);
  --font-size-3xl: clamp(2rem, 1.5rem + 2.5vw, 3rem);
  --font-size-4xl: clamp(2.5rem, 2rem + 2.5vw, 4rem);
}

body {
  font-size: var(--font-size-base);
  line-height: 1.6;
}

h1 {
  font-size: var(--font-size-4xl);
  line-height: 1.1;
}

h2 {
  font-size: var(--font-size-3xl);
  line-height: 1.2;
}

h3 {
  font-size: var(--font-size-2xl);
  line-height: 1.3;
}

/* Approche traditionnelle avec media queries */
.traditional-heading {
  font-size: 2rem;  /* Mobile : 32px */
  line-height: 1.2;
}

@media (min-width: 768px) {
  .traditional-heading {
    font-size: 2.5rem;  /* Tablette : 40px */
  }
}

@media (min-width: 1024px) {
  .traditional-heading {
    font-size: 3.5rem;  /* Desktop : 56px */
  }
}

@media (min-width: 1280px) {
  .traditional-heading {
    font-size: 4rem;  /* Large desktop : 64px */
  }
}

4. Espacement responsive

/* Système d'espacement adaptatif */
:root {
  /* Mobile */
  --space-xs: 0.5rem;   /* 8px */
  --space-sm: 1rem;     /* 16px */
  --space-md: 1.5rem;   /* 24px */
  --space-lg: 2rem;     /* 32px */
  --space-xl: 3rem;     /* 48px */
  --space-2xl: 4rem;    /* 64px */
}

@media (min-width: 768px) {
  :root {
    /* Tablette : espacements légèrement augmentés */
    --space-md: 2rem;
    --space-lg: 2.5rem;
    --space-xl: 4rem;
    --space-2xl: 6rem;
  }
}

@media (min-width: 1024px) {
  :root {
    /* Desktop : espacements généreux */
    --space-md: 2.5rem;
    --space-lg: 3rem;
    --space-xl: 5rem;
    --space-2xl: 8rem;
  }
}

/* Utilisation */
.section {
  padding: var(--space-lg) var(--space-sm);
}

.card {
  padding: var(--space-md);
  margin-bottom: var(--space-md);
}

5. Masquer/Afficher selon l’écran

/* Classes utilitaires pour masquer/afficher */

/* Masquer sur mobile, afficher sur desktop */
.hide-mobile {
  display: none;
}

@media (min-width: 768px) {
  .hide-mobile {
    display: block;
  }
}

/* Afficher sur mobile, masquer sur desktop */
.show-mobile {
  display: block;
}

@media (min-width: 768px) {
  .show-mobile {
    display: none;
  }
}

/* Masquer sur tablette uniquement */
@media (min-width: 768px) and (max-width: 1023px) {
  .hide-tablet {
    display: none;
  }
}

/* Exemple d'utilisation */
<div class="contact-section">
  <!-- Numéro cliquable sur mobile -->
  <a href="tel:+33123456789" class="show-mobile">
    📞 Appelez-nous
  </a>

  <!-- Numéro simple sur desktop -->
  <p class="hide-mobile">
    Téléphone : 01 23 45 67 89
  </p>
</div>

Mise en pratique : Page responsive complète

Créons une landing page responsive de A à Z.

<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Design Responsive - Landing Page</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <!-- Header avec navigation responsive -->
  <header class="header">
    <div class="container">
      <div class="header-content">
        <a href="/" class="logo">DesignPro</a>

        <button class="menu-toggle" aria-label="Menu" aria-expanded="false">
          <span class="hamburger"></span>
        </button>

        <nav class="nav">
          <ul class="nav-list">
- <a href="#services">Services</a>
- <a href="#portfolio">Portfolio</a>
- <a href="#pricing">Tarifs</a>
- <a href="#contact" class="nav-cta">Contact</a>
        </nav>
      </div>
    </div>
  </header>

  <!-- Hero Section -->
  <section class="hero">
    <div class="container">
      <div class="hero-grid">
        <div class="hero-content">
          <h1 class="hero-title">
            Créez des designs <span class="highlight">inoubliables</span>
          </h1>
          <p class="hero-subtitle">
            Transformez vos idées en interfaces web modernes, responsive et accessibles.
            Des designs qui convertissent et enchantent vos utilisateurs.
          </p>
          <div class="hero-actions">
            <a href="#demo" class="button button-primary">Démo gratuite</a>
            <a href="#learn" class="button button-secondary">En savoir plus</a>
          </div>

          <!-- Stats (cachées sur mobile) -->
          <div class="hero-stats hide-mobile">
            <div class="stat">
              **500+**
              <span>Clients satisfaits</span>
            </div>
            <div class="stat">
              **98%**
              <span>Taux de satisfaction</span>
            </div>
            <div class="stat">
              **24/7**
              <span>Support disponible</span>
            </div>
          </div>
        </div>

        <div class="hero-visual">
          <picture>
            <source media="(min-width: 1024px)" srcset="hero-desktop.jpg">
            <source media="(min-width: 768px)" srcset="hero-tablet.jpg">
            <img src="hero-mobile.jpg" alt="Design illustration" class="hero-image">
          </picture>
        </div>
      </div>
    </div>
  </section>

  <!-- Features Section -->
  <section class="features" id="services">
    <div class="container">
      <h2 class="section-title">Nos services</h2>
      <p class="section-subtitle">
        Des solutions complètes pour tous vos besoins en design web
      </p>

      <div class="features-grid">
        <div class="feature-card">
          <div class="feature-icon">🎨</div>
          <h3 class="feature-title">Design UI/UX</h3>
          <p class="feature-description">
            Interfaces intuitives centrées sur l'expérience utilisateur.
          </p>
        </div>

        <div class="feature-card">
          <div class="feature-icon">📱</div>
          <h3 class="feature-title">Responsive Design</h3>
          <p class="feature-description">
            Sites parfaitement adaptés à tous les appareils.
          </p>
        </div>

        <div class="feature-card">
          <div class="feature-icon">⚡</div>
          <h3 class="feature-title">Performance</h3>
          <p class="feature-description">
            Optimisation pour des temps de chargement ultra-rapides.
          </p>
        </div>

        <div class="feature-card">
          <div class="feature-icon">♿</div>
          <h3 class="feature-title">Accessibilité</h3>
          <p class="feature-description">
            Conformité WCAG pour une expérience inclusive.
          </p>
        </div>
      </div>
    </div>
  </section>

  <!-- CTA Section -->
  <section class="cta">
    <div class="container">
      <div class="cta-content">
        <h2 class="cta-title">Prêt à transformer votre présence en ligne ?</h2>
        <p class="cta-subtitle">
          Rejoignez plus de 500 clients satisfaits et démarquez-vous de la concurrence.
        </p>
        <a href="#contact" class="button button-large">Démarrer maintenant</a>
      </div>
    </div>
  </section>

  <!-- Footer -->
  <footer class="footer">
    <div class="container">
      <div class="footer-grid">
        <div class="footer-col">
          #### DesignPro
          <p>Créer des expériences web exceptionnelles depuis 2020.</p>
        </div>

        <div class="footer-col">
          #### Services
- <a href="#">Design UI/UX</a>
- <a href="#">Développement</a>
- <a href="#">Consulting</a>
        </div>

        <div class="footer-col">
          #### Contact
- <a href="mailto:contact@designpro.be">contact@designpro.be</a>
- <a href="tel:+33123456789">01 23 45 67 89</a>
        </div>
      </div>

      <div class="footer-bottom">
        <p>&copy; 2024 DesignPro. Tous droits réservés.</p>
      </div>
    </div>
  </footer>

  <script src="script.js"></script>
</body>
</html>
/* styles.css - Mobile First Responsive */

/* Reset et configuration de base */
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

:root {
  /* Couleurs */
  --color-primary: #2563eb;
  --color-primary-dark: #1d4ed8;
  --color-text: #1f2937;
  --color-text-light: #6b7280;
  --color-bg: #ffffff;
  --color-bg-secondary: #f9fafb;
  --color-border: #e5e7eb;

  /* Espacements (mobile) */
  --space-xs: 0.5rem;
  --space-sm: 1rem;
  --space-md: 1.5rem;
  --space-lg: 2rem;
  --space-xl: 3rem;
  --space-2xl: 4rem;

  /* Typographie fluide */
  --font-base: clamp(1rem, 0.9rem + 0.5vw, 1.125rem);
  --font-lg: clamp(1.125rem, 1rem + 0.625vw, 1.375rem);
  --font-xl: clamp(1.25rem, 1.1rem + 0.75vw, 1.75rem);
  --font-2xl: clamp(1.75rem, 1.3rem + 2vw, 2.5rem);
  --font-3xl: clamp(2.25rem, 1.5rem + 3.5vw, 4rem);
}

body {
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
  font-size: var(--font-base);
  line-height: 1.6;
  color: var(--color-text);
  background: var(--color-bg);
}

.container {
  width: 100%;
  max-width: 1280px;
  margin: 0 auto;
  padding: 0 var(--space-sm);
}

/* HEADER - Navigation responsive */
.header {
  background: var(--color-bg);
  border-bottom: 1px solid var(--color-border);
  padding: var(--space-sm) 0;
  position: sticky;
  top: 0;
  z-index: 100;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}

.header-content {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.logo {
  font-size: 1.5rem;
  font-weight: 700;
  color: var(--color-primary);
  text-decoration: none;
}

/* Menu hamburger (mobile) */
.menu-toggle {
  display: flex;
  width: 40px;
  height: 40px;
  background: none;
  border: none;
  cursor: pointer;
  z-index: 101;
}

.hamburger {
  width: 24px;
  height: 2px;
  background: var(--color-text);
  position: relative;
  transition: background 0.3s ease;
}

.hamburger::before,
.hamburger::after {
  content: '';
  position: absolute;
  width: 24px;
  height: 2px;
  background: var(--color-text);
  transition: transform 0.3s ease;
}

.hamburger::before { top: -8px; }
.hamburger::after { bottom: -8px; }

.menu-toggle[aria-expanded="true"] .hamburger {
  background: transparent;
}

.menu-toggle[aria-expanded="true"] .hamburger::before {
  transform: rotate(45deg);
  top: 0;
}

.menu-toggle[aria-expanded="true"] .hamburger::after {
  transform: rotate(-45deg);
  bottom: 0;
}

/* Navigation mobile */
.nav {
  position: fixed;
  top: 0;
  right: -100%;
  width: 80%;
  max-width: 300px;
  height: 100vh;
  background: var(--color-bg);
  box-shadow: -2px 0 8px rgba(0, 0, 0, 0.1);
  transition: right 0.3s ease;
  padding: 5rem 2rem 2rem;
  overflow-y: auto;
}

.nav.is-open {
  right: 0;
}

.nav-list {
  list-style: none;
}

.nav-list li {
  margin-bottom: var(--space-sm);
}

.nav-list a {
  display: block;
  padding: var(--space-xs) var(--space-sm);
  color: var(--color-text);
  text-decoration: none;
  font-weight: 500;
  border-radius: 0.375rem;
  transition: background 0.2s ease;
}

.nav-list a:hover {
  background: var(--color-bg-secondary);
  color: var(--color-primary);
}

.nav-cta {
  background: var(--color-primary);
  color: #ffffff !important;
  margin-top: var(--space-md);
}

.nav-cta:hover {
  background: var(--color-primary-dark) !important;
}

/* HERO SECTION */
.hero {
  padding: var(--space-xl) 0;
  background: linear-gradient(135deg, #eff6ff 0%, #ffffff 100%);
}

.hero-grid {
  display: grid;
  gap: var(--space-lg);
}

.hero-title {
  font-size: var(--font-3xl);
  font-weight: 900;
  line-height: 1.1;
  margin-bottom: var(--space-md);
  color: var(--color-text);
}

.highlight {
  background: linear-gradient(135deg, var(--color-primary) 0%, #7c3aed 100%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}

.hero-subtitle {
  font-size: var(--font-lg);
  color: var(--color-text-light);
  margin-bottom: var(--space-lg);
  line-height: 1.6;
}

.hero-actions {
  display: flex;
  flex-direction: column;
  gap: var(--space-sm);
  margin-bottom: var(--space-lg);
}

.button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 1rem 1.75rem;
  font-weight: 600;
  text-decoration: none;
  border-radius: 0.5rem;
  transition: all 0.3s ease;
  text-align: center;
}

.button-primary {
  background: var(--color-primary);
  color: #ffffff;
  box-shadow: 0 4px 12px rgba(37, 99, 235, 0.3);
}

.button-primary:hover {
  background: var(--color-primary-dark);
  transform: translateY(-2px);
  box-shadow: 0 6px 16px rgba(37, 99, 235, 0.4);
}

.button-secondary {
  background: transparent;
  color: var(--color-primary);
  border: 2px solid var(--color-primary);
}

.button-secondary:hover {
  background: var(--color-primary);
  color: #ffffff;
}

.hero-stats {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-md);
  padding-top: var(--space-lg);
  border-top: 1px solid var(--color-border);
}

.stat {
  text-align: center;
}

.stat strong {
  display: block;
  font-size: var(--font-2xl);
  color: var(--color-primary);
  margin-bottom: 0.25rem;
}

.stat span {
  font-size: 0.875rem;
  color: var(--color-text-light);
}

.hero-image {
  width: 100%;
  height: auto;
  border-radius: 0.75rem;
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
}

/* FEATURES SECTION */
.features {
  padding: var(--space-2xl) 0;
}

.section-title {
  font-size: var(--font-2xl);
  font-weight: 700;
  text-align: center;
  margin-bottom: var(--space-sm);
}

.section-subtitle {
  text-align: center;
  color: var(--color-text-light);
  margin-bottom: var(--space-xl);
  max-width: 600px;
  margin-left: auto;
  margin-right: auto;
}

.features-grid {
  display: grid;
  gap: var(--space-md);
}

.feature-card {
  background: var(--color-bg);
  padding: var(--space-lg);
  border-radius: 0.75rem;
  border: 1px solid var(--color-border);
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.feature-card:hover {
  transform: translateY(-4px);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
}

.feature-icon {
  font-size: 2.5rem;
  margin-bottom: var(--space-sm);
}

.feature-title {
  font-size: var(--font-xl);
  font-weight: 700;
  margin-bottom: var(--space-xs);
}

.feature-description {
  color: var(--color-text-light);
  line-height: 1.6;
}

/* CTA SECTION */
.cta {
  padding: var(--space-2xl) 0;
  background: linear-gradient(135deg, var(--color-primary) 0%, #7c3aed 100%);
  color: #ffffff;
}

.cta-content {
  text-align: center;
}

.cta-title {
  font-size: var(--font-2xl);
  font-weight: 700;
  margin-bottom: var(--space-sm);
}

.cta-subtitle {
  font-size: var(--font-lg);
  opacity: 0.9;
  margin-bottom: var(--space-lg);
  max-width: 600px;
  margin-left: auto;
  margin-right: auto;
}

.button-large {
  padding: 1.25rem 2.5rem;
  font-size: var(--font-lg);
  background: #ffffff;
  color: var(--color-primary);
}

.button-large:hover {
  transform: scale(1.05);
  box-shadow: 0 8px 20px rgba(255, 255, 255, 0.3);
}

/* FOOTER */
.footer {
  background: var(--color-text);
  color: #ffffff;
  padding: var(--space-xl) 0 var(--space-md);
}

.footer-grid {
  display: grid;
  gap: var(--space-lg);
  margin-bottom: var(--space-lg);
}

.footer-col h4 {
  margin-bottom: var(--space-sm);
  font-size: var(--font-lg);
}

.footer-col p {
  color: #9ca3af;
  line-height: 1.6;
}

.footer-col ul {
  list-style: none;
}

.footer-col li {
  margin-bottom: 0.5rem;
}

.footer-col a {
  color: #d1d5db;
  text-decoration: none;
  transition: color 0.2s ease;
}

.footer-col a:hover {
  color: #ffffff;
}

.footer-bottom {
  padding-top: var(--space-md);
  border-top: 1px solid #374151;
  text-align: center;
  color: #9ca3af;
  font-size: 0.875rem;
}

/* Masquer éléments sur mobile */
.hide-mobile {
  display: none;
}

/* TABLETTE : 768px+ */
@media (min-width: 768px) {
  :root {
    --space-md: 2rem;
    --space-lg: 3rem;
    --space-xl: 4rem;
    --space-2xl: 6rem;
  }

  .container {
    padding: 0 var(--space-md);
  }

  /* Menu horizontal */
  .menu-toggle {
    display: none;
  }

  .nav {
    position: static;
    width: auto;
    max-width: none;
    height: auto;
    background: none;
    box-shadow: none;
    padding: 0;
    overflow: visible;
  }

  .nav-list {
    display: flex;
    gap: 0.5rem;
  }

  .nav-list li {
    margin-bottom: 0;
  }

  .nav-cta {
    margin-top: 0;
  }

  /* Hero en 2 colonnes */
  .hero-grid {
    grid-template-columns: 1fr 1fr;
    align-items: center;
    gap: var(--space-xl);
  }

  .hero-actions {
    flex-direction: row;
  }

  .hide-mobile {
    display: block;
  }

  /* Features en 2 colonnes */
  .features-grid {
    grid-template-columns: repeat(2, 1fr);
    gap: var(--space-lg);
  }

  /* Footer en 3 colonnes */
  .footer-grid {
    grid-template-columns: 2fr 1fr 1fr;
  }
}

/* DESKTOP : 1024px+ */
@media (min-width: 1024px) {
  .hero-grid {
    grid-template-columns: 1.2fr 1fr;
  }

  /* Features en 4 colonnes */
  .features-grid {
    grid-template-columns: repeat(4, 1fr);
  }
}

/* LARGE DESKTOP : 1280px+ */
@media (min-width: 1280px) {
  :root {
    --space-xl: 5rem;
    --space-2xl: 8rem;
  }
}

/* Préférence mouvement réduit (accessibilité) */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}
// script.js - Menu mobile
const menuToggle = document.querySelector('.menu-toggle');
const nav = document.querySelector('.nav');
const body = document.body;

menuToggle.addEventListener('click', () => {
  const isOpen = menuToggle.getAttribute('aria-expanded') === 'true';

  menuToggle.setAttribute('aria-expanded', !isOpen);
  nav.classList.toggle('is-open');

  // Empêcher le scroll quand le menu est ouvert
  body.style.overflow = isOpen ? '' : 'hidden';
});

// Fermer le menu en cliquant sur un lien
const navLinks = document.querySelectorAll('.nav-list a');
navLinks.forEach(link => {
  link.addEventListener('click', () => {
    menuToggle.setAttribute('aria-expanded', 'false');
    nav.classList.remove('is-open');
    body.style.overflow = '';
  });
});

// Fermer le menu avec Escape
document.addEventListener('keydown', (e) => {
  if (e.key === 'Escape' && nav.classList.contains('is-open')) {
    menuToggle.setAttribute('aria-expanded', 'false');
    nav.classList.remove('is-open');
    body.style.overflow = '';
  }
});

Tests et debugging responsive

Outils de développement

/* Helper pour visualiser les breakpoints en développement */
body::before {
  content: 'Mobile: < 640px';
  position: fixed;
  bottom: 0;
  right: 0;
  background: #ef4444;
  color: #ffffff;
  padding: 0.5rem 1rem;
  font-size: 0.75rem;
  font-weight: 700;
  z-index: 9999;
  border-top-left-radius: 0.375rem;
}

@media (min-width: 640px) {
  body::before {
    content: 'Tablet: ≥ 640px';
    background: #f59e0b;
  }
}

@media (min-width: 768px) {
  body::before {
    content: 'Tablet: ≥ 768px';
    background: #10b981;
  }
}

@media (min-width: 1024px) {
  body::before {
    content: 'Desktop: ≥ 1024px';
    background: #3b82f6;
  }
}

@media (min-width: 1280px) {
  body::before {
    content: 'Large: ≥ 1280px';
    background: #8b5cf6;
  }
}

/* Retirer en production */

Checklist de tests

  • [ ] iPhone SE (375px) – Petit mobile
  • [ ] iPhone 12/13/14 (390px) – Mobile standard
  • [ ] iPhone 12/13/14 Pro Max (428px) – Grand mobile
  • [ ] iPad Mini (768px) – Petite tablette
  • [ ] iPad Air (820px) – Tablette standard
  • [ ] iPad Pro (1024px) – Grande tablette
  • [ ] Desktop 1280px – Standard
  • [ ] Desktop 1920px – Full HD
  • [ ] Desktop 2560px – 2K
  • Outils recommandés

  • Chrome DevTools – Device Mode (Ctrl+Shift+M)
  • Firefox Responsive Design Mode (Ctrl+Shift+M)
  • Responsively App – Tester plusieurs tailles simultanément
  • BrowserStack – Tests sur vrais appareils
  • Am I Responsive – Aperçu rapide multi-écrans
  • Erreurs courantes à éviter

    1. Oublier la meta viewport

    <!-- SANS CECI, VOTRE SITE NE SERA PAS RESPONSIVE -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    

    2. Utiliser des largeurs fixes

    /* MAL */
    .container {
      width: 1200px;
    }
    
    /* BIEN */
    .container {
      max-width: 1200px;
      width: 100%;
      padding: 0 1rem;
    }
    

    3. Ignorer les orientations

    /* Adapter le design en mode paysage mobile */
    @media (max-height: 500px) and (orientation: landscape) {
      .hero {
        padding: 2rem 0;  /* Réduire padding vertical */
      }
    
      .hero-title {
        font-size: 2rem;  /* Réduire titre */
      }
    }
    

    4. Tester uniquement sur desktop

    Testez TOUJOURS sur de vrais appareils mobiles, pas seulement en mode device.

    5. Négliger la performance mobile

    <!-- Images responsive pour économiser la bande passante -->
    <img
      srcset="image-320w.jpg 320w,
              image-640w.jpg 640w,
              image-960w.jpg 960w,
              image-1280w.jpg 1280w"
      sizes="(max-width: 640px) 100vw,
             (max-width: 1024px) 50vw,
             33vw"
      src="image-640w.jpg"
      alt="Description"
    >
    

    Conclusion

    Le design responsive mobile-first est devenu la norme de l’industrie. En commençant par mobile et en ajoutant progressivement des fonctionnalités pour les écrans plus grands, vous créez des expériences optimales pour tous vos utilisateurs.

    Points clés à retenir :

  • Toujours inclure la meta viewport
  • Approche mobile-first (min-width dans media queries)
  • Utiliser des unités relatives (rem, %, vw) plutôt que pixels fixes
  • Breakpoints standards : 640px, 768px, 1024px, 1280px
  • Tester sur de vrais appareils, pas seulement en émulation
  • Performance mobile critique (images optimisées, CSS minimal)
  • Prochaines étapes :

  • Créez votre premier site responsive de A à Z
  • Testez sur minimum 5 tailles d’écran différentes
  • Analysez des sites responsive que vous admirez
  • Maîtrisez CSS Grid et Flexbox pour des layouts flexibles
  • Apprenez les techniques d’optimisation d’images responsive
  • Le responsive design demande de la pratique, mais une fois maîtrisé, il devient une seconde nature. Chaque projet vous rendra plus efficace !


    Ressources complémentaires :

  • MDN Web Docs – Responsive Design
  • Google Web Fundamentals – Responsive
  • Responsively App – Outil de test gratuit
  • Can I Use – Compatibilité navigateurs
  • À propos de l'auteur

    Pascal

    Pascal — SRE & Observability Engineer. J'applique les pratiques SRE (SLI/SLO, alerting, observabilité) à mon homelab Proxmox, avec les mêmes exigences qu'en production.

    Une remarque, un retour ?

    Cet article est vivant - corrections, contre-arguments et retours de production sont les bienvenus. Trois canaux, choisis celui qui te convient.

    Laisser un commentaire