100vh sur mobile - dvh résout enfin le problème !

Xavier Moreau .

24 mars 2026

Comparaison de la hauteur d'écran avec 100vh, 100svh et 100dvh en CSS. Le premier téléphone montre une erreur avec 100vh.

L’unité dvh règle un vrai problème d’interface sur mobile : elle permet de dimensionner un élément en fonction de la hauteur réellement visible du viewport, au lieu de se baser sur une valeur trop théorique. Dans cet article, je vais montrer ce qu’elle mesure, pourquoi elle corrige les comportements pénibles de vh, quand l’utiliser, quand l’éviter, et comment l’intégrer proprement dans un front moderne.

Les points essentiels à retenir sur la hauteur dynamique

  • 1dvh représente 1 % de la hauteur du viewport dynamique.
  • 100dvh suit les changements de la barre d’adresse, des barres d’outils et du clavier virtuel.
  • vh se comporte encore comme lvh sur les navigateurs modernes, ce qui peut dépasser la zone visible.
  • svh sert à stabiliser l’interface, lvh à viser la hauteur maximale, dvh à coller à l’espace réellement affiché.
  • Pour un plein écran fiable, je privilégie souvent min-height plutôt que height.
  • Le bon choix dépend surtout de l’effet recherché : stabilité, couverture maximale ou adaptation en temps réel.

Pourquoi 100vh reste piégeux sur mobile

Sur desktop, 100vh donne souvent un résultat satisfaisant : l’élément remplit la fenêtre du navigateur, point final. Sur mobile, c’est une autre histoire, parce que la hauteur visible varie selon la présence de la barre d’adresse, des barres d’outils et, parfois, du clavier virtuel.

C’est exactement le cas classique mis en avant par web.dev : un bloc en 100vh peut être trop grand à l’ouverture de la page, puis devenir “juste” après un scroll quand l’interface du navigateur se replie. En clair, ce qui semble être un écran complet peut déborder, couper un bouton, ou créer un espace vide difficile à anticiper.

Comportement Effet visuel Risque concret
100vh sur mobile Calcule la hauteur sur une base souvent trop large Bloc coupé, contenu caché, scroll inutile
100dvh S’adapte à la hauteur visible en temps réel Peut provoquer un léger redimensionnement quand l’UI change

Le point clé, pour moi, est simple : si l’interface doit réellement vivre dans l’espace visible, 100vh n’est plus le bon réflexe par défaut. C’est là que la différence entre les unités de viewport devient décisive.

Ce que mesure réellement dvh

dvh signifie dynamic viewport height. Concrètement, 1dvh vaut 1 % de la hauteur du viewport dynamique, c’est-à-dire de la zone visible telle qu’elle est au moment du rendu. Si l’interface du navigateur change, la valeur suit.

Je trouve utile de le formuler ainsi : dvh ne mesure pas la hauteur “idéale” de l’écran, mais la hauteur effective disponible pour la page. C’est précisément ce qui le rend intéressant pour les écrans d’accueil, les modales, les panneaux latéraux sur mobile ou les zones qui doivent rester entièrement visibles.

Quand le viewport change vraiment

Le viewport dynamique n’est pas un concept abstrait. Il réagit aux barres de navigation qui apparaissent ou disparaissent, au passage en orientation paysage, et dans certains cas au clavier virtuel. Une interface qui semble figée sur papier peut donc changer de hauteur pendant la session, ce qui est normal.

Cette dynamique est utile, mais elle a un coût : si votre design dépend d’une hauteur exacte, vous devez accepter que l’élément se redimensionne pendant l’usage. Ce n’est pas un défaut de dvh, c’est la conséquence logique d’un choix orienté “visible maintenant”.

Ce que ça change pour la mise en page

En pratique, dvh devient pertinent dès qu’un bloc doit épouser l’écran visible sans le dépasser. J’évite simplement d’en faire une règle universelle, parce qu’un composant qui grandit et rétrécit en continu n’est pas toujours plus confortable qu’un composant légèrement plus stable.

Autrement dit, dvh est une solution de précision, pas un remplacement automatique de toutes les hauteurs en viewport. Pour choisir correctement, il faut comparer ses trois variantes de référence.

Choisir entre svh, lvh et dvh

Les nouvelles unités de viewport ont été créées pour couvrir trois besoins différents : la hauteur la plus petite, la plus grande et la hauteur dynamique. MDN rappelle d’ailleurs que vh se comporte désormais comme lvh dans les navigateurs modernes, ce qui explique pourquoi les anciens problèmes réapparaissent sur mobile dès qu’on cherche un plein écran strict.

Unité Ce qu’elle suit Je la privilégie quand Limite principale
svh La plus petite hauteur visible Je veux stabiliser l’interface et éviter les sauts Peut laisser de l’espace vide
lvh La plus grande hauteur possible Je vise une couverture maximale de l’écran Peut masquer du contenu quand les barres du navigateur sont visibles
dvh La hauteur dynamique réellement disponible Je veux coller à l’espace visible en temps réel Peut se recalculer pendant l’usage

Si je dois résumer brutalement : svh protège la stabilité, lvh favorise le plein écran maximal, et dvh sert l’adaptation immédiate. Ce trio suffit déjà à couvrir la majorité des cas concrets, surtout sur les interfaces mobiles.

Les cas où dvh améliore vraiment l’interface

Je réserve dvh aux éléments où la hauteur visible est une contrainte UX réelle, pas juste un effet visuel. Les bons candidats sont assez faciles à reconnaître : tout ce qui doit rester lisible, interactif et cadré dans la fenêtre visible du navigateur.

Les sections d’accueil en plein écran

Pour une hero section, min-height: 100dvh fonctionne souvent mieux que height: 100vh. La section garde un aspect plein écran, mais elle s’ajuste si l’interface du navigateur occupe une partie de l’espace. C’est simple, net, et bien plus robuste sur mobile qu’une hauteur rigide.

.hero {
  min-height: 100dvh;
  display: grid;
  place-items: center;
}

Les modales, panneaux et feuilles mobiles

Pour une modale ou une bottom sheet, dvh aide à garder l’ensemble visible sans forcer l’utilisateur à scroller dans un conteneur trop grand. J’aime mieux associer cette approche à overflow-y: auto qu’à une hauteur fixe, parce qu’une modale trop haute devient vite pénible dès que le clavier apparaît.

.modal {
  max-height: 100dvh;
  overflow-y: auto;
}

Lire aussi : CSS Grid - Maîtrisez la grille pour des layouts parfaits

Les zones de lecture qui doivent rester accessibles

Dans certaines applications, une zone de contenu doit garder son équilibre même quand la barre d’adresse bouge. Pensez aux écrans de connexion, aux formulaires courts, aux assistants en étapes ou aux vues de chat. Dans ces cas, dvh réduit les surprises et évite qu’un bouton d’action se retrouve hors champ.

Le vrai bénéfice n’est pas seulement esthétique : il s’agit de réduire la friction au moment où l’utilisateur agit. Et dès qu’on parle d’action, les détails de mise en page deviennent plus importants que les effets visuels.

Les erreurs que je vois le plus souvent

Le problème avec une unité utile, c’est qu’on finit vite par l’appliquer partout. C’est rarement une bonne idée. Voici les erreurs que je croise le plus souvent en intégration front.

  • Utiliser height: 100dvh sur un bloc qui contient du contenu variable au lieu de min-height.
  • Oublier de prévoir le scroll interne sur une modale ou un panneau trop haut.
  • Remplacer tous les usages de vh sans vérifier si la stabilité visuelle n’était pas justement recherchée.
  • Ne pas tester le rendu avec la barre d’adresse visible, puis cachée, puis en rotation paysage.
  • Ignorer le clavier virtuel sur les formulaires, alors que c’est souvent là que l’interface se dégrade le plus.

Mon conseil est pragmatique : si l’élément doit grandir, utiliser min-height est souvent plus sûr que height. Si l’élément doit rester dans un cadre strict, alors il faut prévoir le débordement et l’interaction avec le scroll. C’est cette distinction qui évite la majorité des bugs visibles.

L’intégrer proprement sans casser l’existant

Quand je dois introduire cette unité dans un projet déjà en production, je privilégie une approche progressive. Le plus simple est de partir d’un fallback raisonnable, puis de surcharger avec dvh uniquement quand le navigateur le comprend.

.fullscreen-panel {
  min-height: 100vh;
}

@supports (height: 100dvh) {
  .fullscreen-panel {
    min-height: 100dvh;
  }
}

Ce pattern reste lisible, facile à maintenir, et compatible avec une base de code qui n’a pas été pensée autour des nouvelles unités de viewport. Je l’utilise volontiers quand je veux corriger une section précise sans rouvrir toute la mise en page.

Dans les cas plus sensibles, j’ajoute aussi une logique de contrainte plutôt qu’une hauteur absolue. Par exemple, un panneau peut combiner max-height: 100dvh avec du scroll interne et, si nécessaire, des espacements liés aux zones sûres de l’appareil. Cette approche est plus robuste qu’une hauteur figée qui casse dès que l’environnement change.

La règle à garder en tête est simple : plus l’interface dépend de la zone visible, plus le dimensionnement dynamique a du sens. Plus elle dépend du contenu, plus il faut éviter de l’enfermer dans une hauteur unique.

La règle pratique que j’applique avant de livrer

Avant de valider un écran, je me pose toujours la même question : est-ce que je veux que ce bloc suive l’espace visible, ou est-ce que je veux qu’il reste stable pendant la session ? Si la réponse est “suivre”, je pars sur dvh. Si la réponse est “rester stable”, je regarde plutôt svh ou une mise en page moins dépendante du viewport.

En pratique, j’utilise dvh pour les écrans d’accueil, les modales et les panneaux mobiles ; svh quand je veux éviter les sauts ; et lvh uniquement quand je cherche le plus grand écran possible sans me soucier des barres du navigateur. Ce choix simple me fait gagner du temps, parce qu’il colle à l’usage réel au lieu de suivre une logique purement théorique.

Si vous ne devez retenir qu’une chose, retenez celle-ci : la bonne unité n’est pas celle qui semble la plus moderne, c’est celle qui correspond à l’expérience que vous voulez vraiment offrir. Pour un plein écran mobile propre, dvh est souvent le meilleur point de départ, mais le rendu final dépend toujours du contexte, du contenu et du niveau de stabilité attendu.

Questions fréquentes

L'unité `dvh` (dynamic viewport height) représente 1 % de la hauteur visible actuelle du viewport. Elle s'adapte en temps réel aux changements de l'interface du navigateur (barre d'adresse, clavier virtuel), offrant une solution plus précise que `vh` sur mobile.
Sur mobile, `100vh` calcule la hauteur en fonction d'une valeur souvent trop large, ignorant les barres d'outils du navigateur. Cela peut entraîner un contenu coupé, un défilement inutile ou un espace vide, car la hauteur réelle disponible varie.
Utilisez `dvh` quand vous voulez que votre élément s'adapte précisément à l'espace visible en temps réel (ex: sections d'accueil, modales). `svh` est pour la stabilité maximale, et `lvh` pour la plus grande hauteur possible, même si elle cache du contenu.
Pour une intégration progressive, utilisez un fallback avec `vh` et surchargez avec `dvh` via une `@supports` query. Par exemple : `min-height: 100vh; @supports (height: 100dvh) { min-height: 100dvh; }`. Cela assure la compatibilité.
Évitez d'utiliser `height: 100dvh` sur du contenu variable (préférez `min-height`), d'oublier le scroll interne sur les modales, de remplacer tous les `vh` sans réflexion, et de ne pas tester avec le clavier virtuel ou les changements d'orientation.

Évaluer l'article

Moyenne: 0.0 / 5 · 0 évaluations

Tags

dvh css unité dvh css dvh vs vh problème 100vh mobile utiliser dvh en css
Autor Xavier Moreau
Xavier Moreau
Je m'appelle Xavier Moreau et je cumule 14 ans d'expérience dans le développement web, avec un accent particulier sur JavaScript, le backend, le NoSQL et la sécurité. Mon intérêt pour ces domaines a émergé dès mes débuts dans la programmation, où j'ai découvert la puissance des technologies web et leur capacité à transformer des idées en réalité. J'aime expliquer des concepts complexes de manière accessible, en aidant les lecteurs à naviguer dans les défis techniques qu'ils rencontrent. Au fil des ans, j'ai développé une expertise solide en vérifiant mes sources, en comparant les informations et en simplifiant des sujets parfois ardus. Je m'efforce toujours de fournir des contenus utiles, précis et à jour, en suivant les tendances du secteur et en organisant mes connaissances de manière claire. Mon objectif est d'accompagner les passionnés et les professionnels du développement web dans leur quête de compréhension et d'innovation.

Commentaires (0)

Ajouter un commentaire