Altura da div 100% e expande para caber no conteúdo


172

Eu tenho um elemento div na minha página com sua altura definida como 100%. A altura do corpo também é definida como 100%. A div interna tem um fundo e tudo isso e é diferente do fundo do corpo. Isso funciona para tornar a altura da div 100% da altura da tela do navegador, mas o problema é que tenho conteúdo dentro dessa div que se estende verticalmente além da altura da tela do navegador. Quando rolar para baixo, a div termina no ponto em que você teve que começar a rolar a página, mas o conteúdo excede o limite. Como faço para que a div sempre vá até o fundo para se ajustar ao conteúdo interno?

Aqui está uma simplificação do meu CSS:

body {
    height:100%;
    background:red;
}

#some_div {
    height:100%;
    background:black;
}

Depois de rolar a página, a escuridão termina e o conteúdo flui para o fundo vermelho. Não parece importar se eu definir a posição como relativa ou absoluta no #some_div, o problema ocorre de qualquer maneira. O conteúdo dentro do #some_div é praticamente absolutamente posicionado e é gerado dinamicamente a partir de um banco de dados, portanto, sua altura não pode ser conhecida antecipadamente.

Edit: Aqui está uma captura de tela do problema: problema div


Isso foi perguntado há algumas semanas. Vou ver se consigo encontrar essa pergunta. Eu acredito que comentei sobre isso. editar eu acredito que sua pergunta é semelhante a este: stackoverflow.com/questions/9398313/...
— jmbertucci

por favor seu código para uma melhor compreensão
— sandeep

você pode postar seus pls código completo
— Sven Bieder

23
Você quer todos os meus milhares de linhas de código php, css e javascript? Eu postei a parte de css que era relevante para a questão ...
— Joey

2
NECROPOST é um GO: definindo a propriedade estouro geralmente corrige problemas como estes, onde o conteúdo dentro de uma div está esticando passado ( overflow: hidden;, overflow: scroll;, etc).
— AlbertEngelB

Respostas:


308

Aqui está o que você deve fazer no estilo CSS, nos principais div

display: block;
overflow: auto;

E não toque height


4
Trabalhou muito bem. I necessário para adicionar height: 100%a html, bodyea div recipiente para torná-lo preencher a altura quando não havia conteúdo suficiente embora.
— Nico Huysamen

solução incrível, mas você pode realmente tocar a altura, se o objetivo é algo como uma janela de encaixe responsivo
— Alexis Rabago Carvajal

É display: block;necessário? Divs já são elementos em nível de bloco.
— Max Heiber

ele adiciona uma barra de deslocamento interno para mim (horizontal e vertical)
— Nathan H

Se você ainda obter o elemento pai um pouco mais alto que os elementos filhos, verifique se há espaços extras e / ou  remova-os. Tente também ajustar a altura da linha. Por exemplo, eu coloquei line-height: 0, porque não precisava de texto, apenas para mostrar uma imagem.
— Zorgatone 26/11/2015

57

Defina o heightpara autoe min-heightpara 100%. Isso deve resolver a maioria dos navegadores.

body {
  position: relative;
  height: auto;
  min-height: 100% !important;
}

3
Na IMO, isso responde à pergunta "Como faço para que a div sempre vá até o final para ajustar o conteúdo interno?" melhor do que a resposta atualmente marcada, que simplesmente ativa a rolagem por excesso, em vez de garantir que o div / body se expanda para se ajustar ao seu conteúdo. 1
— Jammerz858

Trabalhou para o meu caso. THX!
— Tyson Nero

Pode valer a pena notar que, por algum motivo, não funciona se heighté 100%e min-heighté auto- eu esperaria que eles fossem intercambiáveis ​​nesse caso, mas parece que não são.
— PeaBrain

13

Normalmente, esse problema surge quando os elementos filho de uma div principal são flutuados. Aqui está a solução mais recente do problema:

No seu arquivo CSS, escreva a seguinte classe chamada .clearfix junto com o pseudo-seletor : after

.clearfix:after {
content: "";
display: table;
clear: both;
}

Em seguida, no seu HTML, adicione a classe .clearfix ao seu div. Por exemplo:

<div class="clearfix">
    <div></div>
    <div></div>
</div>

Deve funcionar sempre. Você pode chamar o nome da classe como .group vez de .clearfix , uma vez que irá tornar o código mais semântico. Observe que, não é necessário adicionar o ponto ou mesmo um espaço no valor do conteúdo entre aspas duplas "". Além disso, estouro: auto; pode resolver o problema, mas causa outros problemas, como mostrar a barra de rolagem, e não é recomendado.

Fonte: Blog de Lisa Catalano e Chris Coyier


8

Se você acabou de deixar o height: 100%e use display:block;o divterá tanto espaço quanto o conteúdo dentro do div. Dessa forma, todo o texto ficará no fundo preto.


Onde você usou display: block? Não vejo isso na sua pergunta.
— Lightness Races em Órbita

Adicionei-o ao #some_div depois que Ronnie o sugeriu, mas não resolveu o problema.
— Joey

1
Você poderia tentar adicionar float: none; Para o mesmo #some_div CSS
— RonnieVDPoel

Em vez de float: none;, use clear:both;. Ele faz a mesma coisa, mas é mais cross-browser, @RonnieVDPoel
— Cannicide

6

Esta pergunta pode ser antiga, mas merece uma atualização. Aqui está outra maneira de fazer isso:

#yourdiv {
    display: flex;
    width:100%;
    height:100%;
}

1
Se você vai postar uma pergunta antiga, recomenda-se o uso de valores atuais (AKA sem prefixos no flex).
— jhpratt

Desculpe, eu não sei do que você está falando.
— User9459537

1
Os prefixos Flex não são necessários há um bom tempo.
— jhpratt

E quais são?
— User9459537 31/01

5

Tente o seguinte:

body { 
    min-height:100%; 
    background:red; 
} 

#some_div {
    min-height:100%; 
    background:black; 
} 

O IE6 e versões anteriores não suportam a propriedade min-height.

Acho que o problema é que, quando você diz ao corpo para ter uma altura de 100%, o fundo só pode ser tão alto quanto a altura de uma "janela de visualização" de um navegador (a área de visualização que exclui as barras de ferramentas, barras de status e barras de menus, e as bordas da janela). Se o conteúdo for mais alto que uma viewport, ele excederá a altura dedicada ao plano de fundo.

Essa propriedade de altura mínima no corpo deve forçar o plano de fundo a ter pelo menos a altura de uma janela de visualização se o conteúdo não preencher uma página inteira até a parte inferior, mas também deve permitir que ele cresça para baixo para abranger mais conteúdo interno.


3

Pergunta antiga, mas no meu caso, achei que o uso position:fixedresolveu para mim. Minha situação pode ter sido um pouco diferente. Eu tinha uma sobreposição semi-transparente divcom uma animação de carregamento que precisava ser exibida enquanto a página estava carregando. Então, usando height:auto / 100%ou min-height: 100%ambos cheios da janela, mas não a área de off-screen. O uso position:fixeddesse rolo de sobreposição com o usuário sempre cobriu a área visível e manteve minha animação de pré-carregamento centralizada na tela.


1

Basta adicionar essas duas linhas no seu css id #some_div

display: block;
overflow: auto;

Depois disso, você receberá o que está procurando!


0

Não tenho muita certeza de ter entendido a pergunta, porque esta é uma resposta bastante direta, mas aqui vai ... :)

Você tentou definir a propriedade overflow do contêiner para visível ou automático?

#some_div {
    height:100%;
    background:black; 
    overflow: visible;
    }

A adição disso deve empurrar o contêiner preto para o tamanho que seu contêiner dinâmico exigir. Prefiro visível ao automático porque o automático parece vir com barras de rolagem ...


0

Navegadores modernos suportam a unidade "altura da janela de exibição". Isso expandirá a div para a altura da viewport disponível. Acho mais confiável do que qualquer outra abordagem.

#some_div {
    height: 100vh;
    background: black;
}

0

Até você pode fazer assim

display:block;
overflow:auto;
height: 100%;

Isso incluirá cada div dinâmico de acordo com o conteúdo. Suponha que, se você tem uma div em comum com a classe, ela aumentará a altura de cada div dinâmica de acordo com o conteúdo


0

Você também pode usar

 display: inline-block;

o meu trabalhou com isso


0

OVERLAY SEM POSIÇÃO: FIXO

Uma maneira muito legal de descobrir isso em um menu recente foi definir o corpo para:

position: relative

e defina sua classe de wrapper assim:

#overlaywrapper {
    position: absolute;
    top: 0;
    width: 100%;
    height: 100%;
    background: #00000080;
    z-index: 100;
}

Isso significa que você não precisa definir a posição fixa e ainda pode permitir a rolagem. Eu usei isso para sobrepor menus realmente grandes.


0

use flex

.parent{
    display: flex
}

.fit-parent{
    display: flex;
    flex-grow: 1
}

0

Ok, eu tentei algo como isto:

corpo (normal)

#MainDiv { 
  /* where all the content goes */
  display: table;
  overflow-y: auto;
}

Não é a maneira exata de escrevê-lo, mas se você exibir a div principal como uma tabela, ela se expandirá e eu implementei barras de rolagem.

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.