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.

151
demandé sur Community 2015-12-18 12:17:22

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) ignorer flex-basis, mais peut utiliser width et height.

  • flex-basis ne fonctionne que sur l'axe principal. Par exemple, si vous êtes dans flex-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és width et height 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 et flex-basis – peuvent être parfaitement combinés en une seule déclaration. En utilisant width, 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 et content, flex-basis est résolu de la même manière que width, horizontal modes d'écriture.

, 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 flex, le mot clé auto récupère la valeur de la propriété main size comme flex-basis utilisé. Si cette valeur est elle-même auto, alors la valeur utilisée est content.

content

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 ou height) de auto.

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:

Exemples:

É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:

Exemple:


Bogues affectant IE 10 et 11:

226
répondu Michael_B 2017-10-11 13:44:57

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.

23
répondu Paulie_D 2018-02-14 12:55:41

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.

3
répondu Niet the Dark Absol 2016-06-19 12:15:14