Tener conto di flex-direction
La prima cosa che mi viene in mente quando leggi la tua domanda è che flex-basis
non sempre si applica width
.
Quando flex-direction
è row
, flex-basis
controlla la larghezza.
Ma quando lo flex-direction
è column
, flex-basis
controlla l'altezza.
Differenze chiave
Ecco alcune importanti differenze tra flex-basis
e width
/ height
:
flex-basis
si applica solo agli articoli flessibili. I contenitori flessibili (che non sono anche oggetti flessibili) ignoreranno flex-basis
ma possono usare width
e height
.
flex-basis
funziona solo sull'asse principale. Ad esempio, se ci si trova flex-direction: column
, la width
proprietà sarebbe necessaria per ridimensionare gli oggetti flessibili in orizzontale.
flex-basis
non ha alcun effetto sugli oggetti flex posizionati in modo assoluto. width
e le height
proprietà sarebbero necessarie. Gli oggetti flessibili posizionati in modo assoluto non partecipano al layout flessibile .
Usando il flex
proprietà, tre proprietà - flex-grow
, flex-shrink
e flex-basis
- possono essere combinati in un unico ordinatamente dichiarazione. Utilizzando width
, la stessa regola richiederebbe più righe di codice.
Comportamento del browser
In termini di come vengono resi, non ci dovrebbero essere differenze tra flex-basis
e width
, a meno che non flex-basis
sia auto
o content
.
Dalle specifiche:
7.2.3. La flex-basis
proprietà
Per tutti i valori diversi da auto
e content
, flex-basis
viene risolto allo stesso modo width
delle modalità di scrittura orizzontale.
Ma l'impatto di auto
o content
può essere minimo o nulla. Altro dalle specifiche:
auto
Se specificato su un articolo flessibile, la auto
parola chiave recupera il valore della proprietà della dimensione principale come utilizzato flex-basis
. Se quel valore è esso stesso auto
, allora è il valore usato content
.
content
Indica il dimensionamento automatico, in base al contenuto dell'articolo flessibile.
Nota: questo valore non era presente nella versione iniziale di Flexible Box Layout e pertanto alcune implementazioni precedenti non lo supporteranno. L'effetto equivalente può essere ottenuto utilizzando auto
insieme a una dimensione principale ( width
o height
) di auto
.
Quindi, secondo le specifiche, flex-basis
e width
risolvi in modo identico, a meno che non flex-basis
sia auto
o content
. In tali casi, flex-basis
può utilizzare la larghezza del contenuto (che, presumibilmente, la width
proprietà userebbe anche).
Il flex-shrink
fattore
È importante ricordare le impostazioni iniziali di un contenitore flessibile. Alcune di queste impostazioni includono:
flex-direction: row
- gli oggetti flessibili si allineeranno orizzontalmente
justify-content: flex-start
- gli oggetti flessibili verranno impilati all'inizio della linea sull'asse principale
align-items: stretch
- gli articoli flessibili si espandono per coprire le dimensioni trasversali del contenitore
flex-wrap: nowrap
- gli oggetti flessibili sono costretti a rimanere su una sola riga
flex-shrink: 1
- un articolo flessibile può restringersi
Nota l'ultima impostazione.
Poiché gli elementi flessibili possono restringersi per impostazione predefinita (il che impedisce loro di traboccare il contenitore), il flex-basis
/ width
/ specificato height
potrebbe essere ignorato.
Ad esempio, flex-basis: 100px
o width: 100px
, accoppiato con flex-shrink: 1
, non sarà necessariamente 100px.
Per eseguire il rendering della larghezza specificata - e mantenerla fissa - dovrai disabilitare la riduzione:
div {
width: 100px;
flex-shrink: 0;
}
O
div {
flex-basis: 100px;
flex-shrink: 0;
}
OPPURE, come raccomandato dalle specifiche:
flex: 0 0 100px; /* don't grow, don't shrink, stay fixed at 100px */
7.2. Componenti di flessibilità
Gli autori sono incoraggiati a controllare la flessibilità utilizzando la flex
stenografia anziché direttamente con le sue proprietà di stenografia, poiché la stenografia reimposta correttamente qualsiasi componente non specificato per adattarsi agli usi comuni .
Bug del browser
Alcuni browser hanno problemi a dimensionare gli oggetti flessibili in contenitori flessibili nidificati.
flex-basis
ignorato in un contenitore flessibile nidificato. width
lavori.
Durante l'utilizzo flex-basis
, il contenitore ignora il dimensionamento dei relativi figli e i bambini traboccano del contenitore. Ma con la width
proprietà, il contenitore rispetta il dimensionamento dei suoi figli e si espande di conseguenza.
Riferimenti:
Esempi:
flettere gli oggetti usando flex-basis
e white-space: nowrap
traboccare il inline-flex
contenitore. width
lavori.
Sembra che un contenitore flessibile impostato su inline-flex
non riconosca flex-basis
un bambino durante il rendering di un fratello white-space: nowrap
(anche se potrebbe essere solo un elemento con larghezza indefinita). Il contenitore non si espande per contenere gli articoli.
Ma quando width
viene utilizzata la proprietà anziché flex-basis
, il contenitore rispetta il dimensionamento dei propri figli e si espande di conseguenza. Questo non è un problema in IE11 e Edge.
Riferimenti:
Esempio:
flex-basis
(e flex-grow
) non funziona sull'elemento tabella
Riferimenti:
flex-basis
fallisce in Chrome e Firefox quando il contenitore del nonno è un elemento di adattamento. La configurazione funziona bene in Edge.
Come nell'esempio presentato nel link sopra, anche position: absolute
l'uso di float
e inline-block
renderà lo stesso output difettoso ( jsfiddle demo ).
Bug che interessano IE 10 e 11: