Faça com que o div externo tenha automaticamente a mesma altura de seu conteúdo flutuante


94

Eu quero o exterior div, que é preto, para envolver seus divs flutuantes dentro dele. Não quero usar style='height: 200pxno divcom o outerdivid, pois quero que seja automaticamente a altura de seu conteúdo (por exemplo, os flutuantes div).

<div id='outerdiv' style='border: 1px solid black;background-color: black;'>
<div style='width=300px;border: red 1px dashed;float: left;'>
    <p>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p>
</div>

<div style='width=300px;border: red 1px dashed;float: right;'>
    <p>zzzzzzzzzzzzzzzzzzzzzzzzzzzzz</p>
</div>

Como fazer isso?

Respostas:


167

Você pode definir o outerdivCSS de para este

#outerdiv {
    overflow: hidden; /* make sure this doesn't cause unexpected behaviour */
}

Você também pode fazer isso adicionando um elemento no final com clear: both. Isso pode ser adicionado normalmente, com JS (não é uma boa solução) ou com :afterpseudoelemento CSS (não amplamente suportado em IEs mais antigos).

O problema é que os contêineres não se expandem naturalmente para incluir filhos flutuantes. Esteja avisado ao usar o primeiro exemplo, se você tiver quaisquer elementos filhos fora do elemento pai, eles serão ocultados. Você também pode usar 'auto' como o valor da propriedade, mas isso invocará barras de rolagem se algum elemento aparecer fora.

Você também pode tentar flutuar o contêiner pai, mas dependendo do seu projeto, isso pode ser impossível / difícil.


37
Eu gostaria de ter entendido a lógica de por que estouro: obras ocultas neste caso.
masteroleary

2
Sim, eu esperava que não fosse só eu que pensasse que isso era contra-intuitivo. alex?
sessão regular de

3
@masteroleary @regularmike HTML/CSSnunca foi uma boa tecnologia de IU, então coisas contra-intuitivas são bastante comuns :)
Yuriy Nakonechnyy

2
@masteroleary Sei que este é um tópico antigo, mas recentemente tentei responder a uma pergunta semelhante em stackoverflow.com/questions/21041297#21041625 - espero que ajude
xec

1
1 para a floatsolução. Funciona muito bem com as outras falhas, especialmente quando emparelhado com o Twitter Bootstrap.
Fizzix

17

Em primeiro lugar, eu recomendo fortemente que você faça seu estilo CSS em um arquivo CSS externo, ao invés de fazê-lo embutido. É muito mais fácil de manter e pode ser mais reutilizável usando classes.

Resolvendo a resposta de Alex (e clearfix de Garret) de "adicionar um elemento no final com clear: both", você pode fazer assim:

    <div id='outerdiv' style='border: 1px solid black; background-color: black;'>
        <div style='width: 300px; border: red 1px dashed; float: left;'>
            <p>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p>
        </div>

        <div style='width: 300px; border: red 1px dashed; float: right;'>
            <p>zzzzzzzzzzzzzzzzzzzzzzzzzzzzz</p>
        </div>
        <div style='clear:both;'></div>
    </div>

Isso funciona (mas como você pode ver, CSS inline não é tão bonito).


Por que fui classificado como inferior? Funciona, e eu reconheci com razão que não era uma solução bonita.
Lycana

1
Não tenho certeza, marquei com +1 para voltar a 0, pelo menos. Talvez você tenha sido rejeitado porque não corrigiu o CSS incorreto dele ... ou seja, usar o sinal de igual para definir uma propriedade CSS é incorreto.
alex

justo. Agradeço o +1 alex. Achei que era a minha declaração justa.
Lycana

Esta solução é melhor IMO. Eu teria aceitado essa resposta se fosse minha pergunta.
ksg91


7

Eu sei que algumas pessoas vão me odiar, mas eu descobri display:table-cell para ajudar nesses casos.

É muito mais limpo.


div externo usar exibição: tabela; e dentro de div use display: table-cell;
Anukul Limpanasil

4

Em primeiro lugar, você não deve usar width=300pxessa configuração de atributo para a tag, não CSS, use width: 300px;.

Eu sugeriria aplicar a clearfixtécnica no #outerdiv. Clearfix é uma solução geral para limpar 2 divs flutuantes para que o div pai se expanda para acomodar os 2 divs flutuantes.

<div id='outerdiv' class='clearfix' style='width:600px; background-color: black;'>
    <div style='width:300px; float: left;'>
        <p>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p>
    </div>

    <div style='width:300px; float: left;'>
        <p>zzzzzzzzzzzzzzzzzzzzzzzzzzzzz</p>
    </div>
</div>

Aqui está um exemplo de sua situação e o que Clearfix faz para resolvê-la.


3

Use jQuery:

Definir altura pai = offsetHeight filho.

$(document).ready(function() {
    $(parent).css("height", $(child).attr("offsetHeight"));
}

3
Exagero, quando você pode fazer isso apenas com CSS.
alex

1
Com a minha resposta, você pode definir a altura do pai igual à altura do filho, mas usando o overflow não estamos alterando a altura do pai, o que criará algum problema se estivermos exibindo dados após o div pai.
Harpal

1

Usar clear: both;

Passei mais de uma semana tentando descobrir isso!

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.