2010-05-24 24 views
43

Tengo una aplicación de Google Maps que ocupa la mayor parte de la página. Sin embargo, necesito reservar la franja más alta de espacio para una barra de menú. ¿Cómo puede hacer que el mapa div llene automáticamente su espacio vertical? height: 100% no funciona porque la barra superior empujará el mapa más allá de la parte inferior de la página.¿Realiza DIV rellenar el resto de la página verticalmente?

+--------------------------------+ 
|  top bar (n units tall) | 
|================================| 
|   ^    | 
|    |     | 
|    div    | 
|  (100%-n units tall)  | 
|    |     | 
|    v     | 
+--------------------------------+ 
+0

si x = 10%, luego ponga div {height: 90%} – Kasturi

+4

El div inferior necesita cambiar el tamaño dinámicamente. – erjiang

Respuesta

33

Puede usar la posición absoluta.

HTML

<div id="content"> 
    <div id="header"> 
     Header 
    </div> 
    This is where the content starts. 
</div> 

CSS

BODY 
{ 
    margin: 0; 
    padding: 0; 
} 
#content 
{ 
    border: 3px solid #971111; 
    position: absolute; 
    top: 0; 
    right: 0; 
    bottom: 0; 
    left: 0; 
    background-color: #DDD; 
    padding-top: 85px; 
} 
#header 
{ 
    border: 2px solid #279895; 
    background-color: #FFF; 
    height: 75px; 
    position: absolute; 
    top: 0; 
    left: 0; 
    right: 0; 
} 

Mediante la colocación de #content absoluta y la especificación de la parte superior, las propiedades de la derecha, abajo y de izquierda, se obtiene un div ocupar toda la ventana gráfica .

Luego estableces padding-top en #content para que sea> = la altura de #header.

Finalmente, coloque #header dentro de #content y colóquelo de manera absoluta (especificando arriba, izquierda, derecha y la altura).

No sé qué tan amigable para el navegador es esto. Consulte this article at A List Apart para obtener más información.

+1

Interesante, no sabía sobre este truco. Deberías mencionar, sin embargo, que no funciona en IE6. –

+4

Lo hice. En negrita. Lea el artículo que he citado: explica una solución alternativa para IE6 =) –

+1

Pero esto requiere que codifique la altura del encabezado, ¿verdad? – erjiang

1

umm, es necesario agregar html, body { height: 100%; }, después de esto, un elemento relative, con min-height: 100%

Después de esto, para IE6

<!--[if lt IE 7]> 
<style media="screen" type="text/css"> 
    MyAutoheightElement 
    { 
     height: 100%; 
    } 
</style> 
<![endif]--> 

Esto dará a su sitio altura del 100% en todos los navegadores.
¡Pruébalo! Espero que ayude :)

10

La manera de hacerlo, al parecer, es el uso de JavaScript para supervisar los eventos onload y onResize y programáticamente cambiar el tamaño del div llenado de este modo:

Usando jQuery:

function resize() { 
    $("#bottom").height($(document).height() - $('#top').height()); 
} 

Uso de JavaScript sencillo:

function resize() { 
    document.getElementById("bottom").style.height = (document.body.clientHeight - headerHeight) + "px"; 
} 

Editar: y luego se unen a estos a la window o bject.

+0

cambiar el tamaño no funciona: http://stackoverflow.com/questions/229010/jquery-resize-not-working-at-firefox-chrome-and-safari – RayLoveless

+1

@Ray L .: El tamaño funciona para el objeto ventana. – erjiang

2

Te recomiendo que pruebes jquery-layout plugin. Verá un montón de demostraciones y ejemplos en el enlace.

No sé si está familiarizado con los conceptos de JQuery o algún otro marco de JavaScript, como ayudante Prototype.js o Mootools pero es una idea vital para utilizar uno de ellos. Ocultan la mayoría de los trucos relacionados con el navegador del programador y tienen una cantidad de extensiones útiles para la IU, la manipulación del DOM, etc.

+0

¡Estoy de acuerdo! Deja que un jquery maneje esto por ti. – RayLoveless

0
var sizeFooter = function(){ 
    $(".webfooter").css("padding-bottom", "0px").css("padding-bottom", $(window).height() - $("body").height()) 
} 
$(window).resize(sizeFooter); 
8

usos Otra solución no dados CSS3 en lugar de JavaScript. Hay una función calc() ahora que se puede utilizar para hacer la misma cosa:

HTML

<div id="content"> 
    <div id="header"> 
     Header 
    </div> 
    <div id="bottom"> 
     Bottom 
    </div> 
</div> 

CSS3

#content { 
    height: 300px; 
    border-style: solid; 
    border-color: blue; 
    box-sizing: border-box; 
} 
#header { 
    background-color: red; 
    height: 30px; 
} 
#bottom { 
    height: calc(100% - 30px); 
    background-color: green; 
} 

Aquí está el jsfiddle

Es posible que también desee examinar el uso del estilo box-sizing: border-box para int erior divs ya que esto puede deshacerse de los problemas de relleno y bordes que sobresalen fuera de los divs de los padres.

+5

¿Qué ocurre si la altura de '# header' no está fijada en 30px? – rustyx

Cuestiones relacionadas