Como esticar a altura do div para preencher o div pai - CSS

107

Eu tenho uma página com divs como abaixo

<div id="container">
    <div id="A">
    </div>
    <div id="B">
        <div id="B1"></div>
        <div id="B2">B2</div>
    </div>
    <div id="C"></div>
    <div id="D">
    </div>
</div>

com estilo como;

html, body {
    margin: 0;
    padding: 0;
    border: 0;
}
#B, #C, #D {
    position: absolute;
}
#A{
    top: 0;
    width: 100%;
    height: 35px;
    background-color: #99CC00;
}
#B {
    top: 35px;
    width: 200px;
    bottom: 35px;
    background-color: #999999;
    z-index:100;
}
#B2 {
    margin-top: -35px;
    bottom: 0;
    background-color: #FFFFFF;
    width: 200px;
    overflow: scroll;
}
#B1 {
    height: 35px;
    width: 35px;
    margin-left: 200px;
    background-color: #CC0066;
}
#C {
    top: 35px;
    left: 200px;
    right: 0;
    bottom: 35px;
    background-color: #CCCCCC;
}
#D {
    bottom: 0;
    width: 100%;
    height: 35px;
    background-color: #3399FF;
}

Quero ajustar a altura do div B2para preencher (ou esticar para) todo o div B(marcado com uma borda verde) e não quero cruzar o div D. do rodapé. Aqui está uma demonstração de violino funcional (atualizada). Como posso resolver isso??

Alfred
fonte

Respostas:

38

Basta adicionar height: 100%;ao #B2estilo. min-heightnão deve ser necessário.

Snorbuckle
fonte
4
Será, se o dif estiver vazio.
x10,
39
Má Resposta # B2 será tão alto quanto #B, mas não esticar para preencher o espaço restante como pediu
ninho
3
isso não funciona para um div com um floatpai diferente do que é?
Don Cheadle,
cobre o B1 e ocupa todo o espaço; /
mikus de
1
Isso claramente não funciona, altura: 100% é 100% do contêiner (acho que na maioria das vezes toda a janela de visualização) - sua altura será maior do que o desejado.
BT
25

Suponha que você tenha

<body>
  <div id="root" />
</body>

Com CSS normal, você pode fazer o seguinte. Veja um aplicativo funcional https://github.com/onmyway133/L cycling/ blob/ master/ index.html

#root {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
}

Com o flexbox, você pode

html, body {
  height: 100%
}
body {
  display: flex;
  align-items: stretch;
}

#root {
  width: 100%
}
onmyway133
fonte
10

http://jsfiddle.net/QWDxr/1/

Use a propriedade "min-height"
Tenha cuidado com preenchimentos, margens e bordas :)

html, body {
    margin: 0;
    padding: 0;
    border: 0;
}
#B, #C, #D {
    position: absolute;
}
#A{
    top: 0;
    width: 100%;
    height: 35px;
    background-color: #99CC00;
}
#B {
    top: 35px;
    width: 200px;
    bottom: 35px;
    background-color: #999999;
    z-index:100;
}
#B2 {
    min-height: 100%;
    height: 100%;
    margin-top: -35px;
    bottom: 0;
    background-color: red;
    width: 200px;
    overflow: scroll;
}
#B1 {
    height: 35px;
    width: 35px;
    margin-left: 200px;
    background-color: #CC0066;
}
#C {
    top: 35px;
    left: 200px;
    right: 0;
    bottom: 35px;
    background-color: #CCCCCC;
}
#D {
    bottom: 0;
    width: 100%;
    height: 35px;
    background-color: #3399FF;
}
x10
fonte
1
não .. preenche a página inteira com uma margem superior. Eu só quero preencher o div específicoB
Alfred,
Funciona corretamente no Chrome e Firefox. Se isso não funcionar para você, você pode usar Faux Columns
x10
funciona, mas está cortando o rodapé div id= D. Eu não quero cruzar div d
Alfred
2
height:100%está faltando um ponto e vírgula para o #B2estilo.
Emil
5

O que convinha ao meu objetivo era criar um div que sempre estava limitado pela janela geral do navegador por um valor fixo.

O que funcionou, pelo menos no Firefox, foi este

<div style="position: absolute; top: 127px; left: 75px;right: 75px; bottom: 50px;">

Na medida em que a janela real não é forçada a rolar, o div preserva seus limites para a borda da janela durante todo o redimensionamento.

Espero que isso economize algum tempo.

Leo Smith
fonte
5

Se você vai usar o B2 para fins de estilo, você pode tentar este "hack"

#B { overflow: hidden;}
#B2 {padding-bottom: 9999px; margin-bottom: -9999px}

jsFiddle

Teneff
fonte
1
Isso funciona, obrigado. A propósito, deveria ser margin-bottom: -9999px;. Você está perdendo o menos.
Gaui de
1

Posição relativa do contêiner B2

Posição superior B2 + da altura restante

Altura de B2 + altura B1 ou altura restante

Dmytro Yurchenko
fonte
Definir o nó pai para a posição relativa resolveu meu problema não relacionado! Obrigado!
Deejers
0

Eu uso height: stretch;. Aqui você pode encontrar alguns detalhes sobre o uso.

Ihor
fonte
-4

Eu resolveria isso com uma solução javascript (jQUery) se os tamanhos podem variar.

window.setTimeout(function () {
    $(document).ready(function () {
        var ResizeTarget = $('#B');

        ResizeTarget.resize(function () {
            var target = $('#B2');
            target.css('height', ResizeTarget.height());
        }).trigger('resize');
    }); 
}, 500);
NKCSS
fonte
8
Talvez você queira adicionar isso à sua pergunta :)
NKCSS de
48
A ausência de uma tag javascriptou não é jquerysuficiente?
kapa
1
Isso também é totalmente desnecessário. CSS percorreu um longo caminho nos últimos dois anos. Verifique a caixa flexível e calc ().
Shawn Whinnery
1
Flexbox não suporta <IE10 :(
Constant Meiring
@ConstantMeiring A verdadeira questão é: alguém se importa com o <IE10? ;)
Clonkex