Back

5 petits bugs du Web mobile (et comment les corriger)

5 petits bugs du Web mobile (et comment les corriger)

Vous avez testé votre mise en page à chaque breakpoint, votre grille responsive est impeccable, et tout fonctionne parfaitement dans Chrome DevTools. Puis vous ouvrez le site sur un véritable téléphone et quelque chose cloche légèrement, obstinément. Ce sont des « papercuts » du Web mobile — de petits bugs qui ne cassent pas la page mais dégradent discrètement l’expérience.

Voici cinq problèmes qui apparaissent régulièrement dans les projets réels, ainsi que les solutions modernes pour chacun.

Points clés à retenir

  • 100vh déborde sur les navigateurs mobiles avec l’interface dynamique du navigateur. Utilisez 100svh comme valeur par défaut stable, ou 100dvh pour les mises en page qui doivent se redimensionner lorsque l’interface du navigateur se masque et s’affiche.
  • Les éléments fixés en bas peuvent être masqués par les zones de sécurité de l’appareil. Ajoutez viewport-fit=cover et utilisez env(safe-area-inset-bottom) pour les garder visibles.
  • Safari iOS effectue un zoom automatique sur les champs de saisie dont la taille de police est inférieure à 16px. Définissez font-size: 16px ou plus sur tous les champs de formulaire au lieu de désactiver le zoom utilisateur.
  • Le chaînage de défilement propage les événements de scroll hors des modales. Appliquez overscroll-behavior: contain au conteneur défilable — aucun JavaScript requis.
  • Les zones tactiles trop petites provoquent des taps manqués ou mal dirigés. Visez des cibles tactiles d’environ 44×44px en utilisant le padding pour agrandir la zone de toucher.

1. Les mises en page pleine hauteur se cassent à cause de 100vh

Symptôme : Un hero plein écran ou une modale est légèrement trop haut sur Safari iOS, ce qui entraîne un découpage du contenu ou l’apparition d’une barre de défilement.

Pourquoi cela se produit : 100vh est calculé par rapport à la hauteur totale du viewport, en ignorant l’interface dynamique du navigateur (barre d’adresse et contrôles de navigation). Lorsque ces éléments sont visibles, 100vh déborde.

La solution : Utilisez les nouvelles unités de viewport CSS. Pour la plupart des mises en page pleine hauteur, 100svh (small viewport height) est un choix stable car il représente la zone visible avec l’interface du navigateur présente. Utilisez 100dvh lorsque vous souhaitez que la mise en page se redimensionne dynamiquement à mesure que l’interface du navigateur se masque et s’affiche. Le support navigateur moderne pour ces unités est largement disponible, comme indiqué sur https://webstatus.dev/features/viewport-unit-variants.

.hero {
  height: 100svh; /* stable default */
}

2. L’interface fixée en bas est masquée derrière les zones de sécurité de l’appareil

Symptôme : Un footer sticky, une barre de navigation inférieure ou un bouton d’action est partiellement masqué par l’indicateur d’accueil sur iPhone ou par d’autres zones de sécurité de l’appareil.

Pourquoi cela se produit : Les éléments fixes positionnés à bottom: 0 se placent au ras du bord du viewport, et non de la zone de sécurité de l’appareil. Sur les appareils dotés d’indicateurs d’accueil ou de coins arrondis, l’interface système peut chevaucher l’élément.

La solution : Ajoutez viewport-fit=cover à votre balise meta viewport, puis utilisez les variables d’environnement CSS pour les zones de sécurité telles que env(safe-area-inset-bottom) pour remonter l’élément.

<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
.bottom-nav {
  padding-bottom: env(safe-area-inset-bottom);
}

3. iOS effectue un zoom sur les champs de formulaire

Symptôme : Toucher un <input> sur Safari iOS provoque un zoom inattendu de la page, perturbant la mise en page.

Pourquoi cela se produit : Safari iOS effectue automatiquement un zoom lorsque la taille de police d’un champ de saisie est inférieure à 16px, le traitant comme une aide à la lisibilité.

La solution : Définissez font-size: 16px (ou plus) sur tous les inputs. Ne désactivez pas le zoom via user-scalable=no — cela nuit à l’accessibilité. Pendant que vous y êtes, utilisez inputmode pour demander le bon clavier, autocomplete pour réduire les frictions, et enterkeyhint pour étiqueter la touche de retour.

<input
  type="email"
  inputmode="email"
  autocomplete="email"
  enterkeyhint="done"
  style="font-size: 16px;"
/>

4. Le défilement fuit hors des modales et tiroirs

Symptôme : Lorsqu’un utilisateur fait défiler l’intérieur d’une modale ou d’un bottom sheet et atteint la fin, la page en arrière-plan commence également à défiler.

Pourquoi cela se produit : Il s’agit du chaînage de défilement (scroll chaining) — le navigateur propage les événements de scroll au parent lorsque le conteneur de défilement enfant atteint sa limite.

La solution : Appliquez overscroll-behavior: contain au conteneur défilable. Le support navigateur moderne est large, incluant Safari 16 et versions ultérieures, comme indiqué sur https://webstatus.dev/features/overscroll-behavior.

.modal-body {
  overflow-y: auto;
  overscroll-behavior: contain;
}

5. Les zones tactiles semblent peu réactives ou déclenchent le mauvais élément

Symptôme : Les boutons semblent lents, ou les taps s’enregistrent sur le mauvais élément — en particulier dans les interfaces denses comme les menus de navigation ou les listes.

Pourquoi cela se produit : Les cibles tactiles trop petites créent une ambiguïté dans la détection des touches. Les navigateurs modernes gèrent les événements de tap sans le délai historique de 300ms (tant que votre balise meta viewport est correcte), mais les cibles sous-dimensionnées provoquent toujours des taps manqués ou mal dirigés.

La solution : Visez des cibles tactiles d’environ la recommandation WCAG pour la taille des cibles d’environ 44×44 pixels CSS. Utilisez le padding plutôt que la margin pour agrandir la zone de toucher sans affecter la mise en page.

.nav-link {
  min-height: 44px;
  min-width: 44px;
  display: flex;
  align-items: center;
  padding: 0 12px;
}

Conclusion

Ces petits bugs du Web mobile apparaissent rarement de manière isolée — une mise en page qui se découpe, un bouton qui se cache, un formulaire qui zoome. Chacun est mineur en soi, mais ensemble ils signalent un site qui n’a pas vraiment été testé sur un appareil. Le CSS moderne vous offre des outils propres et basés sur des standards pour tous les résoudre. Appliquez ces corrections une fois et elles tiendront bon à mesure que les navigateurs évoluent.

FAQ

Oui. Les unités de viewport small, large et dynamic (svh, lvh, dvh) sont supportées dans tous les navigateurs modernes, y compris Safari sur iOS 15.4 et versions ultérieures, Chrome, Edge et Firefox. Pour les navigateurs plus anciens, vous pouvez fournir un fallback en déclarant height: 100vh avant la règle svh ou dvh. Le navigateur ignorera l'unité qu'il ne reconnaît pas et utilisera le fallback.

Oui, à partir de Safari 16. Sur les versions plus anciennes de Safari iOS, overscroll-behavior n'a aucun effet et le chaînage de défilement se produira toujours. Si vous devez supporter ces versions plus anciennes, une approche basée sur JavaScript qui empêche touchmove sur le body pendant que la modale est ouverte est le fallback le plus fiable.

Désactiver le zoom utilisateur supprime la possibilité de zoomer par pincement, qui est une fonctionnalité d'accessibilité importante pour les utilisateurs malvoyants. Cela viole également le critère de succès WCAG 1.4.4. La correction appropriée consiste à définir la taille de police sur les inputs à 16px ou plus, ce qui empêche le zoom automatique sans restreindre le zoom pour les utilisateurs qui en ont besoin.

Seuls les éléments qui se trouvent près des bords de l'écran ont besoin d'insets safe-area. Une barre de navigation fixée en bas ou un bouton d'action flottant près du bord inférieur bénéficiera de env(safe-area-inset-bottom). Les éléments positionnés loin des bords de l'écran ou centrés dans le viewport n'en ont généralement pas besoin. Testez toujours sur un appareil avec un indicateur d'accueil ou une encoche pour confirmer.

Truly understand users experience

See every user interaction, feel every frustration and track all hesitations with OpenReplay — the open-source digital experience platform. It can be self-hosted in minutes, giving you complete control over your customer data. . Check our GitHub repo and join the thousands of developers in our community..

OpenReplay