O div do contêiner CSS não está obtendo altura


116

Eu quero que meu div do contêiner obtenha a altura máxima de seus filhos. sem saber que altura divvai ter a criança . Eu estava testando no JSFiddle . O contêiner divestá vermelho. que não está aparecendo. Por quê?

Respostas:


282

Adicione a seguinte propriedade:

.c{
    ...
    overflow: hidden;
}

Isso forçará o contêiner a respeitar a altura de todos os elementos dentro dele, independentemente dos elementos flutuantes.
http://jsfiddle.net/gtdfY/3/

ATUALIZAR

Recentemente, eu estava trabalhando em um projeto que exigia esse truque, mas precisava permitir que o estouro fosse exibido, então, em vez disso, você pode usar um pseudoelemento para limpar seus flutuadores, obtendo efetivamente o mesmo efeito enquanto permite o estouro em todos os elementos.

.c:after{
    clear: both;
    content: "";
    display: block;
}

http://jsfiddle.net/gtdfY/368/


8
Basicamente, adicionar esta propriedade força a caixa externa a ignorar a regra que os contêineres flutuantes têm, onde eles não são calculados em altura para os contêineres, e os aplica para o desenho de fundo completo.
Nightfirecat

4
Uau, eu disse, "O quê? Isso não vai funcionar." Mas serei certeiro. Eu pensei totalmente que não iria se comportar corretamente. Obrigado
fie

1
Isso não é meio hacky, realmente? Para mim, isso anula o propósito de estouro. Não entendo por que essa é a resposta correta e mais votada.
Andrew Weir

3
@AndrewWeir Vou admitir, até agora, não tinha certeza de por que esse método de expandir contêineres para considerar corretamente os flutuadores em seu tamanho funcionava. De acordo com várias fontes , parece que isso faz com que um elemento mude seu modo de renderização, de permitir o estouro visível para não fazê-lo, e ao fazer isso, isso força os elementos a impedirem esse estouro.
Nightfirecat

2
A primeira maneira, usando overflow, funciona para mim. A segunda maneira TAMBÉM funciona e parece menos arriscada caso eu tenha transbordamento no futuro. Eu só gostaria de poder votar duas vezes.
Tyler Collier

28

Você está fazendo os filhos flutuarem, o que significa que eles "flutuam" na frente do contêiner. Para obter a altura correta, você deve "limpar" o flutuador

O div style = "clear: both" limpa o flutuante e fornece a altura correta para o contêiner. consulte http://css.maxdesign.com.au/floatutorial/clear.htm para obter mais informações sobre flutuadores.

por exemplo.

<div class="c">
    <div class="l">

    </div>
    <div class="m">
        World
    </div>
    <div style="clear: both" />
</div>

Isso claro: ambos; coisa parece ser uma solução adequada para a altura do contêiner, porque o problema são os filhos flutuantes. Portanto, essa abordagem parece melhor do que o estouro: oculto; um acima.
Ronnie Depp,

Obrigado @Yoeri por compartilhar esta solução simples. Estou procurando a mesma solução para meu novo design, pois já faz quase 6 anos desde a última vez que projetei um layout da web, depois de me concentrar exclusivamente na perspectiva de desenvolvimento de PHP, em vez do lado do design.
Ronnie Depp


4

Tente inserir este div de limpeza antes do último </div>

<div style="clear: both; line-height: 0;">&nbsp;</div>


3

A melhor ea solução mais à prova de balas é adicionar ::beforee ::afterpseudoelements ao recipiente. Portanto, se você tiver, por exemplo, uma lista como:

<ul class="clearfix">
    <li></li>
    <li></li>
    <li></li>
</ul>

E todos os elementos da lista têm float:leftpropriedades, então você deve adicionar ao seu css:

.clearfix::after, .clearfix::before {
     content: '';
     clear: both;
     display: table;
}

Ou você pode tentar a display:inline-block;propriedade, então você não precisa adicionar nenhum clearfix.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.