Altura div 100% y se expande para adaptarse al contenido

172

Tengo un elemento div en mi página con su altura establecida al 100%. La altura del cuerpo también se establece en 100%. El div interno tiene un fondo y todo eso y es diferente del fondo del cuerpo. Esto funciona para hacer que la altura del div sea el 100% de la altura de la pantalla del navegador, pero el problema es que tengo contenido dentro de ese div que se extiende verticalmente más allá de la altura de la pantalla del navegador. Cuando me desplazo hacia abajo, el div termina en el punto en el que tenía que comenzar a desplazarse por la página, pero el contenido se desborda más allá de eso. ¿Cómo hago para que el div siempre vaya hasta el fondo para adaptarse al contenido interno?

Aquí hay una simplificación de mi CSS:

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

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

Una vez que desplazo la página, la negrura termina y el contenido fluye hacia el fondo rojo. No parece importar si configuro la posición en relativo o absoluto en #some_div, el problema ocurre de cualquier manera. El contenido dentro del #some_div está en su mayoría absolutamente posicionado, y se genera dinámicamente desde una base de datos, por lo que su altura no se puede conocer de antemano.

Editar: Aquí hay una captura de pantalla del problema: problema div

Joey
fuente
Esto fue preguntado hace unas semanas. Veré si puedo encontrar esa pregunta. Creo que lo comenté. editar Creo que su pregunta es similar a esta: stackoverflow.com/questions/9398313/…
jmbertucci
por favor, su código para una mejor comprensión
sandeep
puede publicar su código completo por favor
Sven Bieder
23
¿Quieres todas mis miles de líneas de código php, css y javascript? Publiqué la parte de CSS que era relevante para la pregunta ...
Joey
2
NECROPOST es un GO: establecer la propiedad de desbordamiento generalmente corrige problemas como estos, donde el contenido dentro de un div es el estiramiento pasado ( overflow: hidden;, overflow: scroll;, etc.).
AlbertEngelB

Respuestas:

308

Esto es lo que debe hacer en el estilo CSS, en general div

display: block;
overflow: auto;

Y no tocar height

João Pimentel Ferreira
fuente
44
Funcionó muy bien. Yo tenía que añadir height: 100%a html, bodyy el div contenedor para que se llene la altura cuando no había suficiente contenido embargo.
Nico Huysamen
Una solución increíble, pero en realidad puedes tocar la altura si el objetivo es algo así como un ajuste de ventana sensible
Alexis Rabago Carvajal
¿Es display: block;necesario? Los div ya son elementos de nivel de bloque.
Max Heiber
agrega una barra de desplazamiento interna para mí (horizontal y vertical)
Nathan H
Si aún obtiene el elemento primario un poco más alto que los elementos secundarios, compruebe si hay espacios adicionales y / o  elimínelos. Intente también ajustar la altura de la línea. Por ejemplo, lo he puesto line-height: 0, porque no necesitaba texto, solo para mostrar una imagen.
Zorgatone
57

Establezca el heightto autoy min-heightto 100%. Esto debería resolverlo para la mayoría de los navegadores.

body {
  position: relative;
  height: auto;
  min-height: 100% !important;
}
Matthew Sprankle
fuente
3
En mi opinión, esto responde a la pregunta "¿Cómo hago para que el div siempre vaya hasta el fondo para adaptarse al contenido interno?" mejor que la respuesta actualmente marcada, que simplemente activa el desplazamiento de desbordamiento en lugar de garantizar que el div / cuerpo se expanda para adaptarse a su contenido. +1
Jammerz858
Trabajó para mi caso. ¡Gracias!
Tyson Nero
Vale la pena señalar que, por alguna razón, no funciona si heightes 100%y min-heightes auto- esperaría que estos sean intercambiables en este caso, pero parece que no lo son.
PeaBrain
13

Por lo general, este problema surge cuando los elementos Child de un Div Parent se hacen flotar. Aquí está la última solución del problema:

En su archivo CSS escriba la siguiente clase llamada .clearfix junto con el pseudo selector : después

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

Luego, en su HTML, agregue la clase .clearfix a su Div principal. Por ejemplo:

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

Debería funcionar siempre. Puede llamar al nombre de la clase como .group en lugar de .clearfix , ya que hará que el código sea más semántico. Tenga en cuenta que no es necesario agregar el punto o incluso un espacio en el valor de Contenido entre la comilla doble "". Además, desbordamiento: auto; puede resolver el problema pero causa otros problemas como mostrar la barra de desplazamiento y no se recomienda.

Fuente: Blog de Lisa Catalano y Chris Coyier

Ifti Mahmud
fuente
8

Si solo deja el height: 100%y usa display:block;el div, ocupará tanto espacio como el contenido dentro del div. De esta manera, todo el texto permanecerá en el fondo negro.

RonnieVDPoel
fuente
¿Dónde lo usaste display: block? No veo eso en tu pregunta.
Carreras de ligereza en órbita el
Lo agregué a #some_div después de que Ronnie lo sugirió, pero no solucionó el problema.
Joey
1
¿Podría intentar agregar flotante: ninguno; al mismo #some_div css
RonnieVDPoel
En lugar de float: none;usar clear:both;. Hace lo mismo pero es más cross-browser, @RonnieVDPoel
Cannicide
7

Esta pregunta puede ser antigua, pero merece una actualización. Aquí hay otra forma de hacer eso:

#yourdiv {
    display: flex;
    width:100%;
    height:100%;
}
usuario9459537
fuente
1
Si va a publicar en una pregunta anterior, se recomienda usar valores actuales (AKA sin prefijos en flex).
jhpratt
Lo siento, no sé de qué estás hablando.
user9459537
1
Los prefijos flexibles no han sido necesarios desde hace bastante tiempo.
jhpratt
¿Y cuáles son?
user9459537
5

Prueba esto:

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

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

IE6 y versiones anteriores no admiten la propiedad min-height.

Creo que el problema es que cuando le dices al cuerpo que tenga una altura del 100%, su fondo solo puede ser tan alto como el alto de la "vista" de un navegador (el área de visualización que excluye las barras de herramientas de los navegadores y las barras de estado y barras de menús y el bordes de la ventana). Si el contenido es más alto que una ventana gráfica, desbordará la altura dedicada al fondo.

Esta propiedad de altura mínima en el cuerpo debe FORZAR que el fondo sea al menos tan alto como una ventana gráfica si su contenido no llena una página entera hasta el final, pero también debe permitir que crezca hacia abajo para abarcar más contenido interior.

Ace Frahm
fuente
3

Antigua pregunta, pero en mi caso encontré el uso position:fixedresuelto para mí. Sin embargo, mi situación podría haber sido un poco diferente. Tenía un semitransparente superpuesto divcon una animación de carga que necesitaba mostrar mientras se cargaba la página. Entonces, usar height:auto / 100%o min-height: 100%ambos llenó la ventana pero no el área fuera de la pantalla. Utilizando position:fixedeste desplazamiento superpuesto con el usuario, siempre cubría el área visible y mantenía mi animación de precarga centrada en la pantalla.

Thomas Smart
fuente
1

Simplemente agregue estas dos líneas en su ID de CSS #some_div

display: block;
overflow: auto;

¡Después de eso obtendrás lo que estás buscando!

Singhviku
fuente
0

No estoy completamente seguro de haber entendido la pregunta porque esta es una respuesta bastante sencilla, pero aquí va ... :)

¿Has intentado configurar la propiedad de desbordamiento del contenedor en visible o automático?

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

Agregar eso debería empujar el contenedor negro al tamaño que requiera su contenedor dinámico. Prefiero visible a automático porque parece que viene con barras de desplazamiento ...

jlisham
fuente
0

Los navegadores modernos admiten la unidad de "altura de ventana gráfica". Esto expandirá el div a la altura de vista disponible. Lo encuentro más confiable que cualquier otro enfoque.

#some_div {
    height: 100vh;
    background: black;
}
devdrc
fuente
0

Incluso tú puedes hacer así

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

Esto incluirá cada div dinámico según el contenido. Suponga que si tiene un div común con clase, aumentará la altura de cada div dinámico según el contenido

Ahmed Sharief
fuente
0

También puedes usar

 display: inline-block;

el mío trabajó con esto

Parthan_akon
fuente
0

REVESTIMIENTO SIN POSICIÓN: FIJO

Una forma realmente genial de resolver esto para un menú reciente fue configurar el cuerpo para:

position: relative

y configura tu clase de envoltura así:

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

Esto significa que no tiene que establecer la posición fija y aún puede permitir el desplazamiento. Lo he usado para superponer menús que son REALMENTE grandes.

Benjamin Vaughan
fuente
0

usar flex

.parent{
    display: flex
}

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

Ok, intenté algo como esto:

cuerpo (normal)

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

No es la forma exacta de escribirlo, pero si haces que la pantalla div principal se muestre como una tabla, se expande y luego implemento barras de desplazamiento.

alex
fuente