2008-12-16 12 views
5

Ich habe eine Reihe von divs, die alle die gleiche Höhe haben müssen, aber ich habe keine Möglichkeit zu wissen, was diese Höhe im Voraus sein könnte (der Inhalt kommt von einem externe Quelle). Ich versuchte zunächst, die Divs in ein umschließendes div zu platzieren und schwebte sie nach links. Ich habe dann ihre Höhe auf "100%" gesetzt, aber das hatte keine spürbare Wirkung. Indem ich die Höhe des umschließenden div auf eine feste Höhe setze, könnte ich dann die floated divs expandieren lassen, aber nur bis zur festen Höhe des Containers. Wenn der Inhalt in einem der divs die feste Höhe überschritten hat, ist es übergelaufen; die schwebenden Divs weigerten sich zu expandieren.Erstellen einer Reihe von Divs alle die gleiche Höhe mit CSS

Ich googelte dieses floated-divs-von-der-gleichen-Höhe-Problem und anscheinend gibt es keine Möglichkeit, es mit CSS zu tun. Jetzt versuche ich eine Kombination aus relativer und absoluter Positionierung anstelle von Floats zu verwenden. Dies ist die CSS:

<style type="text/css"> 
div.container { 
    background: #ccc; 
    position: relative; 
    min-height: 10em; 
} 
div.a { 
    background-color: #aaa; 
    position: absolute; 
    top: 0px; 
    left: 0px; 
    bottom: 0px; 
    width: 40%; 
} 
div.b { 
    background-color: #bbb; 
    position: absolute; 
    top: 0px; 
    left: 41%; 
    bottom: 0px; 
    width: 40%; 
} 
</style> 

Dies ist eine vereinfachte Version des HTML:

<div class="container"> 
    <div class="a">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.</div> 
    <div class="b">Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer pretium dui sit amet felis. Integer sit amet diam. Phasellus ultrices viverra velit.</div> 
    </div> 

Dies funktioniert, wenn Sie die min-height zu so etwas wie 5em ändern (demonstranting was passiert, wenn der Gehalt übersteigt die minimale Höhe), und Sie können sehen, dass, während der Text nicht abgeschnitten wird, die divs immer noch zu erweitern verweigern. Jetzt bin ich verloren. Gibt es eine Möglichkeit, dies mit CSS zu tun?

+2

* hust *

* hust * ;-) –

Antwort

2

Sie genau die gleiche Höhe zu machen kann eine schwierige Sache sein, aber wenn sie nur scheinen, um die gleiche Höhe zu sein, können Sie sich die faux columns Technik ansehen.

Ich habe ein paar andere Methoden ausprobiert, aber dies ist der zuverlässigste Weg, den ich gefunden habe, um den Effekt zu erzielen, abgesehen von der Verwendung von Tabellen natürlich.

1

Sie können JavaScript verwenden, aber es wird natürlich ohne JavaScript aktiviert. Dann gibt es Tische, aber das ruiniert den Punkt von CSS. Vielleicht seanb's answer könnte funktionieren, platzieren Sie ein Hintergrundbild, das die Illusion erstellt, dass alle Spalten nach unten gehen. Dies ist bekannt als die faux Hintergrundtechnik.

Oder sitzen Sie eng und warten Sie auf display: table-cell für alle/die meisten Browser unterstützt werden.

10

Hier ist einer jener Momente, in denen man zwischen idealistischer oder realistischer Haltung stecken bleiben kann. Ich verstehe, dass es keinen semantischen Wert gibt, nicht-tabellarische Daten aus Gründen der Formatierung in eine Tabelle zu schreiben, aber ich möchte nicht, dass Sie sich rückwärts beugen, um eine nicht-tabellarische Lösung für dieses Problem zu erstellen.

Ich bin der erste, der nicht-semantische Designs abschiesst, vertraue mir, aber manchmal musst du dich der Tatsache stellen, dass CSS + semantisches Markup nicht für alle Designszenarien funktioniert. Ich kenne die Zugänglichkeitsanforderungen dieser Website nicht, aber ich würde empfehlen, dass Sie sich eine praktikablere Lösung für dieses Problem suchen.

Prost Sie, wenn Sie sich dem richtigen Weg nähern und nach der richtigen Lösung suchen! Leider ist dies eine der dunklen Ecken von CSS (zusammen mit der vertikalen Positionierung innerhalb eines Blocks), die einfach unmöglich ist ohne falsche Spalten, Javascript oder Tabellenzellen.

Egal, was Sie wählen, bitte halten Sie sich nicht an einen Standard.

+1

Gut gesagt, es ist unwahrscheinlich, dass jemand verletzt wird, wenn Sie einen Tisch benutzen ... – seanb

0

Danke für die Antworten, Leute. Ich glaube nicht, dass das Hintergrundbild funktionieren wird, weil die Breite der Spalten auch davon abhängen kann, wie viele Spalten es gibt (der Benutzer kann es ändern).Ich denke, ich werde Tabellen verwenden :(

+0

Tabellen ist es! Wenn Sie sich in ein paar Jahren wirklich schlecht fühlen, können Sie sie auf divs umschalten und display: table-cell ... – alex

1

OK, die Tabelle Sache erwies sich als ein wenig schwieriger, als ich dachte, es wäre. Es stellt sich heraus, die Javascript-Lösung ist eigentlich die einfachste (für meine Situation), seit meinem . App ist eine AJAX-App und das Framework verwendet Prototype.js Alles was es braucht ist ein paar Zeilen von JS:

$$('div.container').each(function (element) { 
var longest = 0; 

element.descendants().each(function (child) { 
    if (child.getHeight() > longest) 
    longest = child.getHeight(); 
}); 

element.descendants().each(function (child) { 
    child.style.height = longest + 'px'; 
}); 
}); 

nochmals vielen Dank für die Hilfe

0

, wenn Ihr für eine rein CSS-Option suchen, und. Sie können den Hintergrund des Blocks vom Inhalt trennen, dann ist die Antwort zwei, zwei Bits Code für jeden Block, einen für den Inhalt, einen für den Hintergrund, das ist, wie es ist e:

<div id="wrapper"> 
    <div class="content" id='one> 
    <div class="content" id="two> 
    <div class="content" id="three> 
    <div class="background" id="back-one"> 
    <div class="background" id="back-two"> 
    <div class="background" id="back-three"> 
</div> 

Positionieren Sie die Content-Divs mithilfe von Floats. Dann positionieren Sie die Hintergründe mit absoluter Positionierung (und einem Z-Index, um sie hinter zu setzen)

Dies funktioniert, weil die Schwimmer die Höhe einstellen können, und die absolut positionierten Elemente können 100% Höhe haben. Es ist ein bisschen unordentlich, aber macht den Job.

Verwandte Themen