¿Cómo puede un elemento html llenar el 100% de la altura restante de la pantalla, usando solo css?


118

Tengo un elemento de encabezado y un elemento de contenido:

#header
#content

Quiero que el encabezado sea de altura fija y que el contenido llene toda la altura restante disponible en la pantalla, con overflow-y: scroll;.

¿Es esto posible sin Javascript?

Respuestas:


83

El truco para esto es especificar 100% de altura en los elementos html y body. Algunos navegadores buscan los elementos principales (html, body) para calcular la altura.

<html>
    <body>
        <div id="Header">
        </div>
        <div id="Content">
        </div>
    </body>
</html>

html, body
{
    height: 100%;
}
#Header
{
    width: 960px;
    height: 150px;
}
#Content
{
    height: 100%;
    width: 960px;
}

1
Intenté todas las soluciones, pero solo esto resolvió mi problema.
Alex

1
@Alex, si esto funciona para todos los navegadores a los que se dirige, entonces, por supuesto, impleméntelo. Los requisitos de cada persona son diferentes.
BentOnCoding

321

olvídate de todas las respuestas, esta línea de CSS funcionó para mí en 2 segundos:

height:100vh;

1vh = 1% de la altura de la pantalla del navegador

fuente

Para el escalado de diseño receptivo, es posible que desee utilizar:

min-height: 100vh

[actualización de noviembre de 2018] Como se menciona en los comentarios, el uso de la altura mínima puede evitar problemas con los diseños de respuesta

[actualización de abril de 2018] Como se menciona en los comentarios, en 2011, cuando se hizo la pregunta, no todos los navegadores admitían las unidades de visualización. Las otras respuestas fueron las soluciones en ese entonces: vmaxtodavía no es compatible con IE, por lo que esta podría no ser la mejor solución para todos todavía.


9
Esta es la respuesta más simple, ya que no necesita establecer la altura de todos los elementos principales al 100%. Aquí está el soporte actual para vh - caniuse.com/#feat=viewport-units - iOS aparentemente podría necesitar una solución, ya que "se informa que vh en iOS incluye la altura de la barra de herramientas inferior en el cálculo de la altura".
Brian Burns

2
¡GUAU, buen hallazgo! Mira a todas estas personas con respuestas demasiado complicadas.
NoName

8
Cuando se hizo la pregunta en 2011, ninguno de los principales navegadores admitía unidades de visualización. Esas "respuestas demasiado complicadas" eran las únicas opciones en ese entonces.
JJJ

6
Pequeña sugerencia de que min-height: 100vhsería mucho mejor. También se escalaría para diseños receptivos.
Wiggy A.

3
Esto no responde a la pregunta formulada, esto ocuparía el 100% de la ventana gráfica. No quiere esto porque su encabezado ocupará el x% de la ventana gráfica, por lo que las otras respuestas son correctas.
4cody

35

En realidad, el mejor enfoque es este:

html { 
    height:100%;
}
body { 
    min-height:100%;
}

Esto me resuelve todo y me ayuda a controlar mi pie de página y puede tener el pie de página fijo sin importar si la página se está desplazando hacia abajo.

Solución técnica - EDITADO

Históricamente, la 'altura' es algo complicado de moldear, en comparación con el 'ancho', el más fácil. Dado que css se centra en <body>para que el estilo funcione. El código de arriba - le dimos <html>y <body>una altura. Aquí es donde la magia entra en escena: dado que tenemos 'altura mínima' en la mesa de juego, le estamos diciendo al navegador que <body>es superior <html>porque <body>mantiene la altura mínima. Esto a su vez, permite <body>anular <html>porque ya <html>tenía altura antes. En otras palabras, estamos engañando al navegador para que "salte" <html>de la mesa, de modo que podamos diseñar de forma independiente.


1
¡Dios mío, es un milagro!
Geoff

¡Como un milagro, funciona! Pero por favor: ¿por qué min-heighty height?
Joy

1
@ShaojiangCai - Históricamente, la 'altura' es algo complicado de moldear, en comparación con el 'ancho', el más fácil. Dado que css se centra en <body>para que el estilo funcione. Este código: le dimos <html>y <body>una altura. Aquí es donde la magia entra en escena: dado que tenemos 'altura mínima' en la mesa de juego, le estamos diciendo al servidor que <body>es superior <html>porque <body>mantiene la altura mínima. Esto a su vez, permite <body>anular <html>porque ya <html>tenía altura antes. En otras palabras, estamos engañando al servidor para que "salte" <html>de la mesa, para que podamos diseñar de forma independiente.
Faron

2
@Faron Parece que 'navegador' sería una mejor opción de palabra aquí en lugar de 'servidor'. ;)
LET

@EunLeem ... Estoy de acuerdo contigo en cómo pude haber elegido la redacción adecuada para abordar esto. Gracias por la sugerencia de "golpe de codo". Actualicé mi respuesta en consecuencia.
Faron

14

Puede usar vh en la propiedad min-height.

min-height: 100vh;

Puede hacer lo siguiente, dependiendo de cómo esté usando los márgenes ...

min-height: calc(100vh - 10px) //Considering you're using some 10px margin top on an outside element

10

La solución aceptada no funcionará realmente. Usted se dará cuenta de que el contenido divserá igual a la altura de su padre, body. Por lo tanto, establecer la bodyaltura en 100%lo establecerá igual a la altura de la ventana del navegador. Digamos que la ventana del navegador estaba 768pxen altura, al establecer la divaltura del contenido en 100%, la divaltura del 'será a su vez 768px. Por lo tanto, terminará con el div del encabezado 150pxy el div de contenido 768px. Al final, tendrá contenido 150pxdebajo de la parte inferior de la página. Para otra solución, consulte este enlace.


8

Con HTML5 puedes hacer esto:

CSS:

body, html{ width:100%; height:100%; padding: 0; margin: 0;}
header{ width:100%; height: 70px; }
section{ width: 100%; height: calc(100% - 70px);}

HTML:

<header>blabablalba </header>
<section> Content </section>

Tenga cuidado con el uso de cálculo en porcentaje de altura. Firefox no funcionará con esto correctamente a menos que todos los padres tengan una altura establecida.
TomDK

4

Para mí, el siguiente funcionó bien:

Envolví el encabezado y el contenido en un div

<div class="main-wrapper">
    <div class="header">

    </div>
    <div class="content">

    </div>
</div>

Usé esta referencia para llenar la altura con flexbox. El CSS es así:

.main-wrapper {
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}
.header {
    flex: 1;
}
.content {
    flex: 1;
}

Para obtener más información sobre la técnica flexbox, visite la referencia



1

La respuesta aceptada no funciona. Y la respuesta más votada no responde a la pregunta real. Con un encabezado de altura de píxel fija y un relleno en la pantalla restante del navegador, y desplácese para ver el flujo. Aquí hay una solución que realmente funciona, usando posicionamiento absoluto. También supongo que se conoce la altura del encabezado, por el sonido de "encabezado fijo" en la pregunta. Yo uso 150px como ejemplo aquí:

HTML:

<html>
    <body>
        <div id="Header">
        </div>
        <div id="Content">      
        </div>
    </body>
</html>

CSS: (agregando color de fondo solo para efectos visuales)

#Header
{
    height: 150px;
    width: 100%;
    background-color: #ddd;
}
#Content
{
   position: absolute;
   width: 100%;
   top: 150px;
   bottom: 0;
   background-color: #aaa;
   overflow-y: scroll;
}

Para una vista más detallada de cómo funciona esto, con contenido real dentro del #Content, eche un vistazo a este jsfiddle , usando filas y columnas de arranque.


"encabezado de altura de píxel fija" -> ¡esto exactamente! La bottompropiedad se aseguró de que las #Contentestancias se atasquen al final de la página. Le agradezco que se haya tomado el tiempo de explicarlo.
Armfoot

1
Y estoy feliz de que haya ayudado a alguien;)
jumps4fun

1

En este caso, quiero que mi div de contenido principal sea de altura líquida para que toda la página ocupe el 100% de la altura del navegador.

height: 100vh;


1

Permítame agregar mis 5 centavos aquí y ofrecer una solución clásica:

html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idHeader {position:absolute; left:0; right:0; border:solid 3px red;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
<div id="idOuter">
  <div id="idHeader" style="height:30px; top:0;">Header section</div>
  <div id="idContent" style="top:36px; bottom:0;">Content section</div>
</div>

Esto funcionará en todos los navegadores, sin script, sin flex. Abra el fragmento en el modo de página completa y cambie el tamaño del navegador: las proporciones deseadas se conservan incluso en el modo de pantalla completa.

Nota:

  • Los elementos con diferentes colores de fondo pueden cubrirse entre sí. Aquí utilicé un borde sólido para asegurarme de que los elementos se colocan correctamente.
  • idHeader.heighty idContent.topse ajustan para incluir el borde, y deben tener el mismo valor si no se utiliza el borde. De lo contrario, los elementos saldrán de la ventana gráfica, ya que el ancho calculado no incluye borde, margen y / o relleno.
  • left:0; right:0; puede ser reemplazado por width:100% por la misma razón, si no se usa un borde.
  • La prueba en una página separada (no como un fragmento) no requiere ningún ajuste de html / body.
  • En IE6 y versiones anteriores debemos agregar padding-topy / o padding-bottomatributos al #idOuterelemento.

Para completar mi respuesta, aquí está el diseño del pie de página:

html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
#idFooter {position:absolute; left:0; right:0; border:solid 3px blue;}
<div id="idOuter">
  <div id="idContent" style="bottom:36px; top:0;">Content section</div>
  <div id="idFooter" style="height:30px; bottom:0;">Footer section</div>
</div>

Y aquí está el diseño con encabezado y pie de página:

html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idHeader {position:absolute; left:0; right:0; border:solid 3px red;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
#idFooter {position:absolute; left:0; right:0; border:solid 3px blue;}
<div id="idOuter">
  <div id="idHeader" style="height:30px; top:0;">Header section</div>
  <div id="idContent" style="top:36px; bottom:36px;">Content section</div>
  <div id="idFooter" style="height:30px; bottom:0;">Footer section</div>
</div>


0

A menos que necesite ser compatible con IE 9 y versiones anteriores, usaría flexbox

body { display: flex; flex-direction: column; }
.header { height: 70px; }
.content { flex: 1 1 0 }

También necesitas que el cuerpo ocupe toda la página.

body, html{ width:100%; height:100%; padding: 0; margin: 0;}

0

CSS PLaY | Encabezado / pie de página fijo en varios navegadores / diseño de columna única centrado

CSS Frames, versión 2: Ejemplo 2, ancho especificado | 456 Calle Berea

Una cosa importante es que, aunque esto suena fácil, habrá un poco de código desagradable en su archivo CSS para obtener un efecto como este. Desafortunadamente, realmente es la única opción.


Se desaconsejan las respuestas de solo enlace. Intente incluir el código en su respuesta.
Usuario que no es usuario

0
#Header
{
width: 960px;
height: 150px;
}

#Content
{
min-height:100vh;
height: 100%;
width: 960px;
}

-1

La mejor solución que encontré hasta ahora es establecer un elemento de pie de página en la parte inferior de la página y luego evaluar la diferencia entre el desplazamiento del pie de página y el elemento que necesitamos expandir. p.ej

El archivo html

<div id="contents"></div>
<div id="footer"></div>

El archivo css

#footer {
    position: fixed;
    bottom: 0;
    width: 100%;
}

El archivo js (usando jquery)

var contents = $('#contents'); 
var footer = $('#footer');
contents.css('height', (footer.offset().top - contents.offset().top) + 'px');

También es posible que desee actualizar la altura del elemento de contenido en cada cambio de tamaño de ventana, así que ...

$(window).on('resize', function() {
  contents.css('height', (footer.offset().top -contents.offset().top) + 'px');
});


-3

¿Has intentado algo como ésto?

CSS:

.content {
    height: 100%;
    display: block;
}

HTML:

<div class=".content">
<!-- Content goes here -->
</div>
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.