2010-05-06 58 views
34

El problema es que tengo un div de contenido que extiende su contenedor en altura (contenedor y div de contenido tienen altura automática).CSS: altura automática conteniendo div, altura del 100% en el fondo div dentro que contiene div

Quiero que el contenedor de fondo, que es una div entre hermanos del div de contenido, se estire para llenar el contenedor. El contenedor de fondo contiene divs para dividir el fondo en trozos.

Los divisores de fondo y contenedor tienen un ancho del 100%, el contenedor de contenido no.

HTML:

<div id="container"> 
    <div id="content"> 
     Some long content here .. 
    </div> 
    <div id="backgroundContainer"> 
     <div id="someDivToShowABackground"/> 
     <div id="someDivToShowAnotherBackground"/> 
    </div> 
</div> 

CSS:

#container { 
    height:auto; 
    width:100%; 
} 

#content { 
    height: auto; 
    width:500px; 
    margin-left:auto; 
    margin-right:auto; 
} 

#backgroundContainer { 
    height:100%;??? I want this to be the same height as container, but 100% makes it the height of the viewport. 
} 
+0

¿Has encontrado una solución para este problema? Estoy un poco atrapado en el mismo problema. –

+0

Cuando establece un ancho de porcentaje, es un porcentaje del elemento principal, no de toda la pantalla. La única excepción a esto es el elemento '' en la parte superior. – starbeamrainbowlabs

Respuesta

3

En algún lugar se tendrá que establecer una altura fija, en lugar de utilizar la función automática en todas partes. Descubrirá que si establece una altura fija en su contenido y/o contenedor, entonces el uso de auto para las cosas dentro de él funcionará.

Además, sus cajas todavía se expandirá en altura a gota con más contenido en, incluso aunque haya establecido una altura para que - por lo que no se preocupe por eso :)

#container { 
    height:500px; 
    min-height:500px; 
} 
+0

Desafortunadamente, el contenedor div no se expandirá según la altura del div del contenido. Si el contenido div contiene contenido que lo hace expandirse a 600px de alto, simplemente desbordará el contenedor div a menos que el contenedor div se establezca en altura: auto. – lukewm

+0

Gracias por su esfuerzo, ¿alguna otra idea? – lukewm

5

Bueno por lo que una persona es, probablemente, voy a abofetearme por esta respuesta, pero uso jQuery para resolver todos mis irritantes problemas y resulta que acabo de usar algo hoy para solucionar un problema similar. Suponiendo que usa jquery:

$("#content").sibling("#backgroundContainer").css("height",$("#content").outerHeight()); 

esto no se ha probado, pero creo que puede ver el concepto aquí. Básicamente, una vez cargado, puede obtener la altura (outerHeight incluye relleno + bordes, innerHeight solo para el contenido). Espero que ayude.

Aquí es cómo se enlaza a cambiar el tamaño de la ventana de eventos:

$(window).resize(function() { 
    $("#content").sibling("#backgroundContainer").css("height",$("#content").outerHeight()); 
}); 
+1

¿Qué pasa si JS está apagado? * bofetadas *: D Funcionaría sin embargo ... – Tim

+0

AAAAAH !? pueden apagarlo? jeje. – Gabriel

+0

Desafortunadamente, esto no funcionará, incluso si estuviera contento con el uso de javascript, si la dinámica de la página cambia mientras el usuario está en ella, se debería volver a llamar al script jquery, y eso es solo una complejidad no deseada. – lukewm

1

Usted no debería tener que establecer height: 100% en cualquier momento si desea que su recipiente para llenar la página. Lo más probable es que tu problema esté enraizado en el hecho de que no has eliminado los flotadores en los hijos del contenedor. Hay varias formas de resolver este problema, principalmente agregando overflow: hidden al contenedor.

#container { overflow: hidden; } 

debería ser suficiente para resolver cualquier problema de altura que está teniendo.

+0

Esto fue genio, ¡tan simple que funciona perfectamente! – Tom

40

Hay una serie de soluciones para este problema, incluyendo OneTrueLayout Técnica, Faux Columnas Técnica, CSS tabular Pantalla Técnica y hay también una técnica Capas.

Una solución para igualmente columnas altura-Ed es el CSS Tabular Display Technique que significa usar la pantalla : mesa de función. Funciona para Firefox 2+, Safari 3+, Opera 9+ y IE8.

El código para el CSS visualización tabular:

El HTML

<div id="container"> 
    <div id="rowWraper" class="row"> 
      <div id="col1" class="col"> 
       Column 1<br />Lorem ipsum<br />ipsum lorem 
      </div> 
      <div id="col2" class="col"> 
       Column 2<br />Eco cologna duo est! 
      </div> 
      <div id="col3" class="col"> 
       Column 3 
      </div> 
     </div> 
</div> 

El CSS

<style> 
#container{ 
    display:table; 
    background-color:#CCC; 
    margin:0 auto; 
} 

.row{ 
    display:table-row; 
} 

.col{ 
    display: table-cell; 
} 

#col1{ 
    background-color:#0CC; 
    width:200px; 
} 

#col2{ 
    background-color:#9F9; 
    width:300px; 
} 

#col3{ 
    background-color:#699; 
    width:200px; 
} 
</style> 

Incluso si hay un problema con el auto expansión del ancho de la celda de tabla que puede se resuelve fácilmente insertando otro div dentro de la celda de tabla y dándole un ancho fijo. De todos modos, la sobreexpansión del ancho ocurre en el caso de usar palabras extremadamente largas (que dudo que alguien use, digamos, una palabra de 600px de longitud) o algunas div cuyo ancho es mayor que el ancho de la celda de la tabla.

Faux Column Technique es la solución más popular para este problema, pero tiene algunos inconvenientes, como, tiene que cambiar el tamaño de la imagen embaldosada de fondo si desea cambiar el tamaño de las columnas y tampoco es una solución elegante.

El consiste en crear un fondo acolchado de una altura extremadamente grande y recortarlo colocando la posición real del borde en la "posición lógica normal" aplicando un margen negativo inferior del mismo valor enorme y ocultando el medida creada por el relleno con desbordamiento: oculto aplicado al envoltorio de contenido. Un ejemplo simplificado sería:

El archivo HTML:

<html><head> 
<style> 
.wraper{ 
    background-color:#CCC; 
    overflow:hidden; 
} 

.floatLeft{ 
    float:left; 
} 

.block{ 
    padding-bottom:30000px; 
    margin-bottom:-30000px; 
    width:100px; 
    background-color:#06F; 
    border:#000 1px solid; 
} 
</style> 
</head> 
<body> 
    <div class="wraper"> 
    <div class="block floatLeft">first col</div> 
     <div class="block floatLeft"> 
       Second col<br />Break Line 
     </div> 
    <div class="block floatLeft">Third col</div> 
</div> 
</body> 
</html> 

La Técnica Layering debe haber una solución muy ordenado que implica el posicionamiento absoluto de div de withing un pariente posicionado principal div envoltura. Básicamente consiste en una cantidad de divs secundarios y la div principal. El div principal tiene imperativamente posición: relativo a su colección de atributos css. Los hijos de este div son todos imperativamente posición: absoluta. Los niños deben tener superior y inferior conjunto de y izquierda-derecha dimensiones establecidas para dar cabida a las columnas con cada otra. Por ejemplo, si tenemos dos columnas, una de ancho 100px y la otra de 200px, teniendo en cuenta que queremos 100px en el lado izquierdo y 200px en el lado derecho, la columna de la izquierda debe tener {izquierda: 0; derecha: 200px} y la columna de la derecha {izquierda: 100px; derecha: 0;}

En mi opinión, la altura del 100% no implementada dentro de un contenedor de altura automatizado es un inconveniente importante y el W3C debería considerar la revisión de este atributo.

Otros recursos: link1, link2, link3, link4, link5 (important)

+1

Parece que OneTrueLayout ya no funciona, al menos con Chrome 43 en Mac: http://jsbin.com/mepucolagi/1/edit?html,output –

9

gane #container a display:inline-block

#container { 
height:auto; 
width:100%; 
display:inline-block; 
} 

#content { 
height: auto; 
width:500px; 
margin-left:auto; 
margin-right:auto; 
} 

#backgroundContainer { 
height:200px; 200px is example, change to what you want 
width:100%; 
} 

Véase también: W3Schools

0

acabé haciendo 2 display: table;

#container-tv { /* Tiled background */ 
    display:table; 
    width:100%; 
    background-image: url(images/back.jpg); 
    background-repeat: repeat; 
} 
#container-body-background { /* center column but not 100% width */ 
    display:table; 
    margin:0 auto; 
    background-image:url(images/middle-back.png); 
    background-repeat: repeat-y; 

} 

Esto hizo que tuviera una imagen de fondo embaldosada con una imagen de fondo en el medio como una columna. Se extiende hasta el 100% de la altura de la página, no solo el 100% del tamaño de la ventana del navegador

1

Solo una nota rápida porque tuve un momento difícil con esto.

Al usar #container {overflow: hidden; } la página que comencé a tener problemas de diseño en Firefox e IE (cuando el zoom entraba y salía, el contenido rebotaba dentro y fuera del div principal).

La solución a este problema es agregar una pantalla: inline-block; al mismo div con desbordamiento: oculto;

0

Pruebe excluir la altura del elemento de estilo.

es decir, no dan altura: 100% ni a ningún otro valor.

0
{ 
    height:100vh; 
    width:100vw; 
} 
Cuestiones relacionadas