2010-05-06 26 views
34

Das Problem ist, dass ich ein Content-div, das seinen Container Höhe-weise (Container und Inhalt div haben Autohöhe) hat.CSS: auto Höhe auf div, 100% Höhe auf Hintergrund div innen mit div

Ich möchte den Hintergrund Container, der ein Geschwister div des Inhalts div ist, um den Container zu füllen. Der Hintergrundcontainer enthält divs, um den Hintergrund in Chunks zu zerlegen.

Die Hintergrund- und Container-Divs haben 100% Breite, der Inhaltscontainer nicht.

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

Haben Sie eine Lösung für dieses Problem gefunden? Ich bin irgendwie in demselben Problem stecken geblieben. –

+0

Wenn Sie eine prozentuale Breite festlegen, handelt es sich um einen Prozentsatz des übergeordneten Elements und nicht um den gesamten Bildschirm. Die einzige Ausnahme hiervon ist das Element "" ganz oben. – starbeamrainbowlabs

Antwort

3

Irgendwo Sie benötigen eine feste Höhe zu setzen, statt Auto überall verwenden. Sie werden feststellen, dass wenn Sie eine feste Höhe für Ihren Inhalt und/oder Container festlegen, die automatische Verwendung der darin enthaltenen Dinge funktioniert.

Auch Ihre Boxen noch höhenwärtigen in, mit mehr Inhalt erweitern, auch wenn Sie für eine Höhe eingestellt hat - also keine Sorge, dass etwa :)

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

Leider wird das Container-Div nicht entsprechend der Höhe des Inhalts-Div erweitert. Wenn das Inhalts-div Inhalt enthält, der es auf 600px Höhe erweitert, wird einfach das Container-div überlaufen, es sei denn, das Container-div ist auf Höhe gesetzt: auto. – lukewm

+0

Danke für Ihre Mühe, irgendwelche anderen Ideen? – lukewm

5

Okay, so jemand ist wahrscheinlich Ich werde mich für diese Antwort schlagen, aber ich benutze jQuery, um all meine irritierenden Probleme zu lösen und es stellt sich heraus, dass ich gerade etwas verwendet habe, um ein ähnliches Problem zu beheben. Angenommen, Sie verwenden jquery:

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

Dies ist nicht getestet, aber ich denke, Sie können das Konzept hier sehen. Grundsätzlich können Sie nach dem Laden die Höhe abrufen (outwardHeight enthält padding + borders, innerHeight nur für den Inhalt). Ich hoffe, das hilft.

Hier ist, wie Sie es an die Fenstergröße ändern binden Ereignis:

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

Was ist, wenn JS ausgeschaltet ist? * Slaps *: D Würde funktionieren ... – Tim

+0

AAAAAH !? Sie können es ausschalten? hehe. – Gabriel

+0

Das geht leider nicht, selbst wenn ich mit Javascript zufrieden wäre, wenn sich die Dynamik der Seite ändert, während der Benutzer darauf ist, müsste das jquery-Skript erneut aufgerufen werden, und das verlangt nur unerwünschte Komplexität. – lukewm

1

Sie sollten nicht height: 100% an irgendeiner Stelle setzen, wenn Sie Ihren Container die Seite füllen möchten. Die Wahrscheinlichkeit ist groß, dass Ihr Problem darin liegt, dass Sie die Floats in den Containern nicht gelöscht haben. Es gibt einige Möglichkeiten, dieses Problem zu lösen, indem Sie dem Container hauptsächlich overflow: hidden hinzufügen.

#container { overflow: hidden; } 

Sollte genug sein, um jedes Höhenproblem zu lösen, das Sie haben.

+0

Das war genial, so einfach funktioniert es perfekt! – Tom

40

Es gibt eine Reihe von Lösungen für dieses Problem, einschließlich OneTrueLayout Technik, Faux Columns Technik, CSS tabellarische Wiedergabe Technik und dort auch eineLayering-Technik ist.

Eine Lösung für gleichermaßen höhen ed Spalten ist die, die die CSS Tabular Display TechniqueAnzeigemittel zu verwenden: Tabelle Funktion. Es funktioniert für Firefox 2+, Safari 3+, Opera 9+ und IE8.

Der Code für die CSS tabellarische Wiedergabe:

Die 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> 

Die 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> 

Auch wenn es ein Problem mit der Auto ist Ausdehnung der Breite der Tischzelle einfach gelöst werden, indem ein anderes div mit der Tabellenzelle eingefügt wird und ihm eine feste Breite gegeben wird. Wie auch immer, das Überdehnen der Breite geschieht im Fall der Verwendung extrem langer Wörter (von denen ich bezweifle, dass irgendjemand ein, sagen wir, 600px langes Wort verwenden würde) oder einiger divs, deren Breite größer ist als die Breite der Tabellenzelle.

Die Faux Column Technique ist die beliebteste Lösung für dieses Problem, aber es hat einige Nachteile wie, Sie müssen die Größe des Hintergrunds gekachelt Bild ändern, wenn Sie die Spalten Größe ändern möchten, und es ist auch keine elegante Lösung.

Die OneTrueLayout Technique besteht darin, ein Padding-Bottom einer extrem großen Höhe zu erstellen und es auszuschneiden, indem Sie die echte Randposition auf die "normale logische Position" bringen, indem Sie ein negatives Rand-Unten des gleichen großen Werts anwenden und das ausblenden Ausmaß, das durch das Auffüllen mit Überlauf erzeugt wurde: Versteckt auf den Inhalts-Wrapper angewendet. Ein vereinfachtes Beispiel wäre:

Die HTML-Datei:

<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> 

Die Layering-Technik muss eine sehr saubere Lösung sein, die div absolute Positionierung beinhaltet die einen Haupt relativ positioniert Wrapper div withing. Es besteht im Wesentlichen aus einer Anzahl von Kinddivs und dem Hauptdiv. Das Hauptdiv hat zwingend Position: relativ zu seiner css Attributsammlung. Die Kinder dieses Div sind alle zwingend Position: absolut. Die Kinder müssen oben und Boden Satz und Links-Rechts Dimensionen gesetzt haben die Spalten mit jeder anderen beherbergen. Wenn wir zum Beispiel zwei Spalten haben, eine mit der Breite 100px und die andere mit 200px, wenn wir die 100px auf der linken Seite und die 200px auf der rechten Seite haben wollen, muss die linke Spalte {left: 0; rechts: 200px} und die rechte Spalte {links: 100px; rechts: 0;}

Meiner Meinung nach ist die nicht implementierte 100% Höhe innerhalb eines automatischen Höhencontainers ein großer Nachteil und das W3C sollte in Betracht ziehen, dieses Attribut zu überarbeiten.

Weitere Informationen: link1, link2, link3, link4, link5 (important)

+1

Das OneTrueLayout scheint zumindest mit Chrome 43 auf dem Mac nicht mehr zu funktionieren: http://jsbin.com/mepucolagi/1/edit?html,output –

9

Make #container zu 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%; 
} 

Siehe auch: W3Schools

0

Ich landete machen 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; 

} 

Dies machte es ein gekacheltes Hintergrundbild mit einem Hintergrundbild in der Mitte als Spalte. Es erstreckt sich auf 100% Höhe der Seite nicht nur 100% der Browser-Fenstergröße

1

Nur eine kurze Notiz, weil ich eine harte Zeit damit hatte.

Mit #container {Überlauf: versteckt; } Die Seite, mit der ich begonnen hatte, hatte Layoutprobleme in Firefox und IE (wenn der Zoom ein- und ausging, würde der Inhalt in das übergeordnete div springen).

Die Lösung für dieses Problem besteht darin, eine Anzeige hinzuzufügen: Inline-Block; zum selben div mit Überlauf: versteckt;

0

Probieren Sie die Höhe des Stilelements aus.

, d. H. Weder Höhe noch 100% noch irgendeinen anderen Wert angeben.

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