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 toujours width
.
Quand flex-direction
est row
, flex-basis
contrôle la largeur.
Mais quand flex-direction
c'est column
, flex-basis
contrôle la hauteur.
Différences clés
Voici quelques différences importantes entre flex-basis
et width
/ height
:
flex-basis
s'applique uniquement aux articles flexibles. Les conteneurs flexibles (qui ne sont pas également des éléments flexibles) ignoreront flex-basis
mais peuvent utiliser width
et height
.
flex-basis
ne fonctionne que sur l'axe principal. Par exemple, si vous êtes dedans flex-direction: column
, la width
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 les height
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
et flex-basis
- peuvent être parfaitement combinées en une seule déclaration. En utilisant width
, 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
et width
, à moins flex-basis
est auto
ou content
.
De la spécification:
7.2.3. La flex-basis
propriété
Pour toutes les valeurs autres que auto
et content
, flex-basis
est résolu de la même manière que width
dans les modes d'écriture horizontale.
Mais l'impact de auto
ou content
peut être minime ou rien du tout. Plus de la spécification:
auto
Lorsqu'il est spécifié sur un élément flexible, le auto
mot clé récupère la valeur de la propriété size principale telle qu'elle est utilisée flex-basis
. Si cette valeur est elle-même auto
, alors la valeur utilisée est content
.
content
Indique un dimensionnement automatique, basé sur le contenu de l'élément flexible.
Remarque: Cette valeur n'était pas présente dans la version initiale de Flexible Box Layout, et donc certaines implémentations plus anciennes ne la prendront pas en charge. L'effet équivalent peut être obtenu en utilisant auto
conjointement avec une taille principale ( width
ou height
) de auto
.
Donc, selon la spécification, flex-basis
et width
résolvez à l'identique, sauf si flex-basis
est auto
ou content
. Dans de tels cas, flex-basis
peut utiliser la largeur du contenu (qui, vraisemblablement, la width
propriété utiliserait également).
Le flex-shrink
facteur
Il 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 horizontalement
justify-content: flex-start
- les éléments flexibles s'empileront au début de la ligne sur l'axe principal
align-items: stretch
- les articles flexibles se dilateront pour couvrir la taille transversale du conteneur
flex-wrap: nowrap
- les articles 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 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
ou width: 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:
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. Composants de flexibilité
Les auteurs sont encouragés à contrôler la flexibilité en utilisant la flex
sténographie plutôt qu'avec ses propriétés de sténographie directement, car la sténographie réinitialise correctement tous les composants non spécifiés pour s'adapter aux utilisations courantes .
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 la width
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 de white-space: nowrap
débordement inline-flex
. width
travaux.
Il semble qu'un conteneur flexible défini sur inline-flex
ne reconnaisse pas flex-basis
un enfant lors du rendu d'un frère avec white-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 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:
Exemple:
flex-basis
(et flex-grow
) ne fonctionne pas sur l'élément de table
Ré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 de float
et inline-block
, rendra également la même sortie défectueuse ( démo jsfiddle ).
Bogues affectant IE 10 et 11: