Quelles sont les différences entre flex-basis et width?
Il y a eu des questions et des articles à ce sujet, mais rien de concluant pour autant que je sache. Le meilleur résumé que j'ai pu trouver est
flex-basis vous permet de spécifier la taille initiale / de départ de l'élément, avant que toute autre chose ne soit calculée. Il peut s'agir d'un pourcentage ou d'une valeur absolue.
...ce qui en soi ne dit pas grand-chose sur le comportement des éléments avec flex-basis set. Avec ma connaissance actuelle de flexbox Je ne vois pas pourquoi cela ne pouvait pas décrire width aussi.
Je voudrais savoir comment exactement flex-base est différent de largeur dans la pratique:
- Si je remplace largeur avec flex-base(et vice versa), ce qui va changer visuellement?
- que se passe-t-il si je mets les deux à une valeur différente? Que se passe-t-il s'ils ont la même valeur?
- Sont là que quelques cas spéciaux où en utilisant soit largeur ou flex-base aurait un grave différence à l'utilisation de l'autre?
- Comment largeur et flex-base diffèrent lorsqu'il est utilisé conjointement avec d'autres flexbox styles, tels que flex-wrap, flex-grow et flex-shrink?
- D'autres différences significatives?
Edit / clarification : cette question a été posée dans un format différent dans Quels sont exactement les ensembles de propriétés flex-basis? mais j'ai senti une comparaison plus directe ou un résumé de la les différences de flex-base et largeur (ou hauteur), ce serait bien.
3 réponses
Considérez flex-direction
La première chose qui vient à l'esprit lors de la lecture de votre question Est que flex-basis
ne s'applique pas toujours à width
.
Quand flex-direction
est row
, flex-basis
contrôle la largeur.
Mais quand flex-direction
est column
, flex-basis
contrôle la hauteur.
Différences Clés
Voici quelques différences importantes entre les flex-basis
et width
/ height
:
flex-basis
s'applique uniquement à la flexion des éléments. Les conteneurs Flex (qui ne sont pas aussi des éléments flex) ignorerflex-basis
, mais peut utiliserwidth
etheight
.flex-basis
ne fonctionne que sur l'axe principal. Par exemple, si vous êtes dansflex-direction: column
, la propriétéwidth
serait nécessaire pour dimensionner les éléments flex horizontalement.flex-basis
n'a aucun effet sur les éléments flex absolument positionnés. Les propriétéswidth
etheight
seraient nécessaires. les éléments flex absolument positionnés ne participent pas à la mise en page flex.En utilisant la propriété
flex
, trois propriétés –flex-grow
,flex-shrink
etflex-basis
– peuvent être parfaitement combinés en une seule déclaration. En utilisantwidth
, la même règle nécessiterait plusieurs lignes de code.
Comportement Du Navigateur
En termes de rendu, il ne devrait y avoir aucune différence entre flex-basis
et width
, sauf si flex-basis
est auto
ou content
.
à Partir de la spécification:
7.2.3. Le
flex-basis
propriétéPour toutes les valeurs autres que
auto
etcontent
,flex-basis
est résolu de la même manière quewidth
, horizontal modes d'écriture.
, Mais l'impact de auto
ou content
peut être minime ou rien du tout. Plus de la spécification:
Lorsqu'il est spécifié sur un élément flex, le mot clé
auto
récupère la valeur de la propriété main size commeflex-basis
utilisé. Si cette valeur est elle-mêmeauto
, alors la valeur utilisée estcontent
.Indique le dimensionnement automatique, basé sur le contenu de l'élément flex.
Remarque: Cette valeur n'est pas présente dans la version initiale de Flexible Layout Box, et donc certaines implémentations plus anciennes ne le supporteront pas. L'effet équivalent peut être obtenu en utilisant
auto
avec un taille principale (width
ouheight
) deauto
.
Donc, selon la spécification, flex-basis
et width
résoudre identique, sauf si flex-basis
est auto
ou content
. Dans de tels cas, flex-basis
peut utiliser la largeur de contenu (que, vraisemblablement, la propriété width
utiliserait également).
Le facteur flex-shrink
Il est important de se rappeler les paramètres initiaux d'un conteneur flex. Certains de ces paramètres comprennent:
-
flex-direction: row
- les éléments flexibles s'aligneront horizontalement -
justify-content: flex-start
- les éléments flexibles seront empilés au début de la ligne sur l'axe principal -
align-items: stretch
- les éléments flexibles développer pour couvrir la taille transversale du conteneur -
flex-wrap: nowrap
- les éléments flexibles sont obligés de rester sur une seule ligne -
flex-shrink: 1
- un élément flexible est autorisé à rétrécir
Notez le dernier réglage.
Étant donné que les éléments flex sont autorisés à rétrécir par défaut (ce qui les empêche de déborder du conteneur) , le flex-basis
/ width
/ height
peut être remplacé.
Par exemple flex-basis: 100px
ou width: 100px
, couplé avec flex-shrink: 1
, ne sera pas nécessairement 100px.
Pour rendre la largeur spécifiée – et le maintenir fixe, vous devrez désactiver le rétrécissement:
div {
width: 100px;
flex-shrink: 0;
}
Ou
div {
flex-basis: 100px;
flex-shrink: 0;
}
Ou, comme recommandé par la spécification:
flex: 0 0 100px; /* don't grow, don't shrink, stay fixed at 100px */
7.2. Les composants de La flexibilité
Les auteurs sont encouragés à contrôler la flexibilité en utilisant le raccourci
flex
plutôt qu'avec ses propriétés de longhand directement, comme le raccourci correctement réinitialise quelconque des composants accueillir commune utilise.
Bugs Du Navigateur
Bug affectant tous les principaux navigateurs, sauf IE 11 & Edge:
flex-basis
ignoré dans un conteneur flex imbriqué. width
fonctionne.
Un problème a été trouvé lors du dimensionnement d'éléments flex dans un conteneur flex imbriqué.
Lors de l'utilisation de flex-basis
, le conteneur ignore le dimensionnement de ses enfants, et les enfants de débordement du récipient. Mais avec la propriété width
, le conteneur respecte le dimensionnement de ses enfants et se développe en conséquence. Ce n'est pas un problème dans IE11 et Edge.
Références:
- Chrome ne développe pas Flex parent en fonction du contenu des enfants
- différence entre largeur et flex-basis
- Flex-basis est ignoré lors du dimensionnement des conteneurs Flex imbriqués.
- Flex-base: 100px fait quelque chose de différent de largeur: 100px + flex-base: auto
Exemples:
- https://jsfiddle.net/t419zhra/ (source: @Dremora)
- https://jsfiddle.net/voc9grx6/ (source: Chrome Bugs)
- https://jsfiddle.net/qjpat9zk/ (source: Chrome Bugs)
Éléments flexibles utilisant flex-basis
et white-space: nowrap
débordement inline-flex
conteneur. width
fonctionne.
Il semble qu'un flex le conteneur défini sur inline-flex
ne reconnaît pas flex-basis
sur un enfant lors du rendu d'un frère avec white-space: nowrap
(bien que ce puisse être un élément avec une largeur indéfinie). Le conteneur ne s'étend pas pour accueillir les éléments.
Mais lorsque la propriété width
est utilisée à la place de flex-basis
, le conteneur respecte le dimensionnement de ses enfants et se développe en conséquence. Ce n'est pas un problème dans IE11 et Edge.
Références:
- inline Flex conteneur Largeur pas croissance
- le conteneur flex Inline (display: inline-flex) étend la largeur totale du conteneur parent
Exemple:
- https://jsfiddle.net/p18h0jxt/1/ (du premier message ci-dessus)
Bogues affectant IE 10 et 11:
En plus de L'excellent résumé de Michael_B, il vaut la peine de répéter ceci:
Flex-basis vous permet de spécifier la taille initiale / initiale de l'élément, avant que toute autre chose ne soit calculée. Il peut s'agir d'un pourcentage ou d'une valeur absolue.
La partie importante ici est initiale .
En soi, cela résout la largeur / hauteur jusqu'à ce que les autres propriétés flex grow / shrink entrent en jeu.
Donc. enfant avec
.child {
flex-basis:25%;
flex-grow:1;
}
Aura une largeur de 25% initialement, mais s'étendra immédiatement autant que possible jusqu'à ce que les autres éléments soient pris en compte. S'il y a none..it sera 100% large / haut.
Une démo rapide:
.flex {
width: 80%;
margin: 1em auto;
height: 25px;
display: flex;
background: rebeccapurple;
}
.child {
flex-basis: auto;
/* default */
background: plum;
}
.value {
flex-basis: 25%;
}
.grow {
flex-grow: 1;
}
<div class="flex">
<div class="child auto">Some Content</div>
</div>
<div class="flex">
<div class="child value">Some Content</div>
</div>
<div class="flex">
<div class="child grow">Some Content</div>
</div>
Expérimenter avec la flex-grow
, flex-shrink
et flex-basis
(ou la sténographie flex :fg fs fb
)...peut conduire à des résultats intéressants.
Peut-être le point le plus important à ajouter:
Que faire si le navigateur ne prend pas en charge flex
? Dans un tel cas, width/height
prennent le relais et leurs valeurs s'appliquent.
C'est une très bonne idée - presque essentielle - de définir width/height
sur les éléments, même si vous avez alors une valeur complètement différente pour flex-basis
. N'oubliez pas de tester en désactivant display:flex
et en voyant ce que vous obtenez.