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-based vous permet de spécifier la taille initiale / de départ de l'élément, avant tout autre calcul. Il peut s'agir d'un pourcentage ou d'une valeur absolue.
... qui en soi ne dit pas grand-chose sur le comportement des éléments avec flex-base set. Avec ma connaissance actuelle de flexbox, je ne vois pas pourquoi cela ne pourrait pas décrire la largeur également.
Je voudrais savoir en quoi exactement la flex-base est différente de la largeur dans la pratique:
- Si je remplace largeur par flex-base (et vice versa), qu'est-ce qui changera visuellement?
- Que se passe-t-il si je règle les deux sur une valeur différente? Que se passe-t-il s'ils ont la même valeur?
- Y a-t-il des cas particuliers où l'utilisation de la largeur ou de la base flexible aurait une différence significative par rapport à l'utilisation de l'autre?
- En quoi la largeur et la base flex diffèrent - elles lorsqu'elles sont utilisées en conjonction avec d'autres styles de flexbox, tels que flex-wrap , flex-grow et flex-shrink ?
- Y a-t-il d'autres différences importantes?
Edit / clarification : Cette question a été posée dans un format différent dans Quels ensembles de propriétés flex-based exactement? mais je pensais qu'une comparaison ou un résumé plus direct des différences de flex-base et de largeur (ou de hauteur ) serait bien.
Réponses:
Considérer
flex-direction
La première chose qui vient à l'esprit lors de la lecture de votre question est que
flex-basis
cela ne s'applique pas toujourswidth
.Quand
flex-direction
estrow
,flex-basis
contrôle la largeur.Mais quand
flex-direction
c'estcolumn
,flex-basis
contrôle la hauteur.Différences clés
Voici quelques différences importantes entre
flex-basis
etwidth
/height
:flex-basis
s'applique uniquement aux articles flexibles. Les conteneurs flexibles (qui ne sont pas également des éléments flexibles) ignorerontflex-basis
mais peuvent utiliserwidth
etheight
.flex-basis
ne fonctionne que sur l'axe principal. Par exemple, si vous êtes dedansflex-direction: column
, lawidth
propriété serait nécessaire pour dimensionner les éléments flexibles horizontalement.flex-basis
n'a aucun effet sur les éléments flexibles positionnés de manière absolue.width
et lesheight
propriétés seraient nécessaires. Les éléments flex absolument positionnés ne participent pas à la mise en page flex .En utilisant la
flex
propriété, trois propriétés -flex-grow
,flex-shrink
etflex-basis
- peuvent être parfaitement combinées en une seule déclaration. En utilisantwidth
, la même règle nécessiterait plusieurs lignes de code.Comportement du navigateur
En ce qui concerne la façon dont ils sont rendus, il devrait y avoir aucune différence entre
flex-basis
etwidth
, à moinsflex-basis
estauto
oucontent
.De la spécification:
Mais l'impact de
auto
oucontent
peut être minime ou rien du tout. Plus de la spécification:Donc, selon la spécification,
flex-basis
etwidth
résolvez à l'identique, sauf siflex-basis
estauto
oucontent
. Dans de tels cas,flex-basis
peut utiliser la largeur du contenu (qui, vraisemblablement, lawidth
propriété utiliserait également).Le
flex-shrink
facteurIl est important de se rappeler les paramètres initiaux d'un conteneur flexible. Certains de ces paramètres incluent:
flex-direction: row
- les éléments flexibles s'aligneront horizontalementjustify-content: flex-start
- les éléments flexibles s'empileront au début de la ligne sur l'axe principalalign-items: stretch
- les articles flexibles se dilateront pour couvrir la taille transversale du conteneurflex-wrap: nowrap
- les articles flexibles sont obligés de rester sur une seule ligneflex-shrink: 1
- un élément flexible est autorisé à rétrécirNotez le dernier réglage.
Étant donné que les éléments flexibles sont autorisés à rétrécir par défaut (ce qui les empêche de déborder du conteneur), le
flex-basis
/width
/ spécifiéheight
peut être remplacé.Par exemple,
flex-basis: 100px
ouwidth: 100px
, couplé àflex-shrink: 1
, ne sera pas nécessairement 100px.Pour rendre la largeur spécifiée - et la maintenir fixe - vous devrez désactiver la réduction:
OU
OU, comme recommandé par la spécification:
Bogues du navigateur
Certains navigateurs ont du mal à dimensionner les éléments flexibles dans des conteneurs flex imbriqués.
flex-basis
ignoré dans un conteneur flexible imbriqué.width
travaux.Lors de l'utilisation
flex-basis
, le conteneur ignore le dimensionnement de ses enfants et les enfants débordent du conteneur. Mais avec lawidth
propriété, le conteneur respecte le dimensionnement de ses enfants et se dilate en conséquence.Références:
Exemples:
flex éléments à l'aide
flex-basis
et conteneur dewhite-space: nowrap
débordementinline-flex
.width
travaux.Il semble qu'un conteneur flexible défini sur
inline-flex
ne reconnaisse pasflex-basis
un enfant lors du rendu d'un frère avecwhite-space: nowrap
(bien qu'il puisse s'agir simplement d'un élément avec une largeur non définie). Le conteneur ne se dilate pas pour accueillir les articles.Mais lorsque la
width
propriété est utilisée à la place deflex-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:
Exemple:
flex-basis
(etflex-grow
) ne fonctionne pas sur l'élément de tableRéférences:
flex-basis
échoue dans Chrome et Firefox lorsque le conteneur de grand-parent est un élément rétractable. La configuration fonctionne correctement dans Edge.Comme dans l'exemple présenté dans le lien ci-dessus, impliquant
position: absolute
, l'utilisation defloat
etinline-block
, rendra également la même sortie défectueuse ( démo jsfiddle ).Bogues affectant IE 10 et 11:
flex
les déclarations abrégées avec desflex-basis
valeurs sans unité sont ignoréesflex-basis
ne tient pas comptebox-sizing: border-box
flex-basis
ne prend pas en chargecalc()
flex-basis
lors de l'utilisation de laflex
sténographiela source
min-width:100px;
? Peut-il être une option pour désactiver la réduction?flex-shrink
s'arrête àmin-width
. La règle de flexion équivalente seraitflex: 1 0 100px
.flex: 1 0 100px
conduit au même résultat, mais je ne sais pas ce que vous entendez par "équivalent".flex: 0 0 100px
, par exemple?En plus de l'excellent résumé de Michael_B, il vaut la peine de le répéter:
La partie importante ici est initiale .
En soi, cela se résout en largeur / hauteur jusqu'à ce que les autres propriétés de croissance / rétraction flexibles entrent en jeu.
Alors. un enfant avec
sera de 25% de large au départ, mais ensuite se dilater immédiatement autant que possible jusqu'à ce que les autres éléments soient pris en compte. S'il n'y en a pas, il sera de 100% large / haut.
Une démo rapide:
Afficher l'extrait de code
Expérimenter avec le
flex-grow
,flex-shrink
etflex-basis
(ou le raccourciflex :fg fs fb
) ... peut conduire à des résultats intéressants.la source
flex-basis
etwidth / height
définir la taille initiale / à partir d'un élément. Par exemple,flex-basis: 200px
fonctionne essentiellement commeflex-basis: auto; width: 200px;
. Il semble que lorsqueflex-basis
n'est pas défini surauto
alors il remplace simplement lawidth / height
valeur. La seule différence que je vois est la façon dont le débordement de contenu est géré.Peut-être le point le plus important à ajouter:
Et si le navigateur ne prend pas en charge
flex
? Dans un tel cas,width/height
prenez le relais et leurs valeurs s'appliquent.C'est une très bonne idée - presque essentielle - de définir des
width/height
éléments, même si vous avez alors une valeur complètement différente pourflex-basis
. N'oubliez pas de tester en désactivantdisplay:flex
et en voyant ce que vous obtenez.la source
flex
.