Estou tentando preencher o espaço vertical de um item flexível dentro de um Flexbox.
.container {
height: 200px;
width: 500px;
display: flex;
flex-direction: row;
}
.flex-1 {
width: 100px;
background-color: blue;
}
.flex-2 {
position: relative;
flex: 1;
background-color: red;
}
.flex-2-child {
height: 100%;
width: 100%;
background-color: green;
}
<div class="container">
<div class="flex-1"></div>
<div class="flex-2">
<div class="flex-2-child"></div>
</div>
</div>
E aqui está o JSFiddle
flex-2-child
não preenche a altura necessária, exceto nos dois casos em que:
flex-2
tem uma altura de 100% (o que é estranho, porque um item flexível tem 100% por padrão + é defeituoso no Chrome)flex-2-child
tem uma posição absoluta que também é inconveniente
No momento, isso não funciona no Chrome ou Firefox.
height:100%
mas eles são renderizados com altura natural. E o mais estranho é que se eu mudar a altura delesauto
, eles se renderãoheight:100%
como se eu estivesse tentando fazer. Definitivamente, não é intuitivo se é assim que deve funcionar.Respostas:
Usar
align-items: stretch
Semelhante à resposta de David Storey, minha solução alternativa é:
Como alternativa
align-items
, você pode usaralign-self
apenas o.flex-2-child
item que deseja esticar.fonte
stretch
: esta deve ser a resposta escolhida.height: 100%
do componente filho que você deseja a mesma altura que o paiheight: 100%
à resposta - eu quase desisti e só vi isso no último momento antes de voltar paraabsolute
-, que vem com todos os tipos de problemas.Eu respondi uma pergunta semelhante aqui .
Eu sei que você já disse que
position: absolute;
é inconveniente, mas funciona. Veja abaixo mais informações sobre como corrigir o problema de redimensionamento.Veja também este jsFiddle para obter uma demonstração, embora eu tenha adicionado apenas prefixos de kit da web tão abertos no Chrome.
Você basicamente tem 2 questões que tratarei separadamente.
position: relative;
no pai da criança.position: absolute;
na criança.overflow-y: auto;
a div rolável.height: 0;
Consulte esta resposta para obter mais informações sobre a questão da rolagem.
fonte
Se bem entendi, você deseja que o flex-2-child preencha a altura e a largura de seu pai, para que a área vermelha seja totalmente coberta pelo verde?
Nesse caso, você só precisa configurar o flex-2 para usar o flexbox:
Em seguida, diga ao flex-2-child para se tornar flexível:
Veja http://jsfiddle.net/2ZDuE/10/
O motivo é que flex-2-child não é um item do flexbox, mas seu pai é.
fonte
align-items: center
se usaralign-self: stretch
apenas uma criança.min-height: 100vh;
ao.flex-2
elemento para fazê-lo funcionar. Obrigado pela ajuda!Suponho que o comportamento do Chrome seja mais consistente com a especificação CSS (embora seja menos intuitivo). De acordo com as especificações do Flexbox, o
stretch
valor padrão daalign-self
propriedade altera apenas o valor usado da "propriedade de tamanho cruzado" do elemento (height
neste caso). E, como eu entendo a especificação CSS2.1 , as alturas de porcentagem são calculadas a partir do valor especificado do paiheight
, não do valor usado. O valor especificado dos paisheight
não é afetado por nenhuma propriedade flex e ainda éauto
.Definir explícito
height: 100%
torna formalmente possível calcular a altura percentual da criança, assim como definirheight: 100%
parahtml
torna possível calcular a altura percentualbody
no CSS2.1.fonte
height:100%
a.flex-2
. Aqui está o jsfiddle .height: 100%
está fornecendo resultados muito estranhos para mim no Chrome. Parece que isso faz com que a "altura especificada" seja definida como a altura total do contêiner , em vez da altura do próprio elemento, causando rolagem indesejada quando outros elementos têm tamanhos calculados em relação a ele.Encontrei a solução sozinho, suponha que você tenha o CSS abaixo:
Nesse caso, definir a altura 100% não funcionará; portanto, o que faço é definir a
margin-bottom
regra paraauto
, como:e o filho estiver alinhado com a parte superior do pai, você também pode usar a
align-self
regra de qualquer maneira, se preferir.fonte
Uma idéia seria que
display:flex;
comflex-direction: row;
está preenchendo acontainer
div com.flex-1
e.flex-2
, mas isso não significa que ela.flex-2
tenha um padrão,height:100%;
mesmo que ela seja estendida até a altura máxima e tenha um elemento filho (.flex-2-child
) com oheight:100%;
qual você precisará definir o paiheight:100%;
ou usardisplay:flex;
comflex-direction: row;
no.flex-2
div também.Pelo que sei
display:flex
, não estenderá a altura de todos os elementos filhos para 100%.Uma pequena demonstração, removida a altura
.flex-2-child
e usadadisplay:flex;
em.flex-2
: http://jsfiddle.net/2ZDuE/3/fonte
html
css
http://jsfiddle.net/2ZDuE/750/
fonte
Isso também pode ser resolvido com
align-self: stretch;
o elemento que queremos ser esticado.Às vezes, é desejável esticar apenas um item em uma configuração do flexbox.
fonte
.container {. . . . alinhar itens: alongar; . . . . }
fonte
Esta é a minha solução usando css +
Antes de tudo, se o primeiro filho (flex-1) deve ter 100px, não deve ser flex. De fato, no css + você pode definir elementos flexíveis e / ou estáticos (colunas ou linhas) e seu exemplo se torna tão fácil quanto isto:
CSS do contêiner:
e obviamente inclui css + 0.2 core
ouvir o violino
fonte