Gleiche Spaltenhöhen sind seit jeher ein Bedürfnis von Webdesignern. Wenn sich alle Spalten den gleichen Hintergrund teilen, ist eine gleiche Höhe irrelevant, da Sie diesen Hintergrund auf ein Elternelement anwenden können. Wenn jedoch eine oder mehrere Spalten ihren eigenen Hintergrund benötigen, wird dies für die visuelle Integrität des Designs sehr wichtig.


Wenn ein Design eine **NICHT** fließende Breite hat, wird diese Aufgabe erheblich einfacher. Die beste Technik für ein Layout mit fester Breite ist Dan Cederholms Faux Columns, bei der die Spalten in ein Container-Element (das Sie wahrscheinlich sowieso schon haben) eingeschlossen werden und dieser Container einen vertikal wiederholten Hintergrundbild-Effekt erhält, um das Aussehen von gleich hohen Spalten zu simulieren, selbst wenn die Elemente selbst nicht tatsächlich gewachsen sind.
Wenn **fließende Breite *und* mehrere Spalten** ins Spiel kommen, wird diese Aufgabe schwieriger. Wir können kein statisches Bild mehr verwenden, um das Aussehen mehrerer Spalten zu simulieren. Aber alle Hoffnung ist nicht verloren. Im Folgenden werden wir eine Reihe verschiedener Techniken untersuchen, um fließende Spalten mit gleicher Höhe zu realisieren.
Doug Neiner Methode
Doug hat sich das vor ein paar Monaten während eines kleinen Nerd-Chats ausgedacht. Die Idee ist, CSS3-Verläufe zu verwenden, um die Spalten zu erstellen. *Verläufe?!* Tatsächlich. Wir denken normalerweise, dass Verläufe Farben über eine Distanz ineinander übergehen lassen. Wir erstellen jedoch Verläufe mit CSS, indem wir "Farbstopps" deklarieren, die spezifische Orte sind, an denen die Farbe genau wie dort angegeben ist. Der Trick besteht darin, überlappende Farbstopps zu verwenden. Auf diese Weise können Sie erreichen, dass eine Farbe endet und eine andere beginnt, ohne einen sichtbaren "Verlauf".
Schauen Sie sich an, wie Sie einen Fünf-Spalten-Hintergrund erhalten können, indem Sie einen Farbstopp bei 0 % und 100 % sowie Doppelte bei 20 %/40 %/60 %/80 % deklarieren.
.five-columns {
background-image: -webkit-gradient(linear,
left top,
right top,
color-stop(0, #eee),
color-stop(20%, #eee),
color-stop(20%, #ccc),
color-stop(40%, #ccc),
color-stop(40%, #eee),
color-stop(60%, #eee),
color-stop(60%, #ccc),
color-stop(80%, #ccc),
color-stop(80%, #eee),
color-stop(100%, #eee)
);
background-image: -webkit-linear-gradient(
left,
#eee,
#eee 20%,
#ccc 20%,
#ccc 40%,
#eee 40%,
#eee 60%,
#ccc 60%,
#ccc 80%,
#eee 80%,
#eee 100%
);
background-image: -moz-linear-gradient(
left,
#eee,
#eee 20%,
#ccc 20%,
#ccc 40%,
#eee 40%,
#eee 60%,
#ccc 60%,
#ccc 80%,
#eee 80%,
#eee 100%
);
background-image: -ms-linear-gradient(
left,
#eee,
#eee 20%,
#ccc 20%,
#ccc 40%,
#eee 40%,
#eee 60%,
#ccc 60%,
#ccc 80%,
#eee 80%,
#eee 100%
);
background-image: -o-linear-gradient(
left,
#eee,
#eee 20%,
#ccc 20%,
#ccc 40%,
#eee 40%,
#eee 60%,
#ccc 60%,
#ccc 80%,
#eee 80%,
#eee 100%
);
}
Dieses CSS wird auf einen Wrapper aller Spalten angewendet. Da wir für diese Farbstopps Prozentsätze verwenden, wird dieses simulierte Fünf-Spalten-Hintergrundbild genauso gestreckt und geschrumpft, wie Sie es in einem fließenden Breiten-Design erwarten. Sie können dies als moderne Erweiterung von Faux Columns betrachten.
Die Markup selbst ist eine Reihe von Spalten innerhalb dieses Wrappers.
<div class="five-columns group">
<div class="col"><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>
<div class="col"><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p></div>
<div class="col"><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>
<div class="col"><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p></div>
<div class="col"><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>
</div>
Beachten Sie die Klasse "group", die die Clearfix-Klasse ist, damit der Eltern-Wrapper seine Höhe behält, obwohl er nur gefloatete Kinder enthält (er würde normalerweise kollabieren).
Ich halte das für eine ziemlich clevere Umsetzung der Idee. Beachten Sie, dass nur moderne Gecko- und WebKit-Browser CSS3-Verläufe unterstützen, sodass Ihre Opera- und älteren IE-Besucher die Spaltenhintergründe nicht sehen. Die Spaltenstruktur sollte jedoch bis hin zu IE 6 intakt bleiben.
Diese Methode ermöglicht eine Quellreihenfolge-Unabhängigkeit, indem negative und positive linke Ränder verwendet werden, um Spalten zu positionieren. Hier ist eine Demo der Doug Neiner-Methode, bei der die Spalte, die an erster Stelle in der Quellreihenfolge steht, in die Mitte verschoben wird.
Nicolas Gallagher Methode
Nicolas Gallagher hat einen Artikel veröffentlicht, der ein Juwel ist, über die Verwendung von CSS2-Pseudo-Elementen, um eine Reihe von Effekten zu erzielen, die sonst schwer zu realisieren sind oder zusätzlichen HTML-Kram erfordern.
Die Idee ist, den Eltern-Wrapper mit relativer Positionierung zu versehen. Dies setzt den Kontext für die absolute Positionierung darin. Dann machen wir jede der drei Spalten ein Drittel der Breite des Elternelements und positionieren sie relativ darin, wobei wir sie bei Bedarf mit relativer Positionierung verschieben. Dies ermöglicht auch eine Quellreihenfolge-Unabhängigkeit.
Zwei der sichtbaren Hintergrundfarbspalten werden von absolut positionierten Block-Level-Pseudo-Elementen (:before und :after) erzeugt, die wiederum ein Drittel der Breite, aber 100% der Höhe des Elternelements haben. Diese beiden "Spalten" haben einen negativen z-index-Wert, sodass sie unter dem sichtbaren Textinhalt der Spalte liegen können. Die dritte "Spalte" ist eigentlich nur die Hintergrundfarbe des Wrappers, die durchscheint. Da die Höhe des Wrappers durch die Höhe der höchsten Spalte bestimmt wird, funktioniert dies.
.pseudo-three-col {
position: relative;
background: #eee;
z-index: 1;
width: 100%;
}
.pseudo-three-col .col {
position: relative;
width: 27%;
padding: 3%;
float: left;
}
.pseudo-three-col .col:nth-child(1) { left: 33%; }
.pseudo-three-col .col:nth-child(2) { left: -33.3%; }
.pseudo-three-col .col:nth-child(3) { left: 0; }
.pseudo-three-col:before, .pseudo-three-col:after {
content: " ";
position: absolute;
z-index: -1;
top: 0;
left: 33.4%;
width: 33.4%;
height: 100%;
background: #ccc;
}
.pseudo-three-col:after {
left: 66.667%;
background: #eee;
}
Tabellen verwenden
Manchmal ist eine bewährte Methode, die die Arbeit erledigt, der richtige Weg. Eine Möglichkeit, die Idee von fließenden Spalten mit gleicher Höhe sicher zu realisieren, ist eine verdammte Reihe von Tabellenzellen. Nur für den Fall, dass Sie vergessen haben, wie das aussieht, es ist so
<table id="actual-table">
<tr>
<td>
<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p>
</td>
<td>
<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>
</td>
<td>
<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p>
</td>
<td>
<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>
</td>
<td>
<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p>
</td>
</tr>
</table>
Geben Sie jeder Tabellenzelle eine prozentuale Breite, die sich zu 100 % summiert, und Sie sind bestens gerüstet. Selbst wenn Sie dann den Zellen Polsterung hinzufügen, ordnet sich die Tabelle korrekt an.
#actual-table { border-collapse: collapse; }
#actual-table td {
width: 20%;
padding: 10px;
vertical-align: top;
}
#actual-table td:nth-child(even) {
background: #ccc;
}
#actual-table td:nth-child(odd) {
background: #eee;
}
Nun sagen wir mal, dass diese Tabellen-Markup Ihnen einen Schrecken einjagt. Sie können tatsächlich eine einfache Div-Markup verwenden, sie aber trotzdem dazu zwingen, sich wie eine Tabelle zu verhalten. In diesem Fall würden wir so etwas tun
<div id="css-table">
<div class="col"><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>
<div class="col"><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p></div>
<div class="col"><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>
<div class="col"><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p></div>
</div>
Und dann CSS-Tabellen verwenden
#css-table {
display: table;
}
#css-table .col {
display: table-cell;
width: 25%;
padding: 10px;
}
#css-table .col:nth-child(even) {
background: #ccc;
}
#css-table .col:nth-child(odd) {
background: #eee;
}
Neben der Verwendung einer komfortablen Markup sparen wir tatsächlich Markup, da wir direkt von der Tabelle zu den Tabellenzellen gelangen können. Kein Element muss eine Tabellenzeile simulieren.
Sind CSS-Tabellen die Antwort auf unsere Träume? Sie sind ziemlich cool, aber sie werden in IE 7 nicht unterstützt, also wenn Sie daran interessiert sind, diesen Weg zu gehen, empfehle ich einfach die Verwendung von tatsächlicher Tabellen-Markup. Es gibt wirklich keine signifikanten Vorteile bei der Verwendung von CSS-Tabellen.
Der bedeutendste Nachteil beider Tabellenmethoden ist die Abhängigkeit von der Quellreihenfolge. Es gibt wirklich keinen Weg, die erste Spalte in der Quellreihenfolge an einer anderen Stelle als der ersten Spalte erscheinen zu lassen.
One True Layout Method
Eines der klassischsten Layouts aller Zeiten ist die One True Layout. In einer der Demos wird die Lösung für gleiche Spaltenhöhen behandelt. Es ist eine ziemlich clevere Technik, die auch heute noch hervorragend funktioniert. Die Idee, wie üblich, verwendet ein umgebendes Element für alle Spalten. Dieser Wrapper erhält eine versteckte Überlauf-Eigenschaft, die nicht nur die gefloateten Spalten löscht, sondern alles ausblendet, was außerhalb liegt. Dies ist besonders wichtig, da wir die Höhe der Spalten extrem erhöhen und sie dann mit dem versteckten Überlauf abschneiden werden. Der magische Voodoo hier ist, dass wir, während wir die Spalten mit einem riesigen Bottom-Padding erhöhen, die Höhe des Wrappers mit einem gleich großen negativen Bottom-Margin wieder nach oben ziehen. Das gibt uns genau den Effekt, den wir brauchen.
Die Markup ist nichts, was wir nicht schon gesehen hätten
<div id="one-true" class="group">
<div class="col"><h3>I am listed first in source order.</h3><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>
<div class="col"><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p></div>
<div class="col"><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>
</div>
Dann ist das CSS einfach gefloatete Spalten mit dem Margin/Padding-Trick.
#one-true { overflow: hidden; }
#one-true .col {
width: 27%;
padding: 30px 3.15% 0;
float: left;
margin-bottom: -99999px;
padding-bottom: 99999px;
}
#one-true .col:nth-child(1) { margin-left: 33.3%; background: #ccc; }
#one-true .col:nth-child(2) { margin-left: -66.3%; background: #eee; }
#one-true .col:nth-child(3) { left: 0; background: #eee; }
#one-true p { margin-bottom: 30px; } /* Bottom padding on col is busy */
Beachten Sie, dass das Padding an den Unterseiten der Spalten durch den darin enthaltenen Inhalt erzeugt wird, da wir uns nicht auf das Bottom-Padding der Spalte selbst verlassen können, da es mit seinem schicken Trick beschäftigt ist. Quellreihenfolge-Unabhängigkeit ist hier genauso wie wir es bereits behandelt haben, mit dem Verschieben durch linke Ränder.
Flexbox-Methode
Flexbox kann diese Situation problemlos bewältigen. Hier ist eine Referenz für alle Funktionen und Browserunterstützung und dergleichen.
Die Markup ist wieder perfekt sauber
<div class="flexbox">
<div class="col"><h3>I am listed first in source order.</h3><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>
<div class="col"><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p></div>
<div class="col"><p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p></div>
</div>
Die CSS erfordert einige Vendor-Präfixe (oder verwenden Sie Autoprefixer), um das Flex-Layout zu starten
.flexbox {
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
overflow: hidden;
}
Von dort aus können wir ihre Breiten ziemlich einfach ausgleichen
.flexbox .col {
flex: 1;
}
Die Eigenschaft `align-items` kann auf `stretch` gesetzt werden, um sicherzustellen, dass sie gleich hoch sind, aber das ist der Standard! Wir müssen sie also gar nicht setzen.
Als Krönung können wir die Position der Spalten ändern, indem wir einfach ihre Reihenfolge auf die gewünschte Position setzen. Es ist am besten, alle Spalten explizit dort zu platzieren, wo Sie sie haben möchten; Ich fand, dass die Einstellung nur bestimmter Spalten problematisch war. Dennoch ist die Möglichkeit, die Position ohne Layout-Hacks zu ändern, großartig.
.flexbox .col:nth-child(1) {
background: #ccc;
order: 1;
}
.flexbox .col:nth-child(2) {
background: #eee;
order: 0;
}
.flexbox .col:nth-child(3) {
background: #eee;
order: 2;
}
JavaScript-Optionen
Natürlich gibt es auch JavaScript-Lösungen für gleich hohe Spalten. Wir haben das in "Equal Height Blocks in Rows" ein wenig untersucht, und es gibt eine gute CodePen Demo von Michah Godbolt, die diese Methode veranschaulicht.
Wenn Sie den Weg eines jQuery-Plugins gehen möchten, schauen Sie sich matchHeight an, das Ihnen hilft, die Höhe ausgewählter Elemente zu angleichen.
Kurze Notizen
- Die Verwendung von Prozenten für das Layout ist in WebKit nicht perfekt
- In dieser Demo habe ich Dinge wie :nth-child verwendet, um einige Spalten anzusprechen. Sie werden wahrscheinlich eine bessere browserübergreifende Kompatibilität erzielen, wenn Sie Ihren Spalten spezifische Klassennamen geben und diese Klassennamen stattdessen verwenden. Ich war mehr daran interessiert, die Theorie zu untersuchen, und einige der schicken modernen Techniken funktionieren nur in Browsern, in denen :nth-child sowieso funktioniert.
- Bonus-Tipp: Sie können eine Faux Columns-ähnliche Technik mit fließenden Spalten verwenden, wenn Sie nur zwei Spalten haben. Dies wird im aktuellen (v7) Design von CSS-Tricks verwendet. Das Layout ist eine 2-Spalten-Fließbreite, und die Hintergrundfarbe der Seitenleiste stammt von diesem Bild. Die Spalte kann wachsen, da die Platzierung dieses Hintergrunds Prozente verwendet, um sie korrekt anzupassen, wenn das Container-Element in der Breite wächst.
background: url(sidebar.png) repeat-y 61.7% 0; - Das flexible Layoutmodell unterscheidet sich stark vom CSS3-Layoutmodul. Anscheinend bläst der Wind in Bezug auf die tatsächliche Implementierung in Richtung flexibles Layout.
Das ist so umfassend! Tolle Arbeit und eine großartige Referenz.
Kurzer Hinweis: Ihr Link zur Nicolas Gallagher-Methode ist 404, Chris.Ich erinnere mich an eine Methode, die ich zuvor verwendet habe und die dem, was Nicolas' Beschreibung ähnelt, sehr ähnlich ist, bei der Sie absolute Positionierung verwenden, aber der Teil, den ich nie wusste, war, dass Sie absolute Positionierung auf beiden Seiten eines Elements verwenden können, um es an den Rand seines relativen Containers zu "saugen". Wenn Sie also z. B. absolut mit top: 0; und bottom: 0; verwenden, zieht es die Spalte bis zum unteren Rand. Ich bin mir nicht sicher bei der Browserkompatibilität, aber soweit ich weiß, funktioniert es in IE, und wenn es dort funktioniert ... nun, Sie wissen den Rest.
Übrigens, ich sehe, dass Sie am 16. November beim JQuery Summit dabei sind, klingt interessant.
Chris, wie immer großartige Arbeit, Mann! Ich werde diese Seite auf jeden Fall bookmarken. Danke
Ad. "Nicolas Gallagher Methode"
Ich würde die Pseudo-Elemente lieber so codieren
Warum ist `bottom: 0;` besser als `height: 100%`? Weil es viel flexibler ist. Sie haben Kontrolle über Abstände; z. B. `bottom: 1px;` (versuchen Sie das mit height :)).
Diesen Mechanismus habe ich dank Google gelernt.
Sie sollten auch auf IE7, Gecko 1.9x (K-Meleon, FF2.x) und FF3.0 achten (obwohl ich mir bei letzterem nicht sicher bin). In diesen Browsern können Sie die Positionierung von Pseudo-Elementen nicht vollständig kontrollieren. Sie werden Ihr Layout durcheinanderbringen. Zumindest sollte die explizit deklarierte Höhe vermieden werden, ebenso wie der Rand (obwohl Sie die Randfarbe mit rgba oder besser – hsla deklarieren könnten, weil ich *denke*, dass FF3.0 diese Deklaration ignorieren würde). Es könnte auch gesünder sein, `content: '';` anstelle von `content: ' ';` zu deklarieren, aber das hängt wahrscheinlich davon ab :).
Danke Chris für diesen umfassenden Artikel!
Ich bin ein großer Fan von browserübergreifenden Lösungen für diese Art von "Aufgaben", daher bevorzuge ich die Methode "Faux Columns" und/oder "table".
Hier ist ein gutes Beispiel für ein solches Layout
http://chikuyonok.ru/2010/01/liquid-site-markup/
Hallo Chris,
Wie sieht es mit der Lösung von Matthew James Taylor aus?
http://matthewjamestaylor.com/blog/ultimate-multi-column-liquid-layouts-em-and-pixel-widths
Ich habe es vor einiger Zeit benutzt und es war sehr nützlich.
Diese Technik habe ich vor einiger Zeit angewendet und sie funktionierte so reibungslos. Zuerst wollte ich mich nur auf eine JS-Lösung verlassen.
Ich mag Matthews Layouts wirklich. Ich habe Einwände gegen einige ihrer Designelemente, aber insgesamt sind sie hervorragend.
OK, wenn das Beispiel in allen gängigen Browsern funktioniert.
Keine der Lösungen funktioniert in IE7, zumindest nicht für mich. Ich kann mich nicht dazu durchringen, etwas auszuprobieren, das nicht einmal IE7 unterstützt.
Erstaunlich! Das einzige Problem, das ich sehe, ist, dass es unter IE6 nicht funktioniert. Ich war kurz davor, völlig durchzudrehen, wenn es dort funktionieren würde, haha. Was für eine Überraschung, warum sollte es funktionieren!
Meine Güte, IE6 muss endlich verschwinden, ich habe es so satt
Toller Artikel. Ich benutze JavaScript, um meine Spalten zu gestalten... offensichtlich ist das nicht ideal – aber ich fand dies die sauberste Methode.
Was ist Ihre Meinung zur Verwendung von JS dafür?
Die One True Layout-Methode hat für mich immer funktioniert.
Ich weiß, das ist pingelig, aber ich fühle mich komisch, wenn ich #css-table {display: table;} verwende. Wenn es sich *genau* wie eine Tabelle verhalten muss, gibt es vielleicht einen guten Grund, warum es einfach eine Tabelle sein könnte?
Was kommt als nächstes?
h2.paragraph { display: table; }
span.heading { display: h2 }
Aber eine großartige Zusammenfassung!! Wirklich nützlich.
Was wirklich traurig ist, ist, dass die einzige Lösung, die in allen Browsern funktioniert, ja sogar bis zurück zu IE6, Tabellen sind. Keine Hacks, keine browserspezifischen Selektoren, nichts.
Hallo, wie wäre es mit einem jQuery-Plugin? Ich benutze normalerweise http://www.cssnewbie.com/equal-height-columns-with-jquery/. Es ist einfach und schnell.
"Nur für den Fall, dass Sie vergessen haben, wie das aussieht, es ist so"
Bwhahaha!
Die Flexbox-Methode funktioniert in Firefox mit einigen Codeänderungen perfekt. Zuerst müssen Sie die Kindelemente auch als Boxen definieren, indem Sie ihre Anzeige auf "(prefix-)box" setzen. Um sicherzustellen, dass Boxen ohne feste Breite umbrechen können, müssen Sie das (prefix-)box-flex-Attribut setzen, das 1 oder höher sein kann, wenn Sie eine bestimmte Box größer als die anderen möchten. Danach erhalten Sie durch die Einstellung von (prefix-)box-orient auf "vertical" in den Kindboxen Boxen unterschiedlicher horizontaler Größe, die aber kleiner sein können als ihr Inhalt. Ich bin mir nicht sicher, ob es ein Fehler in Firefox (und Google Chrome) ist, aber das Setzen jeder Größe auf die Boxen nach diesen Schritten macht sie alle gleich breit.
Um alle Boxen ohne zusätzliche Methode gleich hoch zu machen, müssen Sie nur die (prefix-)box-align-Eigenschaft entfernen (oder auf "stretch" ändern), wodurch alle Boxen gleich hoch sind, ohne Ränder/Polsterungen oder Überlauf-Clipping.
Hier ist ein korrigierter CSS, damit dies sowohl in Firefox als auch in Webkit funktioniert
#flexbox {
display: -webkit-box;
-webkit-box-orient: horizontal;
-webkit-box-align: stretch;
display: -moz-box;
-moz-box-orient: horizontal;
-moz-box-align: stretch;
display: box;
box-orient: horizontal;
box-align: stretch;
}
#flexbox .col {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-box-flex: 1;
display: -moz-box;
-moz-box-orient: vertical;
-moz-box-flex: 1;
display: box;
box-orient: vertical;
box-flex: 1;
padding: 30px 3%;
width: 300px; /* Dies könnte jeder Wert in Pixeln sein, der gleich bleibt, soweit ich das bisher sehe */
}
Das Elastic CSS Framework macht das schon seit einer Weile und löst auch das Subpixel-Rounding in allen Browsern korrekt.
jQuery muss eine der Optionen sein. Wie andere bereits erwähnt haben, kann es leicht verwendet werden, um dies zu lösen. Der Fallback sind einfach ungleiche Spalten.
Verwenden Sie außerdem jQuery für browserübergreifendes nth-child.
Ich glaube, es braucht 3, vielleicht 4 Zeilen jQuery, um dies dynamisch zu machen und in allen Browsern zum Laufen zu bringen. nth-child ftw!
Ich habe von Paul Irishs Flexbox-Methode gelesen und mag die Einfachheit davon wirklich. Das Problem bei solchen Lösungen ist, dass die Browserunterstützung so verdammt begrenzt ist. Ich frage mich, ob jemand so etwas wie PIE hat, das diese Art von Eigenschaften handhabt.
Das CSS-Framework YAML bietet seit fast zwei Jahren (Januar 2009) eine produktionsreife, browserübergreifende Lösung für flexible Spalten mit gleicher Höhe, basierend auf CSS-Tabellen (für moderne Browser) und der One True Layout-Methode für IE.
http://www.yaml.de/fileadmin/examples/06_layouts_advanced/equal_height_boxes.html
Chris,
Toller Artikel, ich designe seit etwa 2 Jahren, und das hat mich immer wieder ins Stocken gebracht.
Außerdem, sehr schönes Site-Update... Ich weiß nicht, wie lange das neue Aussehen schon da ist, aber es sieht großartig aus!
Prost!
Es gab einen ziemlich bösen Bug mit der 'One True Layout'-Methode in Firefox. Seitenanker können dazu führen, dass der Seiteninhalt verschwindet. Er war definitiv in Version 3 vorhanden, könnte aber inzwischen behoben worden sein. Abgesehen davon ist es meiner Meinung nach die beste Methode von allen.
Sie wollen, dass eine Reihe von Spalten in einer Tabelle sich so verhalten, wie Sie es erwarten. Benutzen Sie das gute alte Element! Sicher, es ist vielleicht nicht sexy und ausgefallen und alles andere, aber es.
JS, CSS und JavaScript-Methoden, verdammt?! Warum brauchen wir so viele komplizierte und kreative Lösungen für etwas, das gar kein Problem ist?
Warum vergessen wir die einfachsten Lösungen? Es ist, als würde man einen Plasmaschneider benutzen, um ein Stück Papier auszuschneiden? Haben wir vergessen, wie man eine Schere benutzt?
Manche von uns haben keine Zeit, das Rad neu zu erfinden...
Ich verstehe den Wunsch, eine einfache, zeitbewährte Methode zu verwenden, vollkommen. Ich habe zwei Methoden zur Verwendung von Tabellen dafür in den Artikel aufgenommen. Ein wesentlicher Grund, nach CSS-Methoden zu suchen, ist jedoch der Grund, warum wir überhaupt CSS verwenden: Abstraktion von Layout und Design vom Markup. Das Klassenbeispiel: Sagen wir, Sie haben 1.000 Seiten HTML, die mit einem Drei-Spalten-Layout mit Tabellen strukturiert sind. Nun muss sich das Design ändern und die linken und rechten Spalten müssen vertauscht werden. Wenn Ihr Layout CSS wäre, könnten Sie es mit einer einzigen Änderung am CSS erledigen. Wenn Ihr Layout Tabellen direkt im Markup sind, werden Sie 1.000 Änderungen vornehmen.
Verwenden Sie das gute alte <TABLE< Element! Sicher, es ist vielleicht nicht sexy und ausgefallen und alles andere, aber es **funktioniert überall**.
Gute Arbeit, die simulierte Tabelle mit Divs hat mir tatsächlich geholfen, ein Problem auf einer meiner Seiten zu lösen. Ich musste zu einer Tabelle innerhalb eines Divs greifen, was ich weiß, ist ein No-Go, aber das löst das Problem, dass ich diesen Workaround verwenden muss.
Vielen Dank, dass Sie den Code für die verschiedenen Methoden geteilt haben, der Link zu Matthew James Taylor in den Kommentaren war fantastisch, Vielen Dank Dennis. LT
Toller Artikel, Chris.
Ich wusste nichts von den verschiedenen Arten von Methoden zur Erreichung gleicher Spaltenhöhen!
Warum hast du nicht die JavaScript-Lösungen erwähnt?
jQuery gibt Ihnen die Höhe einer Box. Sie können die Höhen aller Ihrer Elemente vergleichen, die höchste erhalten und dann die restlichen Elemente auf diese Höhe setzen. Einfach.
Ich habe diese Technik für die Arbeit verwendet;
http://www.webanywhere.co.uk/education/products
Klicken Sie auf "Produkte anzeigen"
Sie können die Quellansicht der JavaScript-Datei ansehen und nach "#packages .package-fold" suchen, um die tatsächliche Technik zu sehen.
Diese Beispiele funktionieren in keinem IE (IE6, IE7, IE8) Browser.
Ich bin vor ein oder zwei Jahren auf dieses Problem gestoßen und habe am Ende ein hübsches kleines jQuery-Plugin von Tom Deater verwendet http://www.tomdeater.com/jquery/equalize_columns/ Der Kunde benötigte, dass die Website in ie6 funktioniert, daher schien dies die am einfachsten zu implementierende und robusteste Lösung zu sein.
Die folgende Technik verwendet keine Bilder, keinen zusätzlichen Markup, kein CSS3, keine Pseudoklassen, kein JavaScript, keine absolute Positionierung.
Alles, was sie verwendet, sind Ränder und negative Ränder
http://www.smashingmagazine.com/2010/11/08/equal-height-columns-using-borders-and-negative-margins-with-css
Tolle Zusammenfassung… Ich habe eine neue reine CSS Cross-Browser-Lösung entwickelt, die Sie vielleicht interessiert: http://thelucid.com/2010/12/03/the-solution-to-fluid-inconsistencies-and-equal-height-columns/
Vergaß zu erwähnen, dass es in Safari, Chrome, Firefox und IE6 und höher funktioniert.
Die Methode, über die ich vor Jahren geschrieben habe, ist die Verwendung von zwei Wrappern, von denen jeder ein eigenes Hintergrundbild hat, das prozentuale Hintergrundpositionswerte verwendet. Das Tutorial finden Sie unter http://www.communitymx.com/abstract.cfm?cid=AFC58. Es ist nicht unbedingt die sauberste Lösung, aber sie funktioniert immer noch und hat eine sehr breite Browserunterstützung.
Toll, funktioniert wie erwartet. Besonders gut gefällt mir die Padding- und Negativ-Margin-Methode. Sie hat mir geholfen, eine Frage auf Stack-Overflow zu lösen. Kudos!
Beachten Sie, dass die Gradientenmethode in Chrome (derzeit v35) nicht zuverlässig ist, da sie mit einer Skala von 256 optimieren und Rundungsfehler auftreten – die Farbübergänge sind also nicht an der richtigen Position.
Siehe diesen Pen ( http://codepen.io/elliz/pen/fCsay ) für eine coole animierte Demonstration (wenn Sie Chrome verwenden) und Links zu SO-Fragen/Diskussionen sowie der Chrome-Bug-Liste.
Weiß jemand, wie man dieses Problem löst?
in der „One True Layout Method“, wenn Sie ein bestimmtes
<p>mit einer ID wielipsumhaben und dann die Seite als mypage.html#target laden, wird der Rest des Inhalts als overflowed:hidden angezeigt, sodass nicht mehr auf der Seite vorhanden ist…