2010-05-12 19 views
15

Tengo un problema con un diseño: no está en línea, solo local, pero si copia y pega el código siguiente en una página html y lo ejecuta localmente, verá el misma página que hago.100% de altura con pie de página fijo e integrado Google Map

Está a punto de llegar. Lo que intento lograr es una página sin barras de desplazamiento que consuma todo el espacio vertical disponible. Sí, puedo establecer "overflow: hidden" en la declaración del contenedor y eso ayuda, pero no es del todo correcto. Quiero que el mapa de google esté rodeado por un borde 1em. Tengo esto en 3 lados pero la declaración del 100% de altura en el contenido div bloquea el borde inferior. Si no te das cuenta de las implicaciones de un div del mapa de Google de un porcentaje, entonces el padre TIENE que tener una altura declarada para que funcione. Como el pie de página es absoluto y está fuera del flujo, no hay un límite "inferior" para trabajar y el diseño simplemente no funciona. El contenido div 100% de altura, básicamente, parece tomar su tamaño de la ventana gráfica y no del div que lo contiene.

Me está volviendo loco ... parece que no se me ocurre cómo hacerlo y realmente agradecería algo.

de inicio aquí:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title>Google map test</title> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
<style type="text/css"> 
html,body { 
margin:0; 
padding:0; 
height:100%; /* needed for container min-height */ 
background:fff; 

font-family:arial,sans-serif; 
font-size:small; 
color:#666; 
} 

h1 { 
font:1.5em georgia,serif; 
margin:0.5em 0; 
} 

h2 { 
font:1.25em georgia,serif; 
margin:0 0 0.5em; 
} 

div#container { 
position:relative; /* needed for footer positioning*/ 
margin:0 auto; /* center, not in IE5 */ 
width:960px; 
background:#fff; 
border-left:1px solid #ccc; 
border-right:1px solid #ccc; 

/*height:auto !important; real browsers */ 
height:100%; /* IE6: treaded as min-height*/ 

min-height:100%; /* real browsers */ 
} 

div#header { 
border-bottom:1px solid #ccc; 
border-left:1em solid #ccc; 
height:108px; 
position:relative; 
} 
div#header h1 
{ 
    position:absolute; 
    bottom: 0; 
    left:0.5em; 
} 
div#header2 
{ 
border-bottom:1px solid #ccc; 
border-left:1em solid #999; 
    height: 40px; 
    position: relative; 
} 
div#header2 p 
{ 
    position:absolute; 
    bottom: 0; 
    left:0.5em; 
} 
div#headerInternal 
{ 
border-bottom:1px solid #ccc; 
border-left:1em solid #cc3300; 
    height: 40px; 
    position: relative; 
} 
div#headerInternal p 
{ 
    position:absolute; 
    bottom: 0; 
    left:0.5em; 
} 

div#headerInternal2 
{ 
    height: 40px; 
    position: relative; 
} 
div#headerInternal2 p 
{ 
    position:absolute; 
    bottom: 0; 
    left:0.5em; 
} 


div#rightCol 
{ 
    float:right; 
    width:29%; 
padding-bottom:5em; /* bottom padding for footer */ 
} 

div#content 
{ 
float:left; 
    width:70%; 
    height:100%; /* fill that hole! */ 
border-right:1px solid #ccc; 
} 
div#content p { 
} 

div#footer { 
    position:absolute; 
clear:both; 
width:100%; 
height:40px; 
bottom:0; /* stick to bottom */ 
background:#fff; 
border-top:1px solid #ccc; 
} 
div#footer p { 
    padding:1em; 
    margin:0; 
} 

.paddedContent 
{ 
    height:100%; 
    margin: 1em; 
} 
</style> 

<script type="text/javascript"> 
function initialize() { 
    var latlng = new google.maps.LatLng(52.397, 1.644); 
    var myOptions = { 
     zoom: 8, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
} 

</script> 
</head> 

<body onload="initialize()"> 
    <div id="container"> 
    <div id="header"> 
     <h1>Title here...</h1> 
    </div> 
    <div id="header2"> 
     <p>Secondary menu...</p> 
    </div> 

    <div id="rightCol"> 
     <div id="headerInternal2"> 
      <p>Right Header</p> 
     </div> 
     <p class="paddedContent">This is the right column</p> 
    </div> 
    <div id="content"> 
     <div id="headerInternal"> 
      <p>Page Context Menu</p> 
     </div> 
     <div class="paddedContent"> 
      <div id="map_canvas" style="width: 100%; height: 100%;"></div> 
     </div> 
     <div id="footer"> 
      <p>This footer is absolutely positioned</p> 
     </div> 
    </div> 
</div> 
</body> 
</html> 
+0

Realmente complicado ... Intenté juguetear con él durante un tiempo. Creo que la raíz del problema es div # contenedor {altura: 100%} – Kasturi

+0

Cuatro años más tarde, esto se hace mucho más fácilmente usando el [modelo CSS de caja flexible] (http://stackoverflow.com/a/26558073/1269037) Todas las otras soluciones son torpes. –

Respuesta

17

Por desgracia, tengo que trabajar. haz los siguientes cambios

1) Dado que el pie de página está fuera de flujo, llévelo fuera del contenido div y póngalo detrás de él.

2) cambiar el css de # contenido div de la siguiente manera

div#content{ 

border-right:1px solid #CCCCCC; 
bottom:0; 
float:left; 
overflow:hidden; 
padding-bottom:108px; 
margin-top:148px; 
position:absolute; 
top:0; 
width:70%; 

} 

NOTA: El acolchado superior e inferior de relleno se fijará como los encabezados y pies de página se fija la altura. ¡Esto fracasará si también tienen valores porcentuales!

3) Cambiar el css del div contenedor #

div#container{  
background:none repeat scroll 0 0 #FFFFFF; 
border-left:1px solid #CCCCCC; 
border-right:1px solid #CCCCCC; 
height:100%; 
margin:0 auto; 
min-height:100%; 
overflow:hidden; 
position:relative; 
width:960px; 
} 

Sólo overflow: hidden se añade.

Aquí está la página entera: -

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title>Google map test</title> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
<style type="text/css"> 
html,body { 
margin:0; 
padding:0; 
height:100%; /* needed for container min-height */ 
background:fff; 

font-family:arial,sans-serif; 
font-size:small; 
color:#666; 
} 

h1 { 
font:1.5em georgia,serif; 
margin:0.5em 0; 
} 

h2 { 
font:1.25em georgia,serif; 
margin:0 0 0.5em; 
} 

div#container { 
background:none repeat scroll 0 0 #FFFFFF; 
border-left:1px solid #CCCCCC; 
border-right:1px solid #CCCCCC; 
height:100%; 
margin:0 auto; 
min-height:100%; 
overflow:hidden; 
position:relative; 
width:960px; 

/*height:auto !important; real browsers */ 
height:100%; /* IE6: treaded as min-height*/ 

min-height:100%; /* real browsers */ 
} 


div#header { 
border-bottom:1px solid #ccc; 
border-left:1em solid #ccc; 
height:108px; 
position:relative; 
} 
div#header h1 
{ 
    position:absolute; 
    bottom: 0; 
    left:0.5em; 
} 
div#header2 
{ 
border-bottom:1px solid #ccc; 
border-left:1em solid #999; 
    height: 40px; 
    position: relative; 
} 
div#header2 p 
{ 
    position:absolute; 
    bottom: 0; 
    left:0.5em; 
} 
div#headerInternal 
{ 
border-bottom:1px solid #ccc; 
border-left:1em solid #cc3300; 
    height: 40px; 
    position: relative; 
} 
div#headerInternal p 
{ 
    position:absolute; 
    bottom: 0; 
    left:0.5em; 
} 

div#headerInternal2 
{ 
    height: 40px; 
    position: relative; 
} 
div#headerInternal2 p 
{ 
    position:absolute; 
    bottom: 0; 
    left:0.5em; 
} 


div#rightCol 
{ 
    float:right; 
    width:29%; 
padding-bottom:5em; /* bottom padding for footer */ 
} 

div#content{ 

border-right:1px solid #CCCCCC; 
bottom:0; 
float:left; 
overflow:hidden; 
padding-bottom:108px; 
margin-top:148px; 
position:absolute; 
top:0; 
width:70%; 

} 
div#content p { 
} 

div#footer { 
    position:absolute; 
clear:both; 
width:100%; 
height:40px; 
bottom:0; /* stick to bottom */ 
background:#fff; 
border-top:1px solid #ccc; 
} 
div#footer p { 
    padding:1em; 
    margin:0; 
} 

.paddedContent 
{ 
    height:100%; 
    margin: 1em; 
} 
</style> 

<script type="text/javascript"> 
function initialize() { 
    var latlng = new google.maps.LatLng(52.397, 1.644); 
    var myOptions = { 
     zoom: 8, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
} 

</script> 
</head> 

<body onload="initialize()"> 
    <div id="container"> 
    <div id="header"> 
     <h1>Title here...</h1> 
    </div> 
    <div id="header2"> 
     <p>Secondary menu...</p> 
    </div> 

    <div id="rightCol"> 
     <div id="headerInternal2"> 
      <p>Right Header</p> 
     </div> 
     <p class="paddedContent">This is the right column</p> 
    </div> 
    <div id="content"> 
     <div id="headerInternal"> 
      <p>Page Context Menu</p> 
     </div> 
     <div class="paddedContent"> 
      <div id="map_canvas" style="width: 100%; height: 100%;"></div> 
     </div> 

    </div> 

     <div id="footer"> 
      <p>This footer is absolutely positioned</p> 
     </div> 
</div> 
</body> 
</html> 
+1

¡Oh, belleza absoluta! ¡Qué genio ... nunca a pesar de posicionar absolutamente el contenido div, pero es tan fácil cuando lo miras! Gracias x 1 millón. – Carl

+0

:) ... enfrentó una situación similar ... – Kasturi

+0

¡Eres un maestro del vudú! Amo esta solución –

5

@Katsuri, Gracias por su solución, funciona muy bien!

Pero para otros que quieren tener una izquierda fijo de tamaño de columna y una Gmap div llenando toda la derecha del espacio, aquí es mi código modificado de Katsuri de:

ejemplo vivo: http://jsfiddle.net/EZbfN/ código fuente :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>Google map test</title> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
<style type="text/css"> 
html, body { 
    margin:0; 
    padding:0; 
    height:100%; /* needed for container min-height */ 
} 
div#container { 
    height:100%; 
    width:100%; 
    /*height:auto !important; real browsers */ 
    height:100%; /* IE6: treaded as min-height*/ 
    min-height:100%; /* real browsers */ 
    margin:0 auto; 
    min-height:100%; 
    overflow:hidden; 
    position:relative; 
} 
div#header { 
    height:50px; 
    position:relative; 
} 
div#leftCol { 
    left:0; 
    bottom:0; 
    top:0; 
    overflow:hidden; 
    padding-bottom:35px; 
    margin-top:55px; 
    position:absolute; 
    width:300px; 
} 
div#content { 
    right:0; 
    bottom:0; 
    top:0; 
    left: 300px; 
    overflow:hidden; 
    padding-bottom:35px; 
    margin-top:55px; 
    position:absolute; 
} 
div#footer { 
    position:absolute; 
    clear:both; 
    width:100%; 
    height:20px; 
    bottom:0; /* stick to bottom */ 
    background:#fff; 
    border-top:1px solid #ccc; 
} 
.paddedContent { 
    height:100%; 
    margin: 5px; 
    border: solid 1px red; 
} 
</style> 
<script type="text/javascript"> 
function initialize() { 
    var latlng = new google.maps.LatLng(52.397, 1.644); 
    var myOptions = { 
     zoom: 8, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
} 

</script> 
</head> 

<body onload="initialize()"> 
<div id="container"> 
    <div id="header"> 
    <h1>Title here...</h1> 
    </div> 
    <div id="leftCol"> 
    <div class="paddedContent">This is the left column</div> 
    </div> 
    <div id="content"> 
    <div class="paddedContent"> 
     <div id="map_canvas" style="width: 100%; height: 100%;"></div> 
    </div> 
    </div> 
    <div id="footer"> 
This footer is absolutely positioned 
    </div> 
</div> 
</body> 
</html> 

Enjoy!

+1

Esto no le permite desplazarse dentro de la sección de contenido. – Justin

+0

Luego simplemente cambie el 'desbordamiento: oculto;' a 'desbordamiento: auto;' –

+0

Buen trabajo. Gracias por el violín. –

Cuestiones relacionadas