Considerar flex-direction
A primeira coisa que vem à mente ao ler sua pergunta é que flex-basis
nem sempre se aplica width
.
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
e width
/ 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 usar width
e height
.
flex-basis
funciona apenas no eixo principal. Por exemplo, se você estiver dentro flex-direction: column
, a width
propriedade seria necessária para dimensionar itens flexíveis horizontalmente.
flex-basis
não tem efeito em itens flexíveis absolutamente posicionados. width
e height
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
e flex-basis
- pode ser perfeitamente combinadas em uma declaração. Usando width
, 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
e width
, a menos que flex-basis
seja auto
ou content
.
Das especificações:
7.2.3 A flex-basis
propriedade
Para todos os valores diferentes de auto
e content
, flex-basis
é resolvido da mesma maneira que width
nos modos de gravação horizontal.
Mas o impacto auto
ou content
pode ser mínimo ou nada. Mais das especificações:
auto
Quando especificada em um item flexível, a auto
palavra - chave recupera o valor da propriedade de tamanho principal como a usada flex-basis
. Se esse valor for ele próprio auto
, o valor usado será content
.
content
Indica o dimensionamento automático, com base no conteúdo do item flexível.
Nota: Esse valor não estava presente na versão inicial do Layout de caixa flexível e, portanto, algumas implementações mais antigas não o suportam. O efeito equivalente pode ser alcançado usando-se auto
junto com um tamanho principal ( width
ou height
) de auto
.
Portanto, de acordo com as especificações, flex-basis
e width
resolva de forma idêntica, a menos que flex-basis
seja auto
ou content
. Nesses casos, flex-basis
pode usar a largura do conteúdo (que, presumivelmente, a width
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 horizontalmente
justify-content: flex-start
- os itens flexíveis serão empilhados no início da linha no eixo principal
align-items: stretch
- os itens flexíveis serão expandidos para cobrir o tamanho cruzado do contêiner
flex-wrap: nowrap
- os itens flexíveis são forçados a permanecer em uma única linha
flex-shrink: 1
- um item flexível pode encolher
Observe 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
/ especificado height
pode ser substituído.
Por exemplo, flex-basis: 100px
ou width: 100px
, juntamente com flex-shrink: 1
, não será necessariamente 100px.
Para renderizar a largura especificada - e mantê-la fixa - você precisará desativar o encolhimento:
div {
width: 100px;
flex-shrink: 0;
}
OU
div {
flex-basis: 100px;
flex-shrink: 0;
}
OU, conforme recomendado pela especificação:
flex: 0 0 100px; /* don't grow, don't shrink, stay fixed at 100px */
7.2 Componentes de flexibilidade
Os autores são incentivados a controlar a flexibilidade usando a flex
abreviação, em vez de diretamente com suas propriedades, pois a redefinição redefine corretamente qualquer componente não especificado para acomodar usos comuns .
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 a width
propriedade, o contêiner respeita o tamanho de seus filhos e se expande de acordo.
Referências:
Exemplos:
flex itens usando flex-basis
e white-space: nowrap
transbordando inline-flex
contêiner. width
trabalho.
Parece que um contêiner flexível definido como inline-flex
não é reconhecido flex-basis
em uma criança ao renderizar um irmão white-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 de flex-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
(e flex-grow
) não está funcionando no elemento da tabela
Referê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 de float
e inline-block
também renderizará a mesma saída defeituosa ( demonstração do jsfiddle ).
Erros que afetam o IE 10 e 11: