Estou centralizando um DIV dentro de outro DIV usando um flexbox. Pense em uma janela de diálogo que aparece no centro da tela quando necessário.
Funciona bem, no entanto, ficaria muito melhor se o espaço acima e abaixo da caixa de diálogo não fosse exatamente igual, tendo 40% do espaço restante acima e 60% abaixo da caixa de diálogo. Fica complicado porque a altura da caixa de diálogo varia com a quantidade de texto existente.
Por exemplo, se a altura do navegador é de 1000 px e a da janela de diálogo é de 400 px, quero que o espaço vertical restante (600 px) seja 240 px acima e 360 px abaixo da caixa de diálogo. Eu poderia fazê-lo com Javascript, mas estou curioso para saber se existe alguma maneira inteligente com CSS. Tentei adicionar uma margem inferior ao #dialogBox DIV, mas isso não funciona quando a altura da caixa de diálogo está chegando à altura do navegador.
#dialogBoxPanel
{
position:absolute;
display:flex;
align-items:center;
justify-content:center;
left:0px;
top:0px;
width:100%;
height:100%;
}
#dialogBox
{
width:350px;
}
<div id="dialogBoxPanel">
<div id="dialogBox">Text</div>
</div>
Respostas:
Use o pseudo elemento e a direção da coluna para simular o espaço em branco. Simplesmente ajuste o
flex-grow
pseudo-elemento para controlar quanto espaço livre cada um deve ocupar. Flex-grow igual dará espaço igual:Mostrar snippet de código
Você também pode usar
2
e3
. Simplesmente precisamos manter a mesma proporção:Mostrar snippet de código
Outra idéia é usar o valor superior igual a
40%
e retificar a posição com translação (mesma lógica com a50%
centralização)fonte
Esta solução utiliza
display: grid
, é um novo recurso. Verifique o suporte do navegador e clique aqui para saber mais.Esta é a linha que controla os espaços superior e inferior:
grid-template-rows: 40fr [content-start] auto [content-end] 60fr;
O conteúdo do texto do trecho pode ser editado para verificar se a caixa permanece centralizada, mesmo que a altura mude.
fonte
4fr auto 6fr
. O que você tem funciona, mas com algum estouro, já que 40% + 60% + 1fr sempre será maior que 100% e você está centralizando, de modo que o excesso será dividido igualmente da parte superior e inferior: jsfiddle.net/cobutn0e/2 . Você também notará que não é 100% como o esperado #1fr=minmax(auto,1fr)
e no seu caso vai cair paraauto
como não há espaço livre desde 40% + 60% = 100% (é por isso que você sempre terá overflow)Você pode adicionar divs de espaçadores e definir o crescimento flexível com a proporção 4: 6.
fonte
Maneira simples usando a posição e a margem, assumi que a altura da caixa de diálogo é sempre 40% da altura do navegador.
HTML
fonte