Es gibt viele Lösungen für gleich hohe Spalten mit jQuery (wie z.B. matchHeight.js). Die Grundidee ist, die Höhen aller Spalten zu messen und dann allen Spalten die Höhe der höchsten Spalte zuzuweisen.
Aber was, wenn es mehrere Zeilen von Blöcken gibt und Sie nur die Höhen der Blöcke in der aktuellen Zeile anpassen möchten? Dies kann durch unterschiedlich große Thumbnails oder unterschiedliche Textmengen in jedem Feld geschehen.

Stephen Akins hat eine clevere Idee gepostet, wie man dieses Problem löst. Die Idee ist im Grunde dieselbe: Messen Sie die Höhen der divs und setzen Sie sie auf die höchste, aber bevor es das tut, misst es die obere Position. Daraus kann es erkennen, welche divs zu welcher Zeile gehören und nur divs innerhalb dieser Zeile beeinflussen.
Hier ist das Ganze. Ich habe es nur ein wenig von Stephens Originalversion angepasst, um es etwas effizienter zu gestalten.
// IIFE
(function() {
var currentTallest = 0,
currentRowStart = 0,
rowDivs = new Array();
function setConformingHeight(el, newHeight) {
// Setze die Höhe auf etwas Neues, aber erinnere dich an die ursprüngliche Höhe, falls sich etwas ändert
el.data(“originalHeight”, (el.data(“originalHeight”) == undefined) ? (el.height()) : (el.data(“originalHeight”)));
el.height(newHeight);
}
function getOriginalHeight(el) {
// Wenn sich die Höhe geändert hat, gib die ursprüngliche Höhe zurück
return (el.data(“originalHeight”) == undefined) ? (el.height()) : (el.data(“originalHeight”));
}
function columnConform() {
// Finde das höchste DIV in der Zeile und setze die Höhen aller DIVs auf diese Höhe.
$(‘.blocks’).each(function() {
// “Caching”
var $el = $(this);
var topPosition = $el.position().top;
if (currentRowStart != topPosition) {
// Wir sind gerade zu einer neuen Zeile gekommen. Setze alle Höhen für die abgeschlossene Zeile
for(currentDiv = 0 ; currentDiv < rowDivs.length ; currentDiv++) setConformingHeight(rowDivs[currentDiv], currentTallest); // Setze die Variablen für die neue Zeile rowDivs.length = 0; // Leere das Array currentRowStart = topPosition; currentTallest = getOriginalHeight($el); rowDivs.push($el); } else { // Ein weiteres div in der aktuellen Zeile. Füge es zur Liste hinzu und prüfe, ob es höher ist rowDivs.push($el); currentTallest = (currentTallest < getOriginalHeight($el)) ? (getOriginalHeight($el)) : (currentTallest); } }); // Bearbeite die letzte Zeile for (currentDiv = 0 ; currentDiv < rowDivs.length ; currentDiv++) { setConformingHeight(rowDivs[currentDiv], currentTallest); } } // Wenn sich der Inhalt ändern könnte... wahrscheinlich debouncen und ausführen. // $(window).resize(function() { // columnConform(); // }); // DOM Ready // Sie möchten vielleicht auch auf window.onload warten, wenn Bilder die Blöcke ungleichmäßig machen $(function() { columnConform(); }); })(); $('.blocks') müsste durch den gewünschten CSS-Selektor ersetzt werden, um die Höhen zu vereinheitlichen. Oder die Funktion akzeptiert einen Selektor als Parameter oder so.
Wie sieht es mit fließenden Breiten aus?
Einer der Hauptgründe, warum man keine Tabelle dafür verwendet, ist, dass gefloatete divs sich basierend auf dem verfügbaren horizontalen Platz neu anordnen können, was für fließende Breiten praktisch ist. Wir können den obigen Code auch dafür anpassen. Grundsätzlich messen wir beim ersten Ausführen dieses Codes die Höhe jedes Blocks und speichern sie mit der data()-Methode von jQuery. Wenn dann das Fenster vergrößert wird, führen wir den Code erneut aus, verwenden aber die ursprüngliche Größe, um die Zeilen anzupassen, nicht die neue Größe.
Die Demo hierfür ist fließende Breite. Wenn Sie diesen Code möchten, schauen Sie sich einfach den Quellcode an und schnappen Sie ihn sich
Wünschten, es gäbe keine jQuery-Abhängigkeit?
- Ben Howdle: Easy Peasy Equal Heights
- Vitalii Skorokhod: javascript equal height blocks
\
Danke! Ich werde es auf meinen Seiten ausprobieren
Oh, Chris… seit wann mischst du Präsentation mit Javascript?
Oh, BFRED.IT… Ich poste solche Lösungen, wenn sie clever sind und reale Probleme lösen. Es klingt ein wenig so, als hättest du ein Problem damit, also bitte kläre auf.
Vielleicht die Verwendung von display: table-cell; http://bfred.it/b/full-height.html
Ich habe es gerade gemacht, ich habe es noch nicht außerhalb von Webkit getestet und es ist vielleicht nicht elegant, aber es soll auch dann funktionieren, wenn JS deaktiviert ist.
Ich persönlich bin kein Fan von
display: table-cell;. Wenn man diesen Weg geht, gibt es keinen Unterschied, ob man divs verwendet und sie sich wie Tabellen verhalten lässt, oder ob man tatsächlich Tabellen verwendet (was eine tiefere Browserunterstützung hätte).Das gesagt, wenn die Art der angezeigten Daten tabellarisch ist, sind Tabellen eine weitaus bessere Lösung als JavaScript.
Klar gibt es das, Tabellen sind Tabellen, divs sind generische Container. divs mit `table-cell` werden von Maschinen als Container und nicht als Tabellen betrachtet
Entschuldigung, wie ich diese Unterhaltung begonnen habe, ich dachte immer, dies sei ein „gelöstes Problem“
Für jede Person, die wertvolle Tipps wie diesen freiwillig gibt, gibt es immer den „Ja, aber…“-Typ, der eine ungetestete Version auf seiner eigenen Website zusammenstellen kann. :)
Unabhängig davon, Prost und danke fürs Teilen – ich stelle mir in Zukunft viele Möglichkeiten vor, gleiche Höhen für mehrere Spalten zu verwenden.
Wenn das Argument ist, die Semantik von divs gegenüber Tabellenzellen zu erhöhen, dann ja, wenn es sich um nicht-tabellarische Daten handelt, gibt es dort einen Vorteil.
Das ursprüngliche Problem hier war „Nicht-JavaScript-Benutzer werden ausgeschlossen“, was stimmt, aber wenn Sie display: table-cell verwenden, werden noch mehr Leute ausgeschlossen.
IE7 = ca. 6%
kein-JS = ca. 2%
(natürlich hängt es von der Website ab)
Guter Punkt, dann könnten wir die obige JS-Lösung bedingt für
lte IE7hinzufügen, um alle glücklich zu machen :)Ich wäre damit vorsichtig, CSS bei allem, was mit Tabellen zu tun hat – selbst mit Tabellen, die mit CSS generiert wurden – kann sehr schnell schiefgehen. Versuchen Sie, diese Zellen position:relative zu machen mit absolut positionierten Elementen darin und sehen Sie, was passiert. (Die CSS 2.1 Spezifikation lässt das speziell undefiniert :()
Ich erinnere mich, dass es dafür eine Korrektur gab, etwas wie die Verwendung eines div innerhalb der „tabellenzelle“ und die Positionierung dessen, was sich darin befindet. Aber dann, ja, es hängt davon ab, was Sie tun müssen. Wenn Sie nur Textspalten erstellen müssen, funktioniert es gut. Tatsächlich könnte es als Fallback für Browser verwendet werden, die die CSS3-Textspalten nicht unterstützen.
Ich bin mir nicht sicher, ob die div-Korrektur hier funktioniert, sie wird nicht die Höhe der Zelle haben und Sie sind wieder am Anfang, wenn Sie etwas am unteren Rand positionieren möchten.
Wenn Sie es wirklich müssen, werden Sie einen Weg finden, in jedem spezifischen Fall, den Sie haben, absolut zu positionieren (siehe mein aktualisiertes Beispiel in der ersten Spalte für eine Lösung dafür), aber wir sprechen immer noch von Textspalten, höchstens brauchen Sie schwebende Bilder darin.
Eine weitere (teilweise) reine CSS-Lösung ist die Einstellung einer
min-height, die am besten auf statischen Websites oder bei kontrolliertem Inhalt funktioniert (z.B. Beitragsauszüge).Beachten Sie, dass Chris' Beispiel nicht für fließende Layouts funktioniert, wenn Sie diesen Weg einschlagen. Das bedeutet nicht, dass wir die Verwendung des onresize-Ereignisses oder des nicht standardmäßigen
expression()zur Lösung realer Probleme fördern werden.Wenn es darum geht, die Benutzerfreundlichkeit zu erhöhen oder progressive Verbesserung hinzuzufügen, dann ja, verwenden Sie dieses JavaScript ruhig, aber verwenden Sie es nicht für das Layout, das erinnert an die (schlechte) Zeit der frühen 2000er.
Jimminy Cricket.
Aber der ursprüngliche Artikel sprach *nicht* nur von Textspalten.
Ich weise nur darauf hin, dass es einen Kompromiss gibt – Sie können display:table-cell verwenden und Ihre reine CSS-Lösung haben, aber Sie werden andere Dinge verlieren, die Sie vielleicht möchten. Wenn Sie sie nicht wollen, verwenden Sie ruhig display:table-cell. Ich weise darauf hin, weil ich viel zu viel Zeit damit verbracht habe, dies zu umgehen, und andere hier könnten auf das gleiche Problem stoßen.
Und ja, ich denke, dieses Skript ist im Grunde ästhetisch und nicht layout-bezogen. Ich habe dieses spezielle noch nicht ausprobiert, aber vom Konzept her sind alle Inhalte vorhanden, und nichts ändert sich zwischen JS und kein JS, außer den Unterseiten der Blöcke. Beachten Sie aus dem Beispielbild „Booo“, dass die zweite Zeile korrekt oben ausgerichtet, gelöscht usw. ist. Das sollten Sie bereits mit Ihrem CSS tun, dies macht die Felder nur gleich hoch, damit es etwas ordentlicher aussieht.
BFRED.IT
Funktioniert nicht für Liquid-Layouts? Was meinen Sie? Dies ist für Liquid-Layouts gedacht. Es funktioniert für jede beliebige Anzahl von DIVs in einer Zeile. Wenn Ihr Fenster also Platz für 10 DIVs hat oder für 2, sind die DIVs in jeder Zeile gleich hoch (die Höhe des höchsten DIVs in jeder Zeile).
Wenn Sie sich meinen Blog ansehen, sehen Sie eine Version, die mit dem onresize-Ereignis funktioniert, sodass Sie den Rand Ihres Fensters greifen und verschiedene Breiten ausprobieren können und sehen, wie sich die DIVs verschieben und neu anordnen, wenn sie von Zeile zu Zeile wechseln.
Und Jungs: Wen interessiert es, ob JS nicht funktioniert? Die Korrektur ist rein kosmetisch. Leute, die das Web ohne JS durchsuchen, werden viel schlimmere Probleme haben, als nicht alle ihre DIVs auf gleicher Höhe zu haben.
Stephen, meine Gefühle sind dieselben. Leute, die sagen: „Oh, aber funktioniert das auch ohne JavaScript?!!??“, scheinen nie anzuerkennen, dass 99% (nur eine grobe Schätzung) des Webs nicht richtig funktionieren, wenn JavaScript deaktiviert ist. Versuchen Sie, es zu deaktivieren und besuchen Sie Ihre Lieblingsseiten. Verdammt, versuchen Sie, es zu deaktivieren und besuchen Sie DIESE Seite. Es ist nicht hübsch (keine Beleidigung, Chris).
Ich liebe dieses Skript absolut. In Kombination mit Dingen wie 960.gs ist es hervorragend.
Verzeihen Sie mir, wenn das unhöflich klingt… aber für die extreme Minderheit von Desktop-, Mac-, Notebook- und Laptop-Nutzern, die tatsächlich im Internet surfen, wenn sie kein JavaScript verwenden, sind das dann wirklich Leute, die uns Gewinne aus der Nutzung des Webs bescheren oder uns zumindest von der Durchsicht unserer Websites profitieren lassen?
Ich denke, das ist wie ein IE6-Dilemma. So viele Leute haben aufgehört, Websites mit Unterstützung für IE6 zu erstellen, nicht weil es ein schlechter Browser ist… es ist einfach veraltet. Wir leben in einer Welt von CSS3, Jquery, HTML5, Webkit und nicht zu vergessen IE9. Es überrascht mich, dass Blogger und Leser sich überhaupt noch um die Unterstützung von JS kümmern.
Ich kann das nicht glauben… nach drei Tagen des Kampfes habe ich endlich eine Lösung dafür gefunden, und das nur zwei Stunden, nachdem Sie diesen Artikel veröffentlicht haben :-))))))))))
Übrigens, für alle, die sich für das Thema interessieren, schauen Sie sich diesen Forenthread an
https://css-tricks.de/forums/discussion/10602/wrapped-content-that-stretching-two-surrounding-div-s
Dort habe ich viele nützliche Links gepostet..
Statt
Sie könnten Math.max verwenden
Das erspart Ihnen auch die doppelte Höhenberechnung.
Danke Pete, ich werde Ihren Vorschlag in meinem eigenen Code verwenden.
Danke fürs Teilen, Chris, ich liebe den Teil „equalizeThoseMoFos()“!
Ernsthaft, ich bin mir nicht sicher, ob ich eine JavaScript-Lösung für dieses Problem verwenden würde.
Höchstwahrscheinlich würde ich einen Trick verwenden, um gleiche Höhen für sie vorzutäuschen.
Wie wäre es mit der Verwendung von min-height und dem Setzen auf die Höhe der höchsten Spalte… und fertig.
funktioniert nicht, wenn die höchste Spalte durch Inhalt generiert wird ;-)
Das gefällt mir wirklich, ich habe versucht herauszufinden, wie man das macht, vor einiger Zeit, aber es scheint mit der max-height CSS-Funktion fast unmöglich zu sein. Ich weiß jetzt, dass dies die beste Lösung für gleich hohe Spalten ist. Danke für die Idee.
Nach drei Tagen Recherche würde ich nicht sagen „es ist die beste Lösung“.
Es gibt viele Möglichkeiten, diesen Effekt zu erzielen, und man sollte je nach Situation entscheiden.
Abhängig vom Design der Hintergründe der Spalten können Sie diesen Effekt ohne JavaScript erzielen, indem Sie dem übergeordneten Element der Spalten einen repeat-y-Hintergrund hinzufügen.
…was als „css faux columns“ bekannt ist. :-)
cool, wusste nicht, dass es einen Namen hat :-)
Das Problem dabei ist, dass wenn Sie etwas Abstand zwischen den Zeilen von divs haben möchten, Sie jeder Zeile einen Container geben müssen, was viele einfachere Lösungen ermöglicht.
Das stimmt. Aber in den meisten Fällen ist es meiner Meinung nach ein geringeres Übel, etwas nicht-semantisches Markup hinzuzufügen, als sich auf JavaScript für das Layout zu verlassen.
Schönes Setup. Ich habe ein Plugin gemacht, das dies tut, allerdings funktioniert es nicht mit dieser „Zeilenidee“. Meines würde von den Zeilen selbst behandelt werden.
Definitiv eine schöne Idee mit der oberen Position.
Hier ist mein Plugin (ich habe noch ein Update mit mehr Funktionalität, das bald kommt) https://github.com/madmike1029/matchheights
Tolle Sache :)
Wenn ich das nur einen Monat früher gesehen hätte.
Oh ja! Das ist großartig. Der Gedanke, die obere Position zu überprüfen, ist etwas, das ich nie herausgefunden habe.
Und übrigens, ich mag Ihre Benennung sehr, z.B.
equalizeThoseMoFos();. Gefällt mir!Hallo Chris, toller Beitrag! Das wird vielen Leuten helfen, die nach einer Lösung für gleich hohe Spalten suchen, aber Schwierigkeiten haben, die Antwort zu finden. Ich freue mich auf Ihren nächsten Artikel!
Hallo Chris… Ich konnte diesen Beitrag nicht verstehen. Es kann mit einigen oder auch mit … gemacht werden.
Hallo Chris,
Ich finde es eine großartige, einfache/schnelle Lösung für ein lästiges Problem. Danke fürs Teilen.
Es ist nicht nur HTML und CSS plus es gibt eine Menge Code – es ist gut (sogar großartig), wenn Sie viele dynamisch generierte Blöcke haben.
Aber wenn Sie nur ein paar Zeilen verwenden (sagen wir, 5-10 neueste Nachrichten auf einer Website anzeigen), ist es viel „billiger“, Tabellen zu verwenden (kein Server/Client-Code – plus weniger davon).
Ja, ja, ich weiß, man kann kein Eis aus einer Salatschüssel essen… aber hey, es stellt sich heraus, dass man es kann ;)
Ich liebe es, wie Sie die Dinge weniger beängstigend machen. Ich habe eine Weile mit jQuery gekämpft, aber Sie machen es so viel einfacher. Sie sind eine Legende, Chris.
Die unterschiedlich hohen Kästchen sind wirklich nervig!
Warum nicht einfach eine Tabelle verwenden?
Genau!!!!!
Weil man eine variable Anzahl von Spalten haben kann. Das geht mit einer Tabelle nicht.
Sieht so aus, als hätte ein (kurios wiederholter) Tippfehler ein unbeabsichtigtes globales Element eingeführt
„topPostion“
Haben Sie Lint verwendet?
Auch „currentDiv“ ist global.
„new Array()“ und „.length = 0“ sind etwas W3Schools-artig, warum nicht einfach „[]“?
Was für ein cooles Konzept, es hilft mir…
weil ich eine Website so ähnlich wie diese bauen will
http://linesforme.blogspot.com
Ich habe einige Probleme, dies auf einer Standard-WordPress-Installation zum Laufen zu bringen.
Lassen Sie mich das klarstellen – wenn ich jQuery manuell von der Google-Bibliothek aufrufe, funktioniert es.
Der Versuch, jQuery einzubinden oder sich auf das bereits von wp_head() aufgerufene jQuery zu verlassen, scheint nicht zu funktionieren.
Hat jemand Ideen? Ich benutze Chris‘ anderen Artikel über die Einbindung als Leitfaden, aber bisher ohne Erfolg. [http://digwp.com/2009/06/including-jquery-in-wordpress-the-right-way/]
Toller Artikel. Ich stoße oft auf dieses Problem und fühle mich schmutzig, jedes Mal, wenn ich eine Tabelle für nicht-tabellarische Daten verwenden muss.
Das ist eine wirklich gute Umsetzung, gut gemacht!
Ich habe letztes Jahr eine ähnliche Funktion gemacht, um genau das zu tun, aber man musste die Anzahl der Elemente pro Zeile angeben.
Es funktionierte für diesen Fall großartig, aber als Albtraum wiederverwendbar. Ich habe nie daran gedacht, die obere Position zu überprüfen – werde diese Technik definitiv wiederverwenden!
Danke :)
Ich habe tatsächlich eine Methode gefunden, genau das zu tun, nur mit CSS. Ja, das können Sie.
http://www.isegura.es/blog/two-columns-same-height-using-css-and-no-javascript-yes-you-can
Nur weil man es kann, heißt das nicht, dass man es tun sollte.
Ich hatte eine Version davon, bei der ich die Anzahl der Spalten als Argument festlegen musste, aber das ist viel besser :)
Ich habe daraus ein jQuery-Plugin gemacht, um die Verkettung beizubehalten. Und habe es auch minimiert.
Ich hoffe, Sie stört das nicht :) Fühlen Sie sich frei, es zu forken oder was auch immer.
https://github.com/krishandley/jQuery-Equal-Height-Blocks
Ihr Plugin behält die Kette nicht wirklich bei. Sie müssen die Objekte zurückgeben: http://docs.jquery.com/Plugins/Authoring#Maintaining_Chainability
Sollte der folgende Code außerhalb der „each“-Schleife stehen?
// Bearbeite die letzte Zeile
for (currentDiv = 0 ; currentDiv < rowDivs.length ; currentDiv++) {
rowDivs[currentDiv].height(currentTallest);
}
So können Sie viele unnötige Höhenänderungen sparen…
Ja, das habe ich mir auch angesehen. Erstens ist dieser Code doppelt vorhanden. Die erste Instanz, nach dem if (currentRowStart != topPostion), ist nicht notwendig. Die zweite Instanz (weiter unten nach // do the last row) läuft einmal für jedes Element in der jQuery-Kollektion und kümmert sich darum. Dies ist ineffizient, da Sie die Höhen einer Zeile einmal für jede Spalte in dieser Zeile festlegen.
Idealerweise würden Sie die Höhen nur einmal für jede Zeile nach dem each() festlegen. Ich bin sicher, dass der Performance-Hit für nur eine Handvoll Zeilen und Spalten ziemlich gering ist.
Ein weiteres Problem ist, dass wenn Sie nur oben oder unten Polsterung in einem der Elemente haben, die Höhen nicht genau gemessen werden. Nur etwas, das man im Auge behalten sollte. Tom Deaters equalize columns Plugin löst das Polsterproblem: http://tomdeater.com/jquery/equalize_columns/
Dieses Plugin bietet jedoch keine Möglichkeit, Spalten zeilenweise zu vereinheitlichen – was dieser Code tut.
Mann! Wo war das vor einem Monat. Stundenlang versucht, diese verdammten Spalten zu reparieren. Dubweiser.net
Verwenden Sie stattdessen „outerHeight“, um die korrekten Abmessungen für Elemente mit Polsterung/Rand zu erhalten.
http://api.jquery.com/outerHeight/
Ich habe danach gesucht. Vielen Dank.
Ich habe so viele jQuery-Equal-Height-Codes und Plugins getestet, dieses hier ist absolut das beste… Ich frage mich, ob man daraus ein Plugin machen kann?
Großartiges Skript. Es funktioniert nicht genau, wenn
box-sizing: border-box;auf.blocksaktiv ist. Meine schnelle Lösung war, die gesamte vertikale Polsterung zucurrentTallesthinzuzufügen, wenn sie auf die Blöcke angewendet wird. Ich hätte jedoch gerne eine Lösung, die keine Polsterung erfordert. Insbesondere da ichborder-boxliebe.Für diejenigen, bei denen sich ein Div mit Polsterung ändert
currentTallest = Math.max(currentTallest, $el.height());zu
currentTallest = Math.max(currentTallest, $el.outerHeight());Danke für das Skript.
Danke Chris!
Ich benutze die fließende Version aus Chris‘ Demo, aber es gibt ein kleines Problem damit, und ich kann es nicht lösen.
Das Problem
Diese Lösung funktioniert fast mit fließenden Layouts und setzt die Höhe zurück, wenn sich die oberen Positionen ändern, aber sie setzt sie auf die ursprüngliche Höhe des derzeit höchsten Elements in der Zeile zurück, als die Seite zum ersten Mal geladen wurde. Dies ist ein Problem, da die Höhe des höchsten Elements seit dem ersten Laden der Seite geändert worden sein könnte, aufgrund der Verwendung von relativen Einheiten wie ems oder aufgrund von Wortumbrüchen mit Absätzen.
Vorgeschlagene Lösung
Die Lösung wäre, die Höhe der Elemente einer Zeile auf die aktuelle Höhe des höchsten Elements setzen zu lassen, nicht auf die ursprüngliche Höhe.
Haben Sie dies mit Bildern in den Feldern versucht? Wenn es viele Felder mit Bildern oder Bilder mit großen Dateigrößen gibt, wird das JavaScript ausgeführt, bevor die Bilder geladen sind. Wenn jedes Bild geladen ist, sind einige Felder abgeschnitten.
Versuchen Sie es bei window load.
Das tue ich. Aber ich frage mich, ob ich warten muss, bis die gesamte Website geladen ist? Wenn ich ein Div auswähle, das sich um das Bild befindet, scheint .load() nicht zu funktionieren.
Hier ist etwas Ähnliches, das ich zusammengestellt habe
https://github.com/Sam152/Javascript-Grids
Genau das, was ich gesucht habe! Vielen Dank, Sam, Chris & Stephen!
Es ist großartig. Vielen Dank!!! :)
Ich habe eine modifizierte Version davon erfolgreich am Laufen, außer wenn die Browserfensterbreite verringert wird.
Ich habe fließende Breiten, Höhen auf den Elementen in den Zeilen, die sich mit dem Browser verkleinern. Es gibt Mediaquery-Breakpoints, die die Anzahl der Elemente pro Zeile ändern. Das Problem ist, wenn man den Browser kleiner macht, werden die Elemente kleiner, bis sie die Breakpoints erreichen, und dann verringert sich die Anzahl der Elemente pro Zeile und die Elemente werden wieder größer, um den zusätzlichen Platz zu füllen. Das Skript erfasst die kleineren Größen vor den Anpassungen der Breakpoints, daher sind die eingestellten Höhen falsch und die Zeilen überlappen sich.
Hat jemand eine Idee, wie man das lösen kann?
Ich brauchte eine robuste Version dieser Technik, die Dinge wie fließende und responsive Layouts, Zeilen, verzögerte Bilder, gemischte Abstände, Ränder, box-sizing, beliebige DOM-Reihenfolge usw. verarbeitet.
Hier ist mein Versuch eines Plugins für gleiche Höhen, das die praktischen Probleme löst, die ich hatte, falls es jemandem hilft
https://github.com/liabru/jquery-match-height
Hier ist meine Version, wie man das ohne JS macht
http://jsfiddle.net/shay/3P7Nk/
Obwohl ich denke, dass sowohl Flexbox als auch display:table gebräuchlich genug sind, um als Standardlösungen für so etwas angesehen zu werden.
@Liabru – Schönes Skript, das gleiche Höhen definitiv besser handhabt, wo es Probleme mit Padding, Margin & Box-Sizing usw. gibt. Ich habe es auf einer Website getestet, an der ich gerade arbeite, und die Höhen der von mir anvisierten Divs klappen jetzt auf Mobilgeräten nicht mehr zusammen, was vorher der Fall war.
Andere Skripte waren ebenfalls großartig, das muss man sagen! Vielen Dank an Sie alle für die Entwicklung dieser Skripte für gleiche Höhen und deren kontinuierliche Verbesserung!
@Shay Acrich – Mir gefällt die Idee hinter Ihrer Lösung. Könnten Sie nicht einfach Pseudoelemente anstelle der von Ihnen verwendeten Präfix-Elemente verwenden, um die Höhen anzupassen. Ansonsten haben wir dort ein zufälliges Div, das nur zum Stylen dient.
@Rich Dykins, ausgezeichnete Idee mit den Pseudoelementen!
Hier ist die aktualisierte Implementierung, wieder JS-frei: http://jsfiddle.net/Ac5qG/2/
Ich habe versucht, dies in ein jQuery-Plugin umzuwandeln: http://codekipple.com/conformity/
Dies ist immer noch ein nützlicher Ausschnitt, könnte aber einige Korrekturen gebrauchen
Tippfehler korrigieren:
topPostionzutopPositionVerwenden Sie
.offset().topanstelle von.position().top– dies funktioniert mit größerer Wahrscheinlichkeit wie beabsichtigt und unterscheidet korrekt zwischen Zeilen, insbesondere in responsiven Layouts. Die Verwendung von.position()kann fehlschlagen, da Sieposition:relativefür Ihre Zeile (Elemente) oder deren Elternelement festgelegt haben.Verwenden Sie
[]anstelle vonnew Array()–new Array()hat eine Reihe von Tücken und keine Vorteile gegenüber[]und es ist eine gute Idee, JS-Entwickler davon abzubringen, es überhaupt zu verwenden.Wie bereits von einigen Kommentatoren erwähnt, ist es üblich, dies auf Seiten zu verwenden, auf denen sich Bilder innerhalb Ihrer Blöcke befinden. Daher wäre ein Hinweis zur Verwendung von
$(window).load( ... )hilfreich.Danke!
Dies sind einige nützliche Tipps, Pull-Requests für mein Plugin sind willkommen!
https://github.com/codekipple/conformity
Ich dachte, das würde auf meiner neuen Website funktionieren, aber hier ist ein Fall, in dem es das nicht tut, und ich kann beim besten Willen nicht herausfinden, warum die Zeilen nicht ausgerichtet werden.
URL ist http://www.drapertools.org.ukcatprods.pgm?name=Spirit%20Levels&cat=00007875
Wählen Sie "Alle Produkte" und Galerieansicht aus.
Etwa auf halber Höhe der Seite bricht die Ausrichtung zusammen.
Hinweis: Es scheint in Chrome und Safari gut zu funktionieren, aber nicht in Firefox, es sei denn, es ist die neueste Version von Firefox?
Ich habe Ihren überarbeiteten Code ausprobiert, konnte ihn nicht zum Laufen bringen, aber ich sehe, dass Ihre Demo immer noch Stephens Code verwendet.
Danke für jede Hilfe dabei.