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


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


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;
}

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


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.


¿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%;
}

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.


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.


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!


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 ...


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;
}

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



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.


0

usar flex

.parent{
    display: flex
}

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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.