Fermer

avril 14, 2021

Problèmes de débordement dans CSS


À propos de l'auteur

Ahmad Shadeed est un concepteur UX et développeur front-end de Palestine. Il aime travailler sur des projets de conception et de développement frontaux exigeants. Il a écrit un…
En savoir plus sur
Ahmad

Dans cet article, nous explorerons les causes des problèmes de débordement et comment les résoudre. Nous explorerons également comment les fonctionnalités modernes des outils de développement (DevTools) peuvent faciliter le processus de correction et de débogage.

Si vous êtes un développeur frontal, vous avez peut-être rencontré des problèmes de barre de défilement horizontale, en particulier sur mobile. Parce qu'il existe de nombreuses causes de problèmes de barre de défilement, il n'y a pas de solution simple. Certains problèmes peuvent être résolus rapidement, et certains nécessitent un peu de compétences de débogage.

Qu'est-ce qu'un problème de débordement?

Avant de discuter des problèmes de débordement, nous devons vérifier de quoi il s'agit. Un problème de débordement se produit lorsqu'une barre de défilement horizontale apparaît involontairement sur une page Web, permettant à l'utilisateur de faire défiler horizontalement. Cela peut être causé par différents facteurs.

 Exemple filaire d'un site Web avec six cases affichées comme espaces réservés pour du texte ou des images
( Large preview )

Cela pourrait se produire en raison d'une largeur inattendue contenu ou un élément de largeur fixe plus large que la fenêtre. Nous allons explorer toutes les causes dans cet article.

Comment repérer le débordement

Une partie importante de la résolution de ce problème est de le remarquer en premier lieu. Si nous savons quand et où cela se produit, nous pouvons nous concentrer sur cette partie d'une page Web. Il existe différentes manières de détecter un débordement, en faisant défiler manuellement vers la gauche ou la droite ou en utilisant JavaScript.

Explorons les moyens de détecter un débordement.

Défilement vers la gauche ou la droite

La première façon de découvrir un problème de débordement est en faisant défiler la page horizontalement. Si vous pouvez faire défiler, ceci est un avertissement que quelque chose ne va pas avec la page.

 Un exemple de page Web pouvant faire défiler horizontalement son contenu
( Grand aperçu )

Utilisation de JavaScript pour trouver des éléments plus larges que le corps

Nous pouvons ajouter un extrait à la console du navigateur pour afficher tous les éléments plus larges que le corps. Ceci est pratique pour les pages contenant de nombreux éléments.

 var docWidth = document.documentElement.offsetWidth;

[] .pourChaque.Appel (
  document.querySelectorAll ('*'),
  function (el) {
    if (el.offsetWidth> docWidth) {
      console.log (el);
    }
  }
);

CSS Outline to the Rescue

L'application du contour CSS à tous les éléments de la page nous donne un indice sur les éléments qui vont au-delà du corps de la page .

 * {
    contour: rouge uni 1px;
}
 Le même exemple montrant avec un élément représenté en dehors de la fenêtre
( Grand aperçu )

Encore mieux, Addy Osmani a un script qui ajoute un contour à chaque élément de la page avec une couleur aléatoire.

[] .forEach.call ($$ ("*"), function (a) {a.style.outline = "1px solid #" + (~~ (Math.random () * (1 

Étiquette de débordement dans Firefox

Firefox a une fonctionnalité utile qui vous indique quels éléments sont à l'origine du débordement. J'espère que d'autres navigateurs l'ajouteront!

 Le même exemple de wireframe expliqué à l'aide d'un fonctionnalité utile dans Firefox
( Grand aperçu )

Suppression d'éléments de page

Une autre méthode courante consiste à ouvrir les DevTools du navigateur et à commencer à supprimer les éléments un par un. Une fois le problème disparu, le la section que vous venez de supprimer en est probablement la cause. J'ai trouvé cette méthode utile dans les cas où vous avez identifié le problème mais que vous ne savez pas pourquoi il se produit. [19659013] Une fois que vous avez trouvé où se produit le débordement, il sera alors plus facile de créer un cas de test réduit pour un débogage plus poussé.

Problèmes courants de débordement

Éléments à largeur fixe

Les éléments de largeur fixe sont l'une des causes les plus courantes de débordement. D'une manière générale, ne fixez pas la largeur d'un élément qui devrait fonctionner à plusieurs tailles de fenêtre.

 .element {
    / * Ne faites pas cela * /
    largeur: 400px;
}
 Exemple de structure filaire mobile montrant des éléments de largeur fixe en dehors de la fenêtre
( Grand aperçu )

Utilisation de Flexbox sans emballage

Aussi utile que Flexbox est, ne pas autoriser les éléments à s'enrouler dans une nouvelle ligne quand aucun espace n'est disponible est risquée.

 .parent {
    affichage: flex;
}

Ici, les éléments flexibles peuvent provoquer un débordement horizontal au cas où l'espace ne serait pas suffisant pour tous les ranger sur une seule ligne:

 Eléments flexibles provoquant un débordement horizontal en apparaissant en dehors de la fenêtre
( Grand aperçu )

Assurez-vous d'utiliser flex-wrap: wrap lorsque le parent flex est censé fonctionner à différentes tailles de fenêtre.

 .parent {
    affichage: flex;
    / * Faites ceci * /
    flex-wrap: enveloppement;
}

CSS Grid

Lorsque vous utilisez la grille CSS, la conception de manière réactive est importante. Prenez la grille suivante:

 .wrapper {
    affichage: grille;
    grille-modèle-colonnes: 1fr 300px 1fr;
    écart de grille: 1rem;
}

L'exemple ci-dessus fonctionnera très bien à moins que la fenêtre ne soit plus étroite que 300 pixels. Si tel est le cas, un débordement se produira.

 Dépassement affiché alors que l'élément de la grille a une largeur de 300 pixels
( Grand aperçu )

Pour éviter un tel problème, n'utilisez la grille que lorsque cela est suffisant l'espace est disponible. Nous pouvons utiliser une requête multimédia CSS comme ceci:

 .wrapper {
    affichage: grille;
    grille-modèle-colonnes: 1fr;
    écart de grille: 1rem;
}

@media (largeur min: 400px) {
    .wrapper {
        grille-modèle-colonnes: 1fr 300px 1fr;
    }
}

Mots longs

Une autre raison courante de débordement est un mot long qui ne rentre pas dans la fenêtre. Cela se produit davantage sur mobile en raison de la largeur de la fenêtre.

 Un exemple d'utilisation de mots longs qui ne rentrent pas ou ne peuvent pas tenir dans la largeur de la fenêtre
( Grand aperçu )

Pour résoudre ce problème, nous devons utiliser la propriété overflow-wrap .

 .article-content p {
  overflow-wrap: mot de rupture;
}

J'ai écrit un article détaillé sur la gestion du contenu court et long avec CSS.

Cette correction est particulièrement utile avec le contenu généré par l'utilisateur. Un exemple parfait de ceci est un fil de commentaires. Un utilisateur peut coller une longue URL dans son commentaire, ce qui doit être géré avec la propriété overflow-wrap .

Taille minimale du contenu dans CSS Flexbox

Une autre cause intéressante de débordement est le contenu minimal taille dans Flexbox. Qu'est-ce que cela signifie?

 Un autre exemple d'utilisation de mots trop longs pour tenir dans
( Grand aperçu )

Selon la spécification :

«Par défaut, les éléments flexibles ne rétréciront pas en dessous de leur taille de contenu minimale (la longueur du mot le plus long ou de l'élément de taille fixe). Pour changer cela, définissez la propriété min-width ou min-height . »

Cela signifie qu'un élément flexible avec un mot long ne rétrécira pas en dessous de sa taille de contenu minimale .

Pour résoudre ce problème, nous pouvons soit utiliser une valeur overflow autre que visible ou nous pouvons définir min-width: 0 sur l'élément flex .

 .card__name {
    largeur min: 0;
    overflow-wrap: mot de rupture;
}
 Une comparaison avant et après ou une rupture de mots longs pour tenir sur la ligne suivante et rester dans la fenêtre
( Grand aperçu )

Taille minimale du contenu dans la grille CSS

As avec Flexbox, nous avons le même concept de taille de contenu minimale avec CSS Grid. Cependant, la solution est un peu différente. CSS-Tricks l'appelle « grid blowout ».

 Un exemple de grille éclatée dans laquelle le contenu ne rentre pas dans la taille ou la largeur donnée
( Large preview ])

Explorons le problème. Supposons que nous ayons un wrapper avec une section de côté et une section principale disposées avec une grille CSS.

 .wrapper {
    affichage: grille;
    grille-modèle-colonnes: 248px minmax (0, 1fr);
    écart de grille: 40px;
}

De plus, nous avons une section de défilement dans la section principale, pour laquelle j'ai utilisé flexbox.

 .section {
    affichage: flex;
    écart: 1rem;
    overflow-x: automatique;
}

Notez que je n’ai pas ajouté flex-wrap car je veux que les éléments flex soient sur la même ligne. Cependant, cela n'a pas fonctionné et cela provoque un débordement horizontal.

Pour résoudre ce problème, nous devons utiliser minmax () au lieu de 1fr . De cette façon, la taille minimale du contenu de l’élément principal ne sera pas auto .

 .wrapper {
  affichage: grille;
  grille-modèle-colonnes: 248px minmax (0, 1fr);
  écart de grille: 40px;
}

Marges négatives

Un élément positionné hors de l'écran peut provoquer un débordement. Généralement, c'est parce que l'élément a une marge négative.

Dans l'exemple suivant, nous avons un élément avec une marge négative et la langue du document est l'anglais (c'est-à-dire de gauche à droite).

 .element {
    position: absolue;
    à droite: -100px;
}
 Un élément positionné hors écran montré à droite
( Grand aperçu )

Fait intéressant, lorsque l'élément est positionné du côté opposé, il n'y a pas de débordement. Pourquoi?

 Un élément qui est positionné hors écran montré sur la gauche
( Grand aperçu )

J'ai rencontré ce problème récemment et a écrit à ce sujet . Il s'avère que ce comportement est intentionnel. Selon la spécification CSS :

«Les UA doivent découper la zone de débordement défilable des conteneurs de défilement sur les côtés de début de bloc et de début en ligne de la boîte (se comportant ainsi comme s'ils n'avaient pas de débordement de défilement sur

Pour un document anglais, le côté de début en ligne est le côté gauche donc tout élément positionné hors écran à gauche sera tronqué, et il n'y aura donc pas de débordement .

Si le positionnement d'un élément hors écran est vraiment nécessaire, assurez-vous d'appliquer overflow: hidden au parent pour éviter tout débordement.

Images sans max-width [19659015] Si vous ne vous occupez pas des grandes images à l'avance, vous verrez un débordement. Assurez-vous de définir max-width: 100% sur toutes les images.
 img {
    largeur max: 100%;
}

Unités de fenêtre

L'utilisation de 100vw a un inconvénient, c'est qu'il peut provoquer un débordement lorsque la barre de défilement est visible. Sous macOS, 100vw convient et ne provoque pas de défilement horizontal.

 Sous Mac OS avec barres de défilement masquées qui fonctionne bien
( Grand aperçu )

Sous Windows , les barres de défilement sont toujours visibles par défaut, donc un débordement se produira.

 Sous Windows, il y a un débordement horizontal lors du défilement
( Grand aperçu )

La raison en est qu'avec la valeur 100vw la largeur de la barre de défilement verticale du navigateur n'est pas connue. Par conséquent, la largeur sera égale à 100vw plus la largeur de la barre de défilement. Malheureusement, il n'y a pas de correctif CSS à cela.

 Un exemple de page avec une fenêtre d'affichage de 100vw et 14px à droite utilisée pour la barre de défilement
( Grand aperçu )

Cependant , nous pouvons utiliser JavaScript pour mesurer la largeur de la fenêtre sans la barre de défilement.

 function handleFullWidthSizing () {
  const scrollbarWidth = window.innerWidth - document.body.clientWidth

  document.querySelector ('myElement'). style.width = `calc (100vw - $ {scrollbarWidth} px)`
}

Annonces injectées

Les annonces injectées lors du chargement de la page peuvent provoquer un débordement si elles sont plus larges que leur parent. Ajoutez overflow-x: hidden à l'élément parent pour éviter cela.

 Fenêtre mobile avec un débordement causé par une annonce plus large que la fenêtre d'affichage
( Grand aperçu )

Revérifiez chaque annonce sur le site Web pour vous assurer qu'elle ne provoque pas de débordement.

L'application de overflow-x: hidden to body est-elle une bonne idée? [19659003] Opter pour overflow-x: hidden revient à mettre un pansement sans régler le problème. Si vous avez un débordement, il est préférable de résoudre le problème racine.

De plus, appliquer overflow-x: hidden à l'élément body n'est pas une bonne idée car position: sticky ne fonctionnera pas si un parent a overflow-x: hidden .

Comment éviter le débordement en CSS

Voici des éléments à vérifier pour réduire les problèmes de débordement en CSS. J'espère que vous le trouverez utile!

Test avec du contenu réel

Rien ne vaut le test avec du contenu réel sur un site Web. Ce faisant, vous vous assurez que la mise en page peut gérer différentes variétés de contenu.

Compte pour le contenu généré par l'utilisateur

Pour un composant tel qu'un fil de commentaires, tenez compte des cas dans lesquels l'utilisateur collera une longue URL ou saisira un mot long, comme expliqué ci-dessus.

Utilisez CSS Grid et Flexbox avec précaution

Aussi utiles que CSS grid et flexbox sont, ils peuvent facilement provoquer un débordement s'ils sont mal utilisés. Comme nous l'avons vu, ne pas utiliser flex-wrap: wrap peut provoquer un débordement, tout comme grid-template-columns: 1fr 350px lorsque l'écran est plus étroit que 350 pixels.

En outre Lecture sur SmashingMag:

 Smashing Editorial "width =" 35 "height =" 46 "loading =" lazy "decoding =" async (vf, il, al)




Source link