Propriétés de largeur / hauteur Min et Max en CSS

Traduction de " Min / Max Largeur / Hauteur en CSS " par Ahmad Shadid.

Parfois, les développeurs doivent limiter la largeur de l'élément par rapport au parent, et en même temps, le laisser dynamique. En fixant ainsi la taille initiale avec possibilité d'extension en présence d'espace disponible. Par exemple, nous avons besoin d'un bouton qui doit avoir une largeur minimale. C'est dans de telles situations qu'il est commode d'utiliser les propriétés de maximum et minimum.

Dans cet article, nous nous familiariserons avec les propriétés CSS du maximum et du minimum pour la largeur et la hauteur, et nous examinerons également en détail chacun d'eux et leurs cas d'utilisation.

Propriétés de largeur


Je voudrais commencer la discussion avec les propriétés liées à la largeur. Nous avons une min-width max-width, et une min-width max-width, et chacun d'eux est extrêmement important et utile dans certaines situations.

Largeur minimale (min-largeur)


La propriété min-width est destinée à empêcher la largeur de l'élément d'être réduite en dessous de la valeur spécifiée. La valeur par défaut est auto , qui peut aller jusqu'à 0 .

Pour le démontrer, regardons un exemple de base:



Il y a un bouton avec du texte, dont la taille peut varier d'un à plusieurs mots. Pour être sûr que ce bouton aura la largeur minimale autorisée, même s'il n'y a qu'un seul mot à l'intérieur, vous devez utiliser min-width . La largeur minimale a été fixée à 100 pixels, donc même si le bouton a un contenu très court, tel que le mot «Terminé» ou simplement une icône, il sera toujours assez grand pour rester visible. Ceci est particulièrement important lorsque vous travaillez avec des sites traduits dans différentes langues.

Prenons l'exemple de la langue arabe sur Twitter:



Dans l'exemple ci-dessus, le bouton contient le mot "تم", qui en arabe signifie "Terminer". En raison du contenu court, la largeur du bouton lui-même est devenue trop petite, j'ai donc défini le minimum en définissant la propriété min-width , qui peut être vue dans l'image de droite (dans la section «Après»).

Largeur et rembourrage minimum


Bien que la propriété min-width permette d'augmenter la largeur d'un bouton tout en augmentant la taille de son contenu, le padding doit toujours être défini sur les côtés pour garantir un retrait de ses bordures. La différence est illustrée dans la figure ci-dessous.



Largeur maximale (largeur maximale)


La propriété max-width est conçue pour empêcher l'élément de s'étendre au-delà de la valeur spécifiée. La valeur par défaut est none .

Un exemple simple et courant d'utilisation de max-width est de l'appliquer aux images. Considérez l'exemple ci-dessous:



Si nous appliquons la propriété max-width: 100% à l'image, elle restera dans les limites de l'élément parent, même si sa taille d'origine est plus grande. Si l'image est initialement plus petite que le parent, cette propriété ne l'affectera en aucune façon.

Utilisation de min-width et max-width




Si les deux propriétés s'appliquent à un élément, laquelle remplacera la valeur de l'autre? En d'autres termes, quelle propriété a la priorité la plus élevée?

Si la valeur de min-width supérieure à max-width , elle sera considérée comme la largeur de l'élément. Prenons l'exemple suivant:

HTML

 <div class="wrapper"> <div class="sub"></div> </div> 

CSS

 .sub { width: 100px; min-width: 50%; max-width: 100%; } 



La valeur de width initiale est 100px et en plus de cela, les propriétés min-width et max-width sont définies. Par conséquent, la largeur de cet élément ne dépassera pas 50% de la largeur du bloc parent


Propriétés de hauteur


En plus des propriétés de largeur minimale et maximale, il existe les mêmes propriétés pour la hauteur

Hauteur minimale (min-hauteur)


La min-height conçue pour empêcher l'élément de tomber en dessous de la valeur spécifiée. La valeur par défaut est auto , qui peut aller jusqu'à 0 .

Pour le démontrer, regardons un exemple simple.

Nous avons une section avec un contenu texte. Il est nécessaire qu'il soit beau avec de grandes et de petites quantités de texte



CSS

 .sub { display: flex; align-items: center; justify-content: center; padding: 1rem; min-height: 100px; color: #fff; background: #3c78dB; } 

La hauteur minimale est fixée à 100 pixels et le contenu est centré à l'aide de la flexbox horizontalement et verticalement. Que se passe-t-il s'il y a plus de contenu? Par exemple, il y aura un paragraphe entier



Oui, vous l'avez déjà deviné. La hauteur de la section augmentera pour accueillir plus de contenu. Avec cela, nous pouvons créer des composants flexibles qui répondent à la quantité de contenu.

Hauteur maximale (hauteur maximale)


La max-height conçue pour empêcher un élément d'augmenter sa hauteur au-delà d'une valeur spécifiée. La valeur par défaut est none .

Dans l'exemple suivant, j'ai défini la max-height pour le contenu. Mais comme il est plus grand que la zone spécifiée, un débordement se produit et le texte dépasse les limites de l'élément parent



Exemples d'utilisation des propriétés


Considérez quelques cas d'utilisation courants et rares pour les propriétés min-width , min-height , max-width et max-height .

Liste de balises


Il est recommandé d'indiquer la largeur minimale de chaque balise dans la liste des balises afin que leur apparence ne souffre pas en cas de contenu court.



Avec une telle flexibilité, une balise aura fière allure, peu importe la longueur de son contenu. Mais que se passe-t-il si l'auteur définit un très grand nom de balise et que le CMS (système de gestion de contenu) qu'il utilise n'a pas de limite sur le nombre de caractères de la balise? Dans cette situation, vous pouvez également utiliser max-width

CSS

 .c-tag { display: inline-block; min-width: 100px; max-width: 250px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; /*Other styles*/ } 

En utilisant max-width vous pouvez limiter la largeur maximale à une valeur spécifique. Cependant, l'application de cette propriété seule ne suffit pas. Le contenu dépassant la largeur maximale doit être tronqué.

https://codepen.io/shadeed/pen/320e42b7ad75c438a9e633417d737d16

Boutons


Il existe différents scénarios d'utilisation des propriétés minimum et maximum pour les boutons, car il existe également de nombreuses options pour les composants des boutons. Considérez la disposition suivante:



Veuillez noter que la largeur du bouton «Get» est trop petite. Si, pour une raison quelconque, le bouton n'a toujours pas de texte (mais seulement une icône), tout peut devenir encore pire. Dans ce cas, le réglage de la largeur minimale est très important

Remise à zéro de la largeur minimale pour Flexbox


La valeur par défaut de la propriété min-width est auto, qui est évaluée à zéro. Lorsqu'un élément est un élément flexible, la valeur de min-width ne devient pas nulle. La taille minimale d'un élément flexible est la taille de son contenu.

Selon le CSSWG :
Par défaut, les éléments flexibles ne deviennent pas plus petits que la taille minimale requise par leur contenu (la longueur du mot le plus long ou de l'élément de taille fixe). Pour changer cela, définissez la min-height min-width ou min-height .

Prenons l'exemple suivant:



Le nom d'utilisateur contient un mot très long qui provoque un débordement et un défilement horizontal. Bien que j'aie ajouté le CSS ci-dessous pour tronquer le contenu:

CSS

 .c-person__name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } 

Étant donné que l'en-tête est un élément flexible, la solution consiste à réinitialiser la valeur de largeur minimale et à la faire devenir nulle

CSS

 .c-person__name { /*Other styles*/ min-width: 0; } 

Voici à quoi cela devrait ressembler après la correction:



Il résulte de la description CSSWG que la définition de la propriété overflow sur une valeur autre que visible peut entraîner le calcul de la valeur de la largeur minimale comme zéro, ce qui résout également notre problème sans avoir à définir explicitement la min-width: 0 .


Zéro hauteur minimale pour Flexbox


Bien que ce soit un problème moins courant que la largeur minimale, il peut toujours se produire. Le problème vient des articles flexibles qui ne peuvent pas être plus courts que leur contenu. Par conséquent, la valeur min-height est définie égale à la taille du contenu.

Prenons l'exemple suivant:



Le texte en rouge doit être coupé par les bordures du conteneur. Mais comme cet élément est un élément flexible, sa min-height minimale est égale à la hauteur du contenu. Pour éviter cela, nous devons réinitialiser la valeur de hauteur minimale. Regardons le code HTML et CSS:

HTML

 <div class="c-panel"> <h2 class="c-panel__title"><!-- Title --></h2> <div class="c-panel__body"> <div class="c-panel__content"><!-- Content --></div> </div> </div> 

CSS

 .c-panel { display: flex; flex-direction: column; height: 180px; } .c-panel__body { min-height: 0; } .c-panel__content { overflow-y: scroll; height: 100%; } 

L'ajout d'un élément min-height: 0 réinitialise la valeur de la propriété et commence à fonctionner comme prévu
Démo



Utilisation de min-width et max-width en même temps


Parfois, il existe des situations où nous avons un élément avec une largeur minimale, mais en même temps, la largeur maximale n'est pas spécifiée. Cela peut conduire à l'élément devenir trop large, même si ce comportement n'était pas prévu. Prenons l'exemple suivant:



Étant donné que la largeur est définie en pixels, il n'est pas certain que ce qui précède fonctionnera pour mobile. Pour résoudre ce problème, nous pouvons utiliser des pourcentages au lieu de pixels pour les propriétés minimum et maximum. Considérez l'exemple ci-dessous:

J'ai ajouté le CSS suivant pour les images:

CSS

 img { min-width: 35%; max-width: 70%; } 





Conteneur de page


L'un des scénarios les plus utiles pour utiliser la propriété max-width consiste à encapsuler la page (ou le conteneur). En définissant la page à la largeur maximale, nous pouvons être sûrs qu'il sera pratique pour les utilisateurs de visualiser et de lire le contenu



Voici un exemple d'une enveloppe centrée avec un padding gauche et à droite

CSS

 .wrapper { max-width: 1170px; padding-left: 16px; padding-right: 16px; margin-left: auto; margin-right: auto; } 

Largeur maximale et unité de mesure "ch"




L'unité de mesure ch est égale à la largeur du caractère 0 (zéro) utilisé dans la police de l'élément courant. En l'utilisant dans la propriété max-width, nous pouvons ajuster le nombre de caractères dans une chaîne. Selon cet article de Smashing Magazine, la longueur de ligne recommandée est de 45 à 75 caractères.

Dans l'exemple précédent avec un élément wrapper, nous pourrions bénéficier de l'utilisation de ce symbole, car il s'agit d'un élément article

CSS

 .wrapper { max-width: 70ch; /* Other styles */ } 

Animer un élément de hauteur inconnue


Parfois, nous sommes confrontés au problème de l'animation d'un accordéon ou d'un menu mobile avec une hauteur de contenu inconnue. Dans ce cas, l'utilisation de max-height peut être une bonne solution.

Prenons l'exemple suivant:



Lorsque le bouton de menu est enfoncé, le menu lui-même devrait apparaître en douceur de haut en bas. Il est impossible de le faire sans JavaScript, sauf si l'élément a une hauteur fixe (et ce n'est pas recommandé). Cependant, cela est possible avec max-height. L'idée est d'ajouter une hauteur très élevée à l'élément, par exemple, max-height: 20rem , qui ne sera pas atteint, après quoi nous pouvons définir les étapes d'animation de max-height: 0 , à max-height: 20rem

CSS

 .c-nav { max-height: 0; overflow: hidden; transition: 0.3s linear; } .c-nav.is-active { max-height: 22rem; } 

Cliquez sur un hamburger pour voir l'animation en action


Hauteur minimale pour la section supérieure (héros)


Comme vous pouvez le voir, je n'aime pas donner aux éléments une hauteur fixe. Je pense que ce faisant, je vais à l'encontre du concept selon lequel les composants sur le Web devraient être flexibles. L'ajout d'une hauteur minimale pour la première section du site (la section «héros») est utile dans les situations où un contenu très volumineux est ajouté (cela se produit).

Prenons l'exemple suivant, où nous avons une section «héros» avec une hauteur fixe. Ça a l'air bien.



Cependant, lorsque le contenu augmente, il déborde du conteneur et dépasse le wrapper de section. C'est mauvais.



Pour éviter ce problème à l'avance, nous pouvons ajouter min-height au lieu de min-height . C'est exactement ce que nous faisons, au moins pour vider notre conscience. Même si cela peut être la raison d'un affichage de page plutôt étrange, je pense que de telles situations devraient être évitées en premier lieu, dans le système de gestion de contenu (CMS). Après cela, le problème est résolu et la page semble bonne:



Le problème du débordement de contenu n'est pas seulement qu'il peut être supérieur à la hauteur fixe du parent. Cela peut se produire en raison d'une diminution de la taille de l'écran et, par conséquent, d'une augmentation de la hauteur du contenu du texte en raison de la césure:



Si vous ne spécifiez pas une hauteur fixe, mais que vous la limitez uniquement au minimum en utilisant min-height , le problème décrit ci-dessus ne se produira pas du tout.

Fenêtre modale


Pour le composant de fenêtre modale, vous devez spécifier à la fois la largeur minimale et maximale, par conséquent, cela fonctionnera sur des écrans de toute taille (du mobile au bureau). Cela rappelle un article intéressant sur CSS-Tricks, qui dit quoi faire dans ce cas.

1 voie

 .c-modal__body { width: 600px; max-width: 100%; } 

2 voies

 .c-modal__body { width: 100%; max-width: 600px; } 

Quant à moi, je préfère la deuxième voie, car il me suffit de définir la max-width: 600px . Une fenêtre modale est un élément div , elle a donc déjà une largeur définie = 100% du parent, non?

Considérez l'exemple de fenêtre modale ci-dessous. Remarquez comment la largeur devient 100% de la largeur du parent s'il n'y a pas assez d'espace libre dans la fenêtre




Hauteur minimale et pied de page collant


Lorsque le contenu de la page n'est pas suffisamment volumineux, le pied de page ne devrait pas coller au bas. Regardons un exemple qui le démontre mieux:



Veuillez noter que le pied de page ne colle pas au bord inférieur de la fenêtre du navigateur. En effet, la hauteur du contenu est inférieure à la hauteur de la fenêtre du navigateur. Après avoir résolu ce problème, la page devrait ressembler à ceci:



Tout d'abord, j'ai fait de l'élément corps un conteneur flexible, puis je l'ai défini à une hauteur minimale de 100% de la fenêtre.

CSS

 body { display: flex; flex-direction: column; min-height: 100vh; } footer { margin-top: auto; } 

Je recommande de lire cet article sur les pieds de page collants.
Démo

Tailles d'élément proportionnelles et largeur / hauteur max.


Pour créer un conteneur proportionnel qui évolue en fonction de la taille de la fenêtre, un hack a été présenté une fois avec un rembourrage . Nous pouvons maintenant simuler un comportement similaire en combinant des unités de fenêtre et une largeur / hauteur maximale.

Sur la base des documents d'un article de Miriam Suzanne, je veux expliquer comment cela fonctionne.



Nous avons une image avec des dimensions de 644 x 1000 pixels. Nous devons faire ce qui suit:

  • Rapport height / width (hauteur divisée par la largeur)
  • Largeur du conteneur: peut être fixe ou dynamique (100%)
  • Définissez la height à 100% de la largeur de la fenêtre multipliée par le rapport hauteur / largeur
  • Définir une max-height égale à la largeur du conteneur multipliée par le rapport max-height largeur
  • Définir une max-width égale à la largeur du conteneur

CSS

 img { --ratio: 664 / 1000; --container-width: 30em; display: block; height: calc(100vw * var(--ratio)); max-height: calc(var(--container-width) * var(--ratio)); width: 100%; max-width: var(--container-width); } 




HTML / Body avec une hauteur de 100%


Et si nous voulons que l'élément de corps occupe 100% de la hauteur de la fenêtre? C'est une question courante à la fois dans la communauté Web dans son ensemble et sur le site StackOverflow en particulier.

Vous devez d'abord définir la height: 100% de l'élément html . Cela garantira que l'élément racine est à 100% élevé. Ajoutez ensuite min-height pour l'élément body . La raison pour laquelle min-height est utilisée est que cette propriété permet à la hauteur de l'élément body d'être dynamique et d'ajuster la taille du contenu.

CSS

 html { height: 100%; } body { min-height: 100%; } 

Démo

Remarques


Largeur minimale et éléments de bloc


Parfois, nous oublions que l'élément auquel nous essayons d'appliquer la min-width est un bloc. En fin de compte, cela peut être source de confusion et ne pas affecter l'élément. Assurez-vous que l'article n'est pas en bloc

Fonctions de comparaison CSS


En recherchant sur StackOverflow les principaux problèmes auxquels les développeurs sont confrontés, je suis tombé sur cette question dans laquelle l'auteur pose les questions suivantes:
Est-il possible de faire quelque chose comme ça? max-width: calc(max(500px, 100% - 80px)) ou peut-être c'est max-width: max(500px, calc(100% - 80px)))
Le comportement souhaité consiste à ne pas maintenir la largeur de l'élément supérieure à 500 pixels. Si la largeur de la lunette n'est pas suffisante pour accueillir l'élément, alors la largeur doit être de 100% – 80px .

Quant à la solution publiée en réponse à la question, j'ai essayé de l'appliquer et elle fonctionne dans Chrome 79 et Safari 13.0.3. Bien que cela dépasse le cadre de l'article, je donnerai toujours une solution ici:

CSS

 .yourselector { max-width: calc(100% - 80px); } /* Update: I changed the max-width from 500px to 580px. Thanks @fvsch */ @media screen and (max-width: 580px) { .yourselector { max-width: 500px; } } 

Sources et documents pour complément d'étude


Source: https://habr.com/ru/post/fr483634/


All Articles