2011-05-19 7 views
6

Problema simple, aunque aparentemente no es una solución simple.Problema de altura del contenedor 100% - HTML5/CSS2/3

Ejemplo aquí: http://myhideout.eu/new/

Básicamente el sitio consisten en dos columnas, aunque sin envoltorios o nada parecido, ya que me gusta mucho que ver con el menor por el estilo de lo posible, en parte, por el bien de simplicidad, pero también para hacer uso de la semántica de HTML5, que en mi opinión no incluye realmente divs, sin importar cuán apropiadamente se denominen.

Sin embargo, me gustaría que la barra lateral ocupe toda la altura de la columna adyacente, lo que no es tan fácil como pensé en un principio. Sé que es un viejo problema, pero estaba seguro de haberlo resuelto antes.

De todos modos, traté de averiguar cómo hacerlo sin usar envoltorios o JavaScript. JavaScript no funciona, pero esa es otra historia. Estaba seguro de que habría algún tipo de función inteligente de CSS3 o algo similar, que resolvería mi problema, sin la necesidad de envoltorios, pero mi búsqueda de esta característica de mucha necesidad fue un fracaso de proporciones épicas.

Así que me dije a mí mismo: "¡Maldición! Bueno, solo tengo que usar envoltorios entonces".

Estaba seguro de que funcionaría. Probé con diferentes configuraciones, pero no importaba lo que hiciera, no podía hacerlo funcionar sin establecer una altura absoluta del envoltorio circundante. Solo imagina mi decepción, fallando una vez más cuando estaba seguro de haberlo hecho antes. Así que nuevamente fui en busca de una solución que satisfaga mis necesidades. Aunque apareció mucho más material esta vez, todavía era un fracaso. Las pocas soluciones que encontré fueron cuestionables por decir lo menos.

Por lo tanto, ahora estoy aquí de nuevo, haciendo una más de esas preguntas que sin duda se han preguntado un billón de veces antes. Lo siento, pero realmente no sé a dónde más ir.

Espero que pueda ayudar.

Gracias de antemano y saludos cordiales.

edición:

Esto funciona exactamente como yo quiero también:

<!DOCTYPE html> 
<html> 
    <head> 
    <style type="text/css"> 
     body { 
     margin: 0 auto; 
     width: 800px; 
     } 
     #wrapper { 
     position: relative; 
     width: 800px;   
     } 
     body > header, body > footer { 
     background-color: red; 
     width: 800px; 
     } 
     #wrapper > article { 
     margin-right: 200px; 
     width: 600px; 
     background-color: blue; 
     } 
     #wrapper > aside { 
     position: absolute; 
     top: 0; 
     bottom: 0; 
     right: 0; 
     width: 200px; 
     background-color: green; 
     } 
    </style> 
    </head> 
    <body> 
    <header>This is a header</header> 
    <div id="wrapper"> 
     <article> 
     This is the content<br /><br /><br /><br />left<br /><br /><br /><br />left 
     </article> 
     <aside> 
     And this is the sidebar! I dynamically make myself bigger based on the content on the left! 
     </aside> 
    </div> 
    <footer>This is a footer</footer> 
    </body> 
</html> 

único problema queda es deshacerse de esa etiqueta maldita div;)

edición: la pantalla de tabla CSS me han señalado propiedades, y realmente parece ser lo que estoy buscando, como la solución inteligente, pero con múltiples elementos en una fila, y solo uno en el otro, no puedo entender cómo debería ser estar hecho.

+0

¿Es necesaria la compatibilidad con IE6? –

+0

Ciertamente no. Solo los navegadores más nuevos que están disponibles de forma gratuita, IE9, Firefox 4, etc. – Zacariaz

+0

Considero mi última edición, me acabo de dar cuenta de que si conoce la altura del encabezado y el pie de página, debería poder soltar el envoltorio div y usar cuerpo en cambio. – Zacariaz

Respuesta

5

Si la compatibilidad IE6 no es un requisito, entonces por lo general se suele hacer el código HTML siguiente:

<div class="container"> 
    <div class="content"> 
     This is the content 
    </div> 
    <div class="sidebar"> 
     And this is the sidebar! I dynamically make myself bigger based on the content on the left! 
    </div> 
</div> 

Y este es el CSS:

.container { position:relative; } 
.content {margin-right:<SIDEBAR WIDTH HERE>;} 
.sidebar {position:absolute; top:0; bottom:0; right:0; width:???; } 

jsFiddle ejemplo: http://jsfiddle.net/geC3w/

Esto funciona en todos los navegadores modernos e Internet Explorer 7 y superiores, también es inmensamente simple, siempre que la compatibilidad con IE6 no sea un requisito

+0

Solo los requisitos son realmente los navegadores más nuevos. Firefox 4, IE9 y tal. No estoy seguro de cómo se supone que funciona su sugerencia, pero me aseguraré de verificarlo lo antes posible. Gracias – Zacariaz

+0

@Zacariaz - Básicamente, crea la barra lateral como un elemento absolutamente posicionado, y lo estira al tamaño del div principal al forzar que los valores superior e inferior sean cero. Si necesita jugar con él, revise el enlace de JSFiddle en mi respuesta, y juegue con el HTML y CSS para su contenido de corazón. –

+0

Bueno, ciertamente funciona y si soy lo suficientemente inteligente, incluso podré evitar los divs. No puedo decir que me guste mucho el posicionamiento absoluto, pero supongo que puedo hacer una excepción. Gracias por la respuesta. – Zacariaz

1

Si la compatibilidad IE7 no es un requisito, utilice display: table-cell;:

body { 
    margin: 0 auto; 
    width: 800px; 
} 
#wrapper { 
    position: relative; 
    width: 800px;   
} 
body > header, body > footer { 
    background-color: red; 
} 
#wrapper > * { 
    display: table-cell; 
} 
#wrapper > article { 
    width: 600px; 
    background-color: blue; 
} 
#wrapper > aside { 
    width: 200px; 
    background-color: green; 
} 

Working example.

+0

Esto suena muy interesante. ¿Alguien se preocupa por explicarlo?Si de hecho no me importa IE7 y las siguientes, ¿cuál es el enfoque inteligente? – Zacariaz

+0

@Zacariaz Está tratando de emular las características de tabla, elementos en la misma fila que comparten la misma altura, por lo que tiene sentido utilizar las características de diseño de tabla CSS. El principal obstáculo para usarlos para todo es la falta de soporte en IE7 y anteriores, lo que lo hace poco práctico en muchos sitios. – robertc

+0

mkay. Es un poco más fácil que el posicionamiento absoluto y dado que puedes obtener IE8 para XP, realmente no me importa el IE más antiguo. También modifiqué el enfoque un poco. Por favor, verifíquelo y avíseme si hay algo de lo que deba estar preocupado: http://jsfiddle.net/qFKA2/5/ Básicamente eliminé el envoltorio y la comparabilidad del navegador. También la posición: relativa, no parecía necesaria. – Zacariaz

Cuestiones relacionadas