Cosa significa flex: 1?


129

Come tutti sappiamo, la flexproprietà è una scorciatoia per il flex-grow, flex-shrinke le flex-basisproprietà. Il suo valore predefinito è 0 1 auto, che significa

flex-grow: 0;
flex-shrink: 1;
flex-basis: auto;

ma ho notato, in molti posti flex: 1viene utilizzato. È una scorciatoia per 1 1 autoo 1 0 auto? Non riesco a capire cosa significhi e non ottengo nulla quando cerco su Google.


1
citando w3schools.com "La proprietà flex è una scorciatoia per le proprietà flex-grow, flex-shrink e flex-base"
Imran Ali

Risposte:


86

Ecco la spiegazione:

https://www.w3.org/TR/css-flexbox-1/#flex-common

flex: <numero-positivo>
Equivalente a flex: <numero-positivo> 1 0. Rende l'elemento flessibile flessibile e imposta la base flessibile su zero, risultando in un elemento che riceve la proporzione specificata di spazio libero nel contenitore flessibile. Se tutti gli elementi nel contenitore flessibile utilizzano questo modello, le loro dimensioni saranno proporzionali al fattore di flessibilità specificato.

Pertanto flex:1è equivalente aflex: 1 1 0


10
flex: 1; non è uguale a flessione: 1 1 0; vedere la mia risposta sotto per vedere perché.
DreamTeK

Una nota a margine: penso che quando applichi lo stesso flexa tutti i bambini, ciò che conta in realtà è flex: 1 ? 0;dove "?" può essere qualsiasi cosa, non farà alcuna differenza
flen

@DreamTeK Solo in browser non conformi agli standard come Chrome.
TylerH

1
@TylerH Corretto e annotato nella mia risposta, tuttavia what does flex:1 mean?è aperto all'interpretazione. L'operazione non richiede le specifiche, solo ciò che sta accadendo. Sfortunatamente Chrome è ora il browser più popolare ed è richiesto il supporto. Io stesso non sono un fan o un utente di Chrome!
DreamTeK

1
@TylerH Questo è il motivo per cui nella mia risposta, si fa riferimento agli stati "Va notato che questo fallisce perché questi browser non sono riusciti a rispettare le specifiche". insieme a un collegamento alle specifiche!
DreamTeK

99

flex: 1 significa quanto segue:

flex-grow : 1;    ➜ The div will grow in same proportion as the window-size       
flex-shrink : 1;  ➜ The div will shrink in same proportion as the window-size 
flex-basis : 0;   ➜ The div does not have a starting value as such and will 
                     take up screen as per the screen size available for
                     e.g:- if 3 divs are in the wrapper then each div will take 33%.

1
@CookieMonster No, flex: 1significa 1 1 0... ma su IE è1 1 0px
Ason

@LGSon, puoi omettere l'unità dal valore di base così 1 1 0e 1 1 0pxsono equivalenti. IE capita solo di supportare solo quello con un'unità.
CookieMonster

@CookieMonster So come funziona Flexbox, stavo solo correggendo il tuo primo commento, il che è sbagliato.
Ason

@LGSon, in che modo flex: 1 significa 1 1 0px sbagliato quando 1 1 0pxe 1 1 0sono equivalenti?
CookieMonster

2
@CookieMonster Potrebbero essere visualizzati allo stesso modo, ma non equivalenti, poiché quando si utilizza un valore senza unità per flex-basis, il contenuto viene ignorato e la dimensione dell'elemento è basata su flex-grow/ flex-shrink.
Ason

78

STAI ATTENTO

In alcuni browser:

flex:1; non è ugualeflex:1 1 0;

flex:1;= flex:1 1 0n;(dove n è un'unità di lunghezza).

  • flex-grow: un numero che specifica quanto crescerà l'elemento rispetto al resto degli elementi flessibili.
  • flex-shrink Un numero che specifica quanto l'oggetto si restringerà rispetto al resto degli articoli flessibili
  • base flessibile La lunghezza dell'articolo. Valori legali: "auto", "inherit" o un numero seguito da "%", "px", "em" o qualsiasi altra unità di lunghezza.

Il punto chiave qui è che la base flessibile richiede un'unità di lunghezza .

In Chrome per esempio flex:1e flex:1 1 0producono risultati diversi. Nella maggior parte dei casi può sembrare che funzioni, flex:1 1 0;ma esaminiamo cosa succede realmente:

ESEMPIO

La base flessibile viene ignorata e vengono applicati solo flex-grow e flex-shrink.

flex:1 1 0;= flex:1 1;=flex:1;

A prima vista, tuttavia, potrebbe sembrare corretto se l'unità applicata del contenitore è annidata; aspettare l'inaspettato!

Prova questo esempio in CHROME

.Wrap{
  padding:10px;
  background: #333;
}
.Flex110x, .Flex1, .Flex110, .Wrap {
  display: -webkit-flex;
  display: flex;
  -webkit-flex-direction: column;
  flex-direction: column;
}
.Flex110 {
  -webkit-flex: 1 1 0;
  flex: 1 1 0;
}
.Flex1 {
  -webkit-flex: 1;
  flex: 1;
}
.Flex110x{
  -webkit-flex: 1 1 0%;
  flex: 1 1 0%;
}
FLEX 1 1 0
<div class="Wrap">
  <div class="Flex110">
    <input type="submit" name="test1" value="TEST 1">
  </div>
</div>

FLEX 1
<div class="Wrap">
  <div class="Flex1">
    <input type="submit" name="test2" value="TEST 2">
  </div>
</div>

FLEX 1 1 0%
<div class="Wrap">
  <div class="Flex110x">
    <input type="submit" name="test3" value="TEST 3">
  </div>
</div>

COMPATIBILITÀ

Va notato che questo fallisce perché alcuni browser non sono riusciti ad aderire alle specifiche .

Browser che utilizzano la specifica flex completa:

  • Firefox - ✓
  • Edge - ✓ (Lo so, anche io sono rimasto scioccato.)
  • Chrome - x
  • Coraggioso - x
  • Opera - x
  • IE - (lol, funziona senza unità di lunghezza ma non con una.)

AGGIORNAMENTO 2019

Le ultime versioni di Chrome sembrano aver finalmente risolto questo problema, ma altri browser non lo hanno ancora fatto.

Testato e funzionante con Chrome Ver 74.


1
Quando il valore è 0 l'unità non è obbligatoria. La specifica dice che flex: 1è la stessa flex: 1 1 0. Nel tuo esempio, se rimuovi la .Wrapclasse nella .Flex110x,.Flex1, .Flex110, .Wrapregola, funziona come previsto.

Fornisci un link per favore, non riesco a trovare nelle specifiche quello che stai dicendo. Non ho inventato nulla, la mia risposta è basata sulla specifica

@Obsidian Ecco il link: w3.org/TR/css-flexbox-1 Se vai alla parte per "shorthand" troverai: "flex: [numero-positivo] Equivalente a flex: [numero-positivo] 1 0 ...
MikeB

1
@Toskan Per la massima compatibilità, usa la sintassi completaflex:1 1 0n;
DreamTeK

2
Grazie per aver sottolineato questa differenza, non sono riuscito a capire da dove provenissero i miei problemi. Avere un po 'di generosità.
Nit
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.