Estoy trabajando en una aplicación web donde quiero que el contenido llene la altura de toda la pantalla.
La página tiene un encabezado, que contiene un logotipo e información de la cuenta. Esto podría ser una altura arbitraria. Quiero que el div de contenido llene el resto de la página hasta el final.
Tengo un encabezado div
y un contenido div
. En este momento estoy usando una tabla para el diseño de esta manera:
CSS y HTML
#page {
height: 100%; width: 100%
}
#tdcontent {
height: 100%;
}
#content {
overflow: auto; /* or overflow: hidden; */
}
<table id="page">
<tr>
<td id="tdheader">
<div id="header">...</div>
</td>
</tr>
<tr>
<td id="tdcontent">
<div id="content">...</div>
</td>
</tr>
</table>
Se llena toda la altura de la página y no se requiere desplazamiento.
Para cualquier cosa dentro del contenido div, la configuración top: 0;
lo colocará justo debajo del encabezado. A veces, el contenido será una tabla real, con su altura establecida al 100%. Poner header
dentro content
no permitirá que esto funcione.
¿Hay alguna manera de lograr el mismo efecto sin usar el table
?
Actualizar:
Los elementos dentro del contenido div
también tendrán alturas establecidas en porcentajes. Entonces, algo al 100% dentro div
lo llenará hasta el fondo. Como lo harán dos elementos al 50%.
Actualización 2:
Por ejemplo, si el encabezado ocupa el 20% de la altura de la pantalla, una tabla especificada al 50% en el interior #content
ocuparía el 40% del espacio de la pantalla. Hasta ahora, envolver todo en una tabla es lo único que funciona.
fuente
display:table
propiedades relacionadas, consulte esta respuesta a una pregunta muy similar.Respuestas:
Actualización 2015: el enfoque flexbox
Hay otras dos respuestas que mencionan brevemente flexbox ; Sin embargo, eso fue hace más de dos años, y no proporcionan ningún ejemplo. La especificación para flexbox definitivamente se ha establecido ahora.
Todos los principales navegadores e IE11 + son compatibles con Flexbox. Para IE 10 o anterior, puede usar la cuña FlexieJS.
Para consultar el soporte actual, también puede ver aquí: http://caniuse.com/#feat=flexbox
Ejemplo de trabajo
Con flexbox puede cambiar fácilmente entre cualquiera de sus filas o columnas que tengan dimensiones fijas, dimensiones del tamaño del contenido o dimensiones del espacio restante. En mi ejemplo, configuré el encabezado para que se ajuste a su contenido (según la pregunta de los OP), agregué un pie de página para mostrar cómo agregar una región de altura fija y luego configuré el área de contenido para llenar el espacio restante.
En el CSS anterior, los flex taquigrafías propiedad del flex-Grow , flex-contracción y flexible básicos propiedades para establecer la flexibilidad de los elementos flexibles. Mozilla tiene una buena introducción al modelo de cajas flexibles .
fuente
flex: 0 1 30px;
atributo enbox .row
como se anula en cada div?overflow-y: auto
a.row.content
lograr lo que sin embargo es necesario.Realmente no hay una forma de sonido cruzada para hacer esto en CSS. Suponiendo que su diseño tiene complejidades, debe usar JavaScript para establecer la altura del elemento. La esencia de lo que necesitas hacer es:
Una vez que pueda obtener este valor y establecer la altura del elemento, debe adjuntar controladores de eventos a la ventana onload y onresize para que pueda activar su función de cambio de tamaño.
Además, suponiendo que su contenido pueda ser más grande que la ventana gráfica, necesitará configurar overflow-y para desplazarse.
fuente
La publicación original es hace más de 3 años. Supongo que muchas personas que vienen a esta publicación como yo están buscando una solución de diseño similar a una aplicación, digamos un encabezado, pie de página y contenido de altura completa que de alguna manera ocupan la pantalla de descanso. Si es así, esta publicación puede ayudar, funciona en IE7 +, etc.
http://blog.stevensanderson.com/2011/10/05/full-height-app-layouts-a-css-trick-to-make-it-easier/
Y aquí hay algunos fragmentos de esa publicación:
fuente
display: table
en el cuerpo, parece desbordarlo. Hacerloheight: 100%
no produce la altura correcta..col
no se usa, ¿verdad?En lugar de usar tablas en el marcado, puede usar tablas CSS.
Margen
(Relevante) CSS
FIDDLE1 y FIDDLE2
Algunas ventajas de este método son:
1) Menos marcado
2) El marcado es más semántico que las tablas, porque no se trata de datos tabulares.
3) El soporte del navegador es muy bueno : IE8 +, todos los navegadores modernos y dispositivos móviles ( caniuse )
Solo para completar, aquí están los elementos HTML equivalentes a las propiedades css para el modelo de tabla CSS
fuente
html, body { height: 100%, width: 100% }
parecía crítico en mis pruebas.relative
posicionamiento en eltable-row
elemento, por lo que toma la altura del ascendente en la primera posición que no es un elemento de tabla.Aproximación solo CSS (si la altura es conocida / fija)
Cuando desee que el elemento central abarque toda la página verticalmente, puede usar el
calc()
que se introduce en CSS3.Suponiendo que tenemos una altura
header
yfooter
elementos fijos y queremos que lasection
etiqueta tome toda la altura vertical disponible ...Manifestación
Supuesto marcado y su CSS debe ser
Entonces, aquí, lo que estoy haciendo es sumar la altura de los elementos y luego deducir del
100%
uso de lacalc()
función.Solo asegúrese de usarlo
height: 100%;
para los elementos principales.fuente
Usado:
height: calc(100vh - 110px);
código:
fuente
Una solución simple, usando flexbox:
Codepen muestra
Una solución alternativa, con un div centrado dentro del contenido div
fuente
¿Qué tal sólo tiene que utilizar
vh
lo que significaview height
en CSS ...Mira el fragmento de código que creé para ti a continuación y ejecútalo:
Además, mira la imagen a continuación que creé para ti:
fuente
CSS3 manera simple
todos los principales navegadores de estos días lo admiten, así que adelante si no tiene el requisito de admitir navegadores antiguos.
fuente
Se podría hacer simplemente
CSS
usandovh
:y el
HTML
Lo he comprobado, Funciona en todos los principales navegadores:
Chrome
,IE
yFireFox
fuente
vh
yvw
antes. Más información: snook.ca/archives/html_and_css/vm-vh-unitsheight: 100%
encendido#content
causó que su altura coincidiera con la de#page
, ignorando#tdcontent
por completo la altura. Con mucho contenido, la barra de desplazamiento se extiende más allá de la parte inferior de la página.Ninguna de las soluciones publicadas funciona cuando necesita que el div inferior se desplace cuando el contenido es demasiado alto. Aquí hay una solución que funciona en ese caso:
Fuente original: llenar la altura restante de un contenedor mientras se maneja el desbordamiento en CSS
Vista previa en vivo de JSFiddle
fuente
body-content-wrapper
, y las cosas parecen funcionar bien sin el doble envoltorio (sin ningúntable-cell
s). ¿Hay algún problema al hacerlo de esa manera?.body
altura termina siendo la misma altura que la configurada.container
. La barra de desplazamiento vertical todavía está en el lugar correcto, pero al.container
final se estira más de lo que queremos. Cuando está en pantalla completa, la parte inferior.body
está fuera de la parte inferior de la pantalla.He estado buscando una respuesta para esto también. Si tiene la suerte de poder apuntar a IE8 y superior, puede usar
display:table
valores relacionados para obtener las reglas de representación de tablas con elementos de nivel de bloque, incluido div.Si eres aún más afortunado y tus usuarios usan navegadores de primer nivel (por ejemplo, si se trata de una aplicación de intranet en las computadoras que controlas, como lo es mi último proyecto), ¡puedes usar el nuevo diseño de caja flexible en CSS3!
fuente
Lo que funcionó para mí (con un div dentro de otro div y supongo que en todas las demás circunstancias) es establecer el relleno inferior al 100%. Es decir, agregue esto a su hoja de estilo / CSS:
fuente
HTML 5
CSS
La solución anterior usa unidades de ventana gráfica y flexbox , y por lo tanto es IE10 +, siempre que use la sintaxis anterior para IE10.
Codepen para jugar: enlace a codepen
O este, para aquellos que necesitan que el contenedor principal sea desplazable en caso de contenido desbordado: enlace al codepen
fuente
Ahora hay un montón de respuestas, pero descubrí que usar
height: 100vh;
para trabajar en el elemento div que necesita llenar todo el espacio vertical disponible.De esta manera, no necesito jugar con la pantalla o el posicionamiento. Esto fue útil cuando utilicé Bootstrap para hacer un tablero en el que tenía una barra lateral y una principal. Quería que el principal se estirara y llenara todo el espacio vertical para poder aplicar un color de fondo.
Admite IE9 y versiones posteriores: haga clic para ver el enlace
fuente
En todos los navegadores sanos, puede poner el div "encabezado" antes del contenido, como un hermano, y el mismo CSS funcionará. Sin embargo, IE7- no interpreta la altura correctamente si el flotante es 100% en ese caso, por lo que el encabezado debe estar EN el contenido, como se indicó anteriormente. El desbordamiento: auto causará barras de desplazamiento dobles en IE (que siempre tiene la barra de desplazamiento de la vista visible, pero deshabilitada), pero sin ella, el contenido se recortará si se desborda.
fuente
div
... es decirtop: 0;
, pondré algo justo debajo del encabezado. ¡Modificaré mi pregunta nuevamente, porque la respondiste perfectamente y todavía no es lo que quiero! Solo ocultaré el desbordamiento ya que el contenido debe encajar.Luché con esto por un tiempo y terminé con lo siguiente:
Dado que es fácil hacer que el contenido DIV tenga la misma altura que el padre pero aparentemente es difícil hacerlo con la altura del padre menos la altura del encabezado, decidí hacer que el contenido se divida en la altura completa, pero colóquelo absolutamente en la esquina superior izquierda y luego defina un relleno para la parte superior que tiene la altura del encabezado. De esta forma, el contenido se muestra perfectamente debajo del encabezado y llena todo el espacio restante:
fuente
Si puede tratar de no admitir navegadores antiguos (es decir, MSIE 9 o anterior), puede hacerlo con el Módulo de diseño de caja flexible que ya es W3C CR. Ese módulo también permite otros buenos trucos, como reordenar contenido.
Desafortunadamente, MSIE 9 o versiones anteriores no son compatibles y debe usar el prefijo del proveedor para la propiedad CSS para todos los navegadores que no sean Firefox. Esperemos que otros proveedores también eliminen el prefijo pronto.
Otra opción sería CSS Grid Layout, pero eso tiene aún menos soporte de las versiones estables de los navegadores. En la práctica, solo MSIE 10 lo admite.
Actualización año 2020 : Todos los navegadores modernos son compatibles con ambos
display: flex
ydisplay: grid
. Lo único que falta es soporte para elsubgrid
cual solo es compatible con Firefox. Tenga en cuenta que MSIE tampoco es compatible con la especificación, pero si está dispuesto a agregar hacks CSS específicos de MSIE, puede hacerlo funcionar. Sugeriría simplemente ignorar a MSIE porque incluso Microsoft dice que ya no debería usarse.fuente
Solución de cuadrícula CSS
Simplemente definiendo la propiedad
body
withdisplay:grid
y thegrid-template-rows
usingauto
y thefr
value.Una guía completa de cuadrículas @ CSS-Tricks.com
fuente
¿Por qué no solo así?
¿Le da una altura html y cuerpo (en ese orden) y luego solo le da una altura a sus elementos?
Funciona para mi
fuente
En realidad, puede usar
display: table
para dividir el área en dos elementos (encabezado y contenido), donde el encabezado puede variar en altura y el contenido llena el espacio restante. Esto funciona con toda la página, así como cuando el área es simplemente el contenido de otro elemento posicionado conposition
set torelative
,absolute
orfixed
. Funcionará siempre que el elemento padre tenga una altura distinta de cero.Vea este violín y también el código a continuación:
CSS:
HTML:
fuente
Resuelto el problema para mí. En mi caso, apliqué esto al div requerido
fuente
Vincent, te responderé nuevamente usando tus nuevos requisitos. Como no le importa que el contenido esté oculto si es demasiado largo, no necesita flotar el encabezado. Simplemente coloque el desbordamiento oculto en las etiquetas html y body, y configure la
#content
altura al 100%. El contenido siempre será más largo que la ventana gráfica por la altura del encabezado, pero estará oculto y no provocará barras de desplazamiento.fuente
table
porque funciona. Aún así gracias por la actualización.Prueba esto
fuente
Encontré una solución bastante simple, porque para mí era solo un problema de diseño. Quería que el resto de la página no fuera blanco debajo del pie de página rojo. Así que configuré el color de fondo de las páginas en rojo. Y el contenido backgroundcolor a blanco. Con la altura de contenido establecida en p. Ej. 20em o 50% una página casi vacía no dejará toda la página roja.
fuente
Tuve el mismo problema pero no pude hacer que el trabajo fuera la solución con los flexboxes anteriores. Así que creé mi propia plantilla, que incluye:
Utilicé flexboxes pero de una manera más simple, utilizando solo las propiedades display: flex y flex-direction: row | column :
Yo uso angular y quiero que el tamaño de mis componentes sea el 100% de su elemento padre.
La clave es establecer el tamaño (en porcentajes) de todos los padres para limitar su tamaño. En el siguiente ejemplo, la altura de myapp tiene el 100% de la ventana gráfica.
El componente principal tiene el 90% de la ventana gráfica, porque el encabezado y el pie de página tienen el 5%.
Publiqué mi plantilla aquí: https://jsfiddle.net/abreneliere/mrjh6y2e/3
HTML:
fuente
Para la aplicación móvil, solo uso VH y VW
Demostración: https://jsfiddle.net/u763ck92/
fuente
Derivando la idea del Sr. Alien ...
Esta parece una solución más limpia que la popular caja flexible para navegadores habilitados para CSS3.
Simplemente use min-height (en lugar de height) con calc () para el bloque de contenido.
El calc () comienza con 100% y resta las alturas de los encabezados y pies de página (debe incluir valores de relleno)
El uso de "altura mínima" en lugar de "altura" es particularmente útil para que pueda funcionar con contenido renderizado de JavaScript y marcos JS como Angular2. De lo contrario, el cálculo no empujará el pie de página al final de la página una vez que el contenido renderizado de JavaScript esté visible.
Aquí hay un ejemplo simple de un encabezado y pie de página con 50 píxeles de altura y 20 píxeles de relleno para ambos.
HTML:
Css:
Por supuesto, las matemáticas pueden simplificarse, pero se entiende la idea ...
fuente
En Bootstrap:
Estilos CSS:
1) Simplemente llene la altura del espacio de pantalla restante:
2) llene la altura del espacio restante de la pantalla y alinee el contenido al centro del elemento principal:
fuente
Esta es mi propia versión mínima de la solución de Pebbl. Tomó una eternidad encontrar el truco para que funcione en IE11. (También probado en Chrome, Firefox, Edge y Safari).
fuente