Pourquoi les éléments flexibles ne réduisent-ils pas la taille du contenu?
J'ai 4 colonnes flexbox et tout fonctionne bien, mais lorsque j'ajoute du texte à une colonne et que je la règle sur une grande taille de police, cela rend la colonne plus large qu'elle ne devrait l'être en raison de la propriété flex.
J'ai essayé d'utiliser word-break: break-word
et cela a aidé, mais quand je redimensionne la colonne à une très petite largeur, les lettres du texte sont divisées en plusieurs lignes (une lettre par ligne), et pourtant la colonne n'a pas une largeur inférieure à une taille de lettre .
Regardez cette vidéo (au début, la première colonne est la plus petite, mais lorsque je redimensionne la fenêtre, c'est la colonne la plus large. Je veux juste toujours respecter les paramètres flex; flex tailles 1: 3: 4: 4)
Je sais, définir une taille de police et un remplissage de colonne plus petits aidera ... mais y a-t-il une autre solution?
Je ne peux pas utiliser overflow-x: hidden
.
.container {
display: flex;
width: 100%
}
.col {
min-height: 200px;
padding: 30px;
word-break: break-word
}
.col1 {
flex: 1;
background: orange;
font-size: 80px
}
.col2 {
flex: 3;
background: yellow
}
.col3 {
flex: 4;
background: skyblue
}
.col4 {
flex: 4;
background: red
}
<div class="container">
<div class="col col1">Lorem ipsum dolor</div>
<div class="col col2">Lorem ipsum dolor</div>
<div class="col col3">Lorem ipsum dolor</div>
<div class="col col4">Lorem ipsum dolor</div>
</div>
Réponses
La taille minimale automatique des éléments flexibles
Vous rencontrez un paramètre par défaut de Flexbox.
Un élément flexible ne peut pas être plus petit que la taille de son contenu le long de l'axe principal.
Les valeurs par défaut sont ...
min-width: auto
min-height: auto
... pour les éléments flexibles dans le sens des lignes et dans le sens des colonnes, respectivement.
Vous pouvez remplacer ces valeurs par défaut en définissant les éléments flexibles sur:
min-width: 0
min-height: 0
overflow: hidden
(ou toute autre valeur, saufvisible
)
Spécification Flexbox
4.5. Taille minimale automatique des éléments flexibles
Pour fournir une taille minimale par défaut plus raisonnable pour les éléments flexibles, cette spécification introduit une nouvelle
auto
valeur comme valeur initiale des propriétésmin-width
etmin-height
définies dans CSS 2.1.
En ce qui concerne la auto
valeur ...
Sur un élément flexible qui se
overflow
trouvevisible
dans l'axe principal, lorsqu'il est spécifié sur la propriété min-size de l'axe principal de l'élément flexible, spécifie une taille minimale automatique . Il calcule autrement0
.
En d'autres termes:
- Les valeurs par défaut
min-width: auto
etmin-height: auto
s'appliquent uniquement lorsqueoverflow
estvisible
. - Si la
overflow
valeur n'est pasvisible
, la valeur de la propriété min-size est0
. - Par conséquent,
overflow: hidden
peut être un substitut àmin-width: 0
etmin-height: 0
.
et...
- L'algorithme de dimensionnement minimum s'applique uniquement sur l'axe principal.
- Par exemple, un élément flex dans un conteneur de direction de ligne n'est pas obtenu
min-height: auto
par défaut. - Pour une explication plus détaillée, consultez cet article:
Vous avez appliqué min-width: 0 et l'élément ne rétrécit toujours pas?
Conteneurs Flex imbriqués
Si vous traitez avec des éléments flexibles à plusieurs niveaux de la structure HTML, il peut être nécessaire de remplacer les éléments par défaut min-width: auto
/ min-height: auto
on aux niveaux supérieurs.
Fondamentalement, un élément flexible de niveau supérieur avec min-width: auto
peut empêcher la réduction des éléments imbriqués ci-dessous avec min-width: 0
.
Exemples:
- L'élément Flex ne rétrécit pas plus petit que son contenu
- Adapter l'enfant au parent
- La propriété css d'espace blanc crée des problèmes avec flex
Notes de rendu du navigateur
Chrome contre Firefox / Edge
Depuis au moins 2017, il semble que Chrome soit (1) revenant aux
min-width: 0
/min-height: 0
defaults, ou (2) appliquant automatiquement les0
valeurs par défaut dans certaines situations basées sur un algorithme de mystère. (Cela pourrait être ce qu'ils appellent une intervention .) En conséquence, de nombreuses personnes voient leur mise en page (en particulier les barres de défilement souhaitées) fonctionner comme prévu dans Chrome, mais pas dans Firefox / Edge. Ce problème est traité plus en détail ici: écart de flex-shrink entre Firefox et ChromeIE11
Comme indiqué dans la spécification, la
auto
valeur des propriétésmin-width
etmin-height
est "new". Cela signifie que certains navigateurs peuvent toujours afficher une0
valeur par défaut, car ils ont implémenté la mise en page flex avant la mise à jour de la valeur et parce que0
c'est la valeur initiale pourmin-width
etmin-height
dans CSS 2.1 . Un de ces navigateurs est IE11. D'autres navigateurs ont mis à jour laauto
valeur la plus récente telle que définie dans la spécification de la flexbox .
Démo révisée
.container {
display: flex;
}
.col {
min-height: 200px;
padding: 30px;
word-break: break-word
}
.col1 {
flex: 1;
background: orange;
font-size: 80px;
min-width: 0; /* NEW */
}
.col2 {
flex: 3;
background: yellow
}
.col3 {
flex: 4;
background: skyblue
}
.col4 {
flex: 4;
background: red
}
<div class="container">
<div class="col col1">Lorem ipsum dolor</div>
<div class="col col2">Lorem ipsum dolor</div>
<div class="col col3">Lorem ipsum dolor</div>
<div class="col col4">Lorem ipsum dolor</div>
</div>
Je trouve que cela m'a mordu à plusieurs reprises au fil des ans pour le flex et la grille, je vais donc suggérer ce qui suit:
* { min-width: 0; min-height: 0; }
puis utilisez simplement min-width: auto
ou min-height: auto
si vous avez besoin de ce comportement.
En fait, ajoutez également le dimensionnement de la boîte pour rendre toute mise en page plus sensée:
* { box-sizing: border-box; min-width: 0; min-height: 0; }
Est-ce que quelqu'un sait s'il y a des conséquences étranges? Je n'ai rien rencontré depuis plusieurs années en utilisant un mélange de ce qui précède. En fait, je ne peux penser à aucun cas où je voudrais mettre en page du contenu vers l'extérieur vers le flex / grid, plutôt que flex / grid vers le contenu --- et sûrement s'ils existent, ils sont rares. Cela ressemble donc à un mauvais défaut. Mais peut-être que je manque quelque chose?