Houve perguntas e artigos sobre isso, mas nada conclusivo, até onde posso dizer. O melhor resumo que pude encontrar é
O flex-base permite que você especifique o tamanho inicial / inicial do elemento, antes que qualquer outra coisa seja computada. Pode ser uma porcentagem ou um valor absoluto.
... o que por si só não diz muito sobre o comportamento de elementos com conjunto de bases flexíveis . Com meu conhecimento atual do flexbox, não vejo por que isso também não poderia descrever a largura .
Gostaria de saber como exatamente a base flexível é diferente da largura na prática:
- Se eu substituir a largura pela base flexível (e vice-versa), o que mudará visualmente?
- O que acontece se eu definir ambos para um valor diferente? O que acontece se eles tiverem o mesmo valor?
- Existem alguns casos especiais em que o uso de largura ou base flexível teria uma diferença significativa em relação ao uso do outro?
- Como a largura e a base flexível diferem quando usadas em conjunto com outros estilos de flexbox, como flex-wrap , flex-grow e flex-shrink ?
- Alguma outra diferença significativa?
Edição / esclarecimento : Esta pergunta foi feita em um formato diferente em O que exatamente conjuntos de propriedades de base flexível? mas senti que seria agradável uma comparação ou resumo mais direto das diferenças de base flexível e largura (ou altura ).
Respostas:
Considerar
flex-direction
A primeira coisa que vem à mente ao ler sua pergunta é que
flex-basis
nem sempre se aplicawidth
.Quando
flex-direction
érow
,flex-basis
controla a largura.Mas quando
flex-direction
écolumn
,flex-basis
controla a altura.Principais diferenças
Aqui estão algumas diferenças importantes entre
flex-basis
ewidth
/height
:flex-basis
aplica-se apenas a itens flexíveis. Os contêineres flexíveis (que também não são itens flexíveis) ignoram,flex-basis
mas podem usarwidth
eheight
.flex-basis
funciona apenas no eixo principal. Por exemplo, se você estiver dentroflex-direction: column
, awidth
propriedade seria necessária para dimensionar itens flexíveis horizontalmente.flex-basis
não tem efeito em itens flexíveis absolutamente posicionados.width
eheight
propriedades seriam necessárias. Itens flexíveis absolutamente posicionados não participam do layout flexível .Ao utilizar a
flex
propriedade, três propriedades -flex-grow
,flex-shrink
eflex-basis
- pode ser perfeitamente combinadas em uma declaração. Usandowidth
, a mesma regra exigiria várias linhas de código.Comportamento do navegador
Em termos de como eles são renderizados, não deve haver diferença entre
flex-basis
ewidth
, a menos queflex-basis
sejaauto
oucontent
.Das especificações:
Mas o impacto
auto
oucontent
pode ser mínimo ou nada. Mais das especificações:Portanto, de acordo com as especificações,
flex-basis
ewidth
resolva de forma idêntica, a menos queflex-basis
sejaauto
oucontent
. Nesses casos,flex-basis
pode usar a largura do conteúdo (que, presumivelmente, awidth
propriedade também usaria).O
flex-shrink
fatorÉ importante lembrar as configurações iniciais de um contêiner flexível. Algumas dessas configurações incluem:
flex-direction: row
- os itens flexíveis se alinham horizontalmentejustify-content: flex-start
- os itens flexíveis serão empilhados no início da linha no eixo principalalign-items: stretch
- os itens flexíveis serão expandidos para cobrir o tamanho cruzado do contêinerflex-wrap: nowrap
- os itens flexíveis são forçados a permanecer em uma única linhaflex-shrink: 1
- um item flexível pode encolherObserve a última configuração.
Como os itens flexíveis podem encolher por padrão (o que impede que eles excedam o contêiner), o
flex-basis
/width
/ especificadoheight
pode ser substituído.Por exemplo,
flex-basis: 100px
ouwidth: 100px
, juntamente comflex-shrink: 1
, não será necessariamente 100px.Para renderizar a largura especificada - e mantê-la fixa - você precisará desativar o encolhimento:
OU
OU, conforme recomendado pela especificação:
Erros do navegador
Alguns navegadores têm problemas para dimensionar itens flexíveis em contêineres flexíveis aninhados.
flex-basis
ignorado em um contêiner flex aninhado.width
trabalho.Ao usar
flex-basis
, o contêiner ignora o dimensionamento de seus filhos e os filhos transbordam. Mas com awidth
propriedade, o contêiner respeita o tamanho de seus filhos e se expande de acordo.Referências:
Exemplos:
flex itens usando
flex-basis
ewhite-space: nowrap
transbordandoinline-flex
contêiner.width
trabalho.Parece que um contêiner flexível definido como
inline-flex
não é reconhecidoflex-basis
em uma criança ao renderizar um irmãowhite-space: nowrap
(embora possa ser apenas um item com largura indefinida). O contêiner não se expande para acomodar os itens.Mas quando a
width
propriedade é usada em vez deflex-basis
, o contêiner respeita o tamanho de seus filhos e se expande de acordo. Isso não é um problema no IE11 e no Edge.Referências:
Exemplo:
flex-basis
(eflex-grow
) não está funcionando no elemento da tabelaReferências:
flex-basis
falha no Chrome e no Firefox quando o contêiner dos avós é um elemento que se reduz ao tamanho adequado. A configuração funciona bem no Edge.Como no exemplo apresentado no link acima, envolver
position: absolute
o uso defloat
einline-block
também renderizará a mesma saída defeituosa ( demonstração do jsfiddle ).Erros que afetam o IE 10 e 11:
flex
declarações abreviadas comflex-basis
valores sem unidade são ignoradasflex-basis
não contabox-sizing: border-box
flex-basis
não suportacalc()
flex-basis
ao usarflex
taquigrafiafonte
min-width:100px;
? Pode ser uma opção para desativar o encolhimento?flex-shrink
pára emmin-width
. A regra flexível equivalente seriaflex: 1 0 100px
.flex: 1 0 100px
leva ao mesmo resultado, mas não sei ao certo o que você quer dizer com "equivalente".flex: 0 0 100px
, por exemplo?Além do excelente resumo de Michael_B, vale a pena repetir isso:
A parte importante aqui é inicial .
Por si só, isso resolve largura / altura até que outras propriedades flexíveis de crescimento / contração entrem em jogo.
Assim. uma criança com
terá 25% de largura inicialmente, mas depois expandirá imediatamente o máximo possível até que os outros elementos sejam levados em consideração. Se não houver nenhum ... será 100% de largura / altura.
Uma demonstração rápida:
Mostrar snippet de código
Experimentar o
flex-grow
,flex-shrink
eflex-basis
(ou a taquigrafiaflex :fg fs fb
) ... pode levar a alguns resultados interessantes.fonte
flex-basis
ewidth / height
definem o tamanho inicial / inicial de um elemento. Por exemplo,flex-basis: 200px
basicamente funciona da mesma forma queflex-basis: auto; width: 200px;
. Parece que quandoflex-basis
não está definidoauto
, substitui owidth / height
valor. A única diferença que vejo é a maneira como o excesso de conteúdo é tratado.Possivelmente o ponto mais importante a ser adicionado:
E se o navegador não suportar
flex
? Nesse caso,width/height
assuma o controle e seus valores se aplicam.É uma idéia muito boa - quase essencial - definir
width/height
elementos, mesmo se você tiver um valor completamente diferente paraflex-basis
. Lembre-se de testar desativandodisplay:flex
e vendo o que você recebe.fonte
flex
.