Design Multi-écrans

CSS Responsive

Créez des interfaces qui s'adaptent parfaitement à tous les appareils. Mobile, tablette, desktop : une seule codebase, tous les écrans.

📱 Mobile First
🎯 Multi-Device
⚡ Performance

Pourquoi le Responsive Design ?

📱 Mobile

60% du traffic web

Contraintes :

  • • Écran petit (320px-480px)
  • • Navigation tactile
  • • Bande passante limitée
  • • Performance critique

Site Mobile

Contenu prioritaire

Menu ☰
Article Principal

📱 Tablette

20% du traffic

Spécificités :

  • • Écran moyen (768px-1024px)
  • • Portrait & Paysage
  • • Hybride tactile/clavier
  • • Expérience intermédiaire
768px - 1024px
Zone de transition
Layout hybride

💻 Desktop

20% du traffic

Avantages :

  • • Grand écran (1200px+)
  • • Navigation précise
  • • Multitâche possible
  • • Contenu riche
1200px+
Espace maximal
Layout complet

📱 Mobile First vs 💻 Desktop First

Mobile First (Recommandé)

/* Base : Mobile (320px+) */
.container {
  padding: 1rem;
  font-size: 16px;
}

/* Tablette (768px+) */
@media (min-width: 768px) {
  .container {
    padding: 2rem;
    font-size: 18px;
  }
}

/* Desktop (1200px+) */
@media (min-width: 1200px) {
  .container {
    padding: 3rem;
    font-size: 20px;
  }
}
✨ Avantages :
  • • Performance mobile optimisée
  • • Progressif enhancement
  • • Contenu prioritaire d'abord
  • • Meilleur SEO mobile

Desktop First (Dépassé)

/* Base : Desktop (1200px+) */
.container {
  padding: 3rem;
  font-size: 20px;
}

/* Tablette (max 1199px) */
@media (max-width: 1199px) {
  .container {
    padding: 2rem;
    font-size: 18px;
  }
}

/* Mobile (max 767px) */
@media (max-width: 767px) {
  .container {
    padding: 1rem;
    font-size: 16px;
  }
}
⚠️ Inconvénients :
  • • Surcharge mobile (CSS/images)
  • • Performance dégradée
  • • Approche "dégradante"
  • • Maintenance complexe

Media Queries - Le Cœur du Responsive

📏 Breakpoints Standards

Taille actuelle: 1200px (Desktop)

Header

Navigation complète

Contenu Principal

Article complet avec sidebar visible

Sidebar

Widgets et liens

/* Desktop par défaut */
.layout {
  display: flex;
  gap: 2rem;
}
📱 Mobile
320px - 767px
📱 Tablette
768px - 1023px
💻 Desktop
1024px - 1199px
🖥️ Large
1200px+

🎯 Types de Media Queries

Largeur (Width) :

/* Largeur minimale */
@media (min-width: 768px) { }

/* Largeur maximale */
@media (max-width: 767px) { }

/* Plage de largeur */
@media (min-width: 768px) and (max-width: 1023px) { }

Autres critères :

/* Orientation */
@media (orientation: landscape) { }
@media (orientation: portrait) { }

/* Résolution */
@media (-webkit-min-device-pixel-ratio: 2) { }

/* Préférence utilisateur */
@media (prefers-color-scheme: dark) { }

💡 Bonnes Pratiques Media Queries :

  • • Utilisez min-width pour mobile-first
  • • Organisez vos breakpoints par taille croissante
  • • Évitez trop de breakpoints (3-4 max)
  • • Testez sur de vrais appareils
  • • Considérez le contenu, pas les devices
  • • Utilisez em/rem pour les breakpoints

🧭 Navigation Responsive Interactive

Testez la navigation sur différentes tailles :

Techniques Responsives Avancées

📐 Unités Responsives

Types d'unités :

/* Unités relatives */
.container {
  width: 90%; /* Pourcentage */
  max-width: 1200px;
  padding: 2rem; /* Basé sur root */
  margin: 1em; /* Basé sur parent */
}

/* Unités viewport */
.hero {
  height: 100vh; /* Hauteur écran */
  width: 100vw; /* Largeur écran */
  font-size: 4vw; /* Proportionnel */
}

Comparaison visuelle :

width: 100% - S'adapte au parent
max-width: 300px - Limite maximale
padding: 2rem - Basé sur root font-size
font-size: 4vw - 4% de la largeur viewport
🎯 Guide d'usage :
  • % : Largeurs de containers
  • rem : Textes, espacements
  • em : Composants contextuels
  • vw/vh : Sections pleine largeur

🔧 Fonctions CSS Modernes

clamp()

/* Typographie fluide */
h1 {
  font-size: clamp(1.5rem, 4vw, 3rem);
}

/* Container adaptatif */
.container {
  width: clamp(300px, 90%, 1200px);
}

clamp(min, préféré, max)
Taille fluide avec limites

min() & max()

/* Largeur maximum */
.box {
  width: min(90%, 600px);
}

/* Hauteur minimum */
.card {
  height: max(200px, 20vh);
}

min() : Plus petite valeur
max() : Plus grande valeur

Container Queries

/* Conteneur queryable */
.sidebar {
  container-type: inline-size;
}

/* Query sur le container */
@container (min-width: 300px) {
  .card {
    display: flex;
  }
}

Queries basées sur le parent
(support récent navigateurs)

🔬 Démo clamp() Interactive :

Texte avec clamp()

Redimensionnez la fenêtre pour voir l'adaptation fluide

font-size: clamp(1.5rem, 4vw, 3rem);

🖼️ Images Responsives

Techniques d'adaptation :

/* Image fluide basique */
img {
  max-width: 100%;
  height: auto;
}

/* Picture element */
<picture>
  <source media="(min-width: 768px)"
    srcset="large.jpg">
  <img src="small.jpg" alt="Description">
</picture>

/* Object-fit pour conteneurs */
.image-container img {
  width: 100%;
  height: 200px;
  object-fit: cover;
}

Comparaison object-fit :

object-fit: cover

Remplit le conteneur, peut rogner

object-fit: contain

Image complète, peut laisser vide

⚡ Optimisations :
  • • Utilisez srcset pour différentes densités
  • loading="lazy" pour le lazy loading
  • WebP/AVIF avec fallbacks
  • object-fit pour contrôler l'affichage

Exemples Pratiques

🔲 Grille de Produits Responsive

/* Grille adaptative moderne */
.products-grid {
  display: grid;
  grid-template-columns:
    repeat(auto-fill, minmax(280px, 1fr));
  gap: clamp(1rem, 3vw, 2rem);
  padding: clamp(1rem, 4vw, 3rem);
}

.product-card {
  background: white;
  border-radius: 12px;
  padding: 1.5rem;
  box-shadow: 0 4px 6px rgba(0,0,0,0.1);
  transition: transform 0.2s ease;
}

.product-card:hover {
  transform: translateY(-4px);
}

Simulation responsive :

Produit 1

€29.99

Produit 2

€39.99

Produit 3

€19.99

Produit 4

€49.99

Auto-adaptation sans media queries !

🚀 Points forts :
  • auto-fill : Adaptation automatique
  • minmax(280px, 1fr) : Taille minimum garantie
  • clamp() : Espacements fluides
  • • Aucune media query nécessaire

📝 Formulaire Responsive

/* Layout de formulaire adaptatif */
.form-container {
  max-width: 600px;
  margin: 0 auto;
  padding: clamp(1rem, 4vw, 2rem);
}

.form-row {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1rem;
  margin-bottom: 1.5rem;
}

@media (min-width: 768px) {
  .form-row.two-cols {
    grid-template-columns: 1fr 1fr;
  }
}

.form-input {
  width: 100%;
  padding: 0.75rem;
  font-size: max(16px, 1rem); /* évite zoom mobile */
  border: 2px solid #e2e8f0;
  border-radius: 8px;
}

Aperçu adaptatif :

💡 Bonnes pratiques :
  • font-size: max(16px, 1rem) évite le zoom iOS
  • • Grid responsive pour organiser les champs
  • clamp() pour les espacements
  • • Labels et placeholders clairs

📊 Dashboard Multi-écrans

/* Dashboard avec Grid Areas */
.dashboard {
  display: grid;
  gap: 1rem;
  padding: 1rem;
  min-height: 100vh;
}

/* Mobile : Stack vertical */
.dashboard {
  grid-template-areas:
    "header"
    "stats"
    "chart"
    "sidebar";
}

/* Desktop : Layout complexe */
@media (min-width: 1024px) {
  .dashboard {
    grid-template-columns: 250px 1fr 300px;
    grid-template-rows: 60px 1fr;
    grid-template-areas:
      "sidebar header stats"
      "sidebar chart stats";
  }
}

Layouts adaptatifs :

📱 Mobile (Stack) :

HEADER
STATISTIQUES
GRAPHIQUE
SIDEBAR

💻 Desktop (Complexe) :

SIDEBAR
HEADER
STATS
GRAPHIQUE PRINCIPAL
🎯 Stratégie responsive :
  • Mobile : Stack vertical, contenu prioritaire
  • Desktop : Layout complexe, sidebar fixe
  • Grid Areas : Réorganisation sémantique
  • Performance : Lazy loading des widgets

Exercices Pratiques

🛍️ Exercice : Site E-commerce Responsive

🎯 Mission Complète :

Créez un site e-commerce complet qui s'adapte parfaitement à tous les appareils avec une expérience utilisateur optimisée.

📋 Fonctionnalités requises :

  • Header responsive : Logo + Navigation + Panier
  • Bannière hero avec CTA adaptatif
  • Grille produits : 4→3→2→1 colonnes
  • Filtres : Sidebar desktop, modal mobile
  • Cartes produits avec images responsives
  • Formulaire contact optimisé mobile
  • Footer avec colonnes adaptatives

🎨 Contraintes techniques :

  • • Mobile-first approach obligatoire
  • • Utiliser clamp() pour la typographie fluide
  • • Grid + Flexbox combinés
  • • Images avec srcset et lazy loading
  • • Performance : <95% Lighthouse mobile

🖼️ Wireframes Responsive :

📱 Mobile (320px-767px) :

Logo ☰ 🛒
HERO BANNER
Produit 1
Produit 2
Produit 3

💻 Desktop (1024px+) :

Logo
AccueilProduitsContact
🛒 Panier
HERO BANNER COMPLET
FILTRES
P1
P2
P3
P4

🚀 Template de Démarrage

<!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ShopResponsive - E-commerce Adaptatif</title> <style> /* Reset et base */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: system-ui, -apple-system, sans-serif; line-height: 1.6; color: #333; } /* Container responsive */ .container { width: min(90%, 1200px); margin: 0 auto; padding: 0 clamp(1rem, 4vw, 2rem); } /* Header responsive */ .header { background: white; box-shadow: 0 2px 10px rgba(0,0,0,0.1); position: sticky; top: 0; z-index: 100; } .nav { /* TODO: Flex layout pour header responsive */ display: flex; justify-content: space-between; align-items: center; padding: 1rem 0; } .nav-menu { /* TODO: Navigation qui se cache sur mobile */ display: none; } .hamburger { /* TODO: Menu hamburger pour mobile */ display: block; background: none; border: none; font-size: 1.5rem; cursor: pointer; } /* Hero section */ .hero { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; text-align: center; padding: clamp(3rem, 8vw, 6rem) 0; } .hero h1 { /* TODO: Typographie fluide avec clamp */ font-size: clamp(2rem, 5vw, 3.5rem); margin-bottom: 1rem; } .hero p { font-size: clamp(1rem, 2.5vw, 1.25rem); margin-bottom: 2rem; opacity: 0.9; } .cta-button { /* TODO: Bouton responsive */ display: inline-block; background: white; color: #667eea; padding: clamp(0.75rem, 2vw, 1rem) clamp(1.5rem, 4vw, 2rem); text-decoration: none; border-radius: 50px; font-weight: bold; transition: transform 0.2s ease; } /* Grille produits */ .products-section { padding: clamp(3rem, 6vw, 5rem) 0; } .products-grid { /* TODO: Grille adaptive sans media queries */ display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: clamp(1rem, 3vw, 2rem); margin-top: 2rem; } .product-card { background: white; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 6px rgba(0,0,0,0.1); transition: transform 0.2s ease; } .product-card:hover { transform: translateY(-4px); } .product-image { width: 100%; height: 200px; object-fit: cover; } .product-info { padding: 1.5rem; } /* Media Queries */ @media (min-width: 768px) { .nav-menu { display: flex; gap: 2rem; } .hamburger { display: none; } .hero { text-align: left; } /* TODO: Layout desktop avec sidebar filtres */ } @media (min-width: 1024px) { .main-layout { display: grid; grid-template-columns: 250px 1fr; gap: 2rem; } .filters-sidebar { background: #f8f9fa; padding: 2rem; border-radius: 12px; height: fit-content; position: sticky; top: 100px; } } /* Formulaire responsive */ .contact-form { max-width: 600px; margin: 0 auto; } .form-group { display: grid; gap: 1rem; margin-bottom: 1.5rem; } .form-group.two-cols { grid-template-columns: 1fr; } @media (min-width: 768px) { .form-group.two-cols { grid-template-columns: 1fr 1fr; } } .form-input { width: 100%; padding: 0.75rem; font-size: max(16px, 1rem); /* Évite le zoom iOS */ border: 2px solid #e2e8f0; border-radius: 8px; transition: border-color 0.2s ease; } .form-input:focus { outline: none; border-color: #667eea; } /* Footer responsive */ .footer { background: #1a1a1a; color: white; padding: clamp(2rem, 4vw, 3rem) 0; } .footer-content { display: grid; gap: 2rem; grid-template-columns: 1fr; } @media (min-width: 768px) { .footer-content { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); } } </style> </head> <body> <header class="header"> <div class="container"> <nav class="nav"> <div class="logo"> <h1>ShopResponsive</h1> </div> <div class="nav-menu"> <a href="#">Accueil</a> <a href="#products">Produits</a> <a href="#contact">Contact</a> </div> <div class="nav-actions"> <button class="hamburger">☰</button> <a href="#" class="cart">🛒 Panier (0)</a> </div> </nav> </div> </header> <section class="hero"> <div class="container"> <h1>Découvrez nos Produits</h1> <p>Une sélection unique de produits de qualité</p> <a href="#products" class="cta-button">Voir les Produits</a> </div> </section> <section id="products" class="products-section"> <div class="container"> <h2>Nos Produits</h2> <div class="main-layout"> <aside class="filters-sidebar"> <h3>Filtres</h3> <!-- TODO: Ajouter filtres --> </aside> <div class="products-grid"> <div class="product-card"> <img src="https://via.placeholder.com/300x200" alt="Produit" class="product-image" loading="lazy"> <div class="product-info"> <h3>Produit Exemple</h3> <p>Description du produit...</p> <div class="price">29,99 €</div> <button>Ajouter au Panier</button> </div> </div> <!-- TODO: Répéter pour plus de produits --> </div> </div> </div> </section> <footer class="footer"> <div class="container"> <div class="footer-content"> <div> <h4>ShopResponsive</h4> <p>Votre boutique en ligne de confiance</p> </div> <div> <h4>Liens Utiles</h4> <ul> <li><a href="#">À propos</a></li> <li><a href="#">Contact</a></li> </ul> </div> </div> </div> </footer> <script> // TODO: JavaScript pour menu mobile document.querySelector('.hamburger').addEventListener('click', function() { // Toggle menu mobile }); </script> </body> </html>

Maîtrisez le Responsive Design ! 📱💻

Vous avez maintenant toutes les clés pour créer des interfaces qui s'adaptent parfaitement à tous les appareils. Une seule codebase, une expérience parfaite partout !

📱 Mobile First

Commencez toujours par mobile, puis enrichissez

🔧 Fonctions CSS

clamp(), min(), max() pour des designs fluides

🎯 Test Réel

Testez sur de vrais appareils, pas seulement DevTools