Nehmen wir an, Sie haben eine Reihe von Bildern, die Sie anzeigen möchten, und das Ziel ist es, sie randlos zum Browserfenster zu bringen, ohne Lücken. Einfach nur, weil Sie denken, dass das cool wäre. Sie haben alle unterschiedliche Größen. Es macht Ihnen nichts aus, wenn sie neu skaliert werden, aber sie sollten ihr Seitenverhältnis beibehalten. So wie hier

Idealerweise halten wir die Markup-Struktur recht einfach, so etwa
<section id="photos">
<img src="images/cat-1.jpg" alt="Cute cat">
<img src="images/cat-2.jpg" alt="Serious cat">
...
</section>
Ohne jegliches CSS reihen sich die Bilder aneinander, da sie im Wesentlichen Inline-Blöcke sind
Wüsten von WeißraumAber das ist nicht ganz das, was wir wollen. Möglicherweise greifen Sie direkt zu einer JavaScript-Lösung. Möglicherweise das super coole Masonry-Projekt. Das Problem bei der JavaScript-Option ist, dass sie vom `window.resize`-Ereignis abhängt, was (zumindest für mich) Seiten immer träge erscheinen lässt (selbst wenn Sie hip sind und das „Unbouncing“-Ding machen).
Wir können das mit reinem CSS so hinbekommen, wie wir es wollen. Was wir brauchen, sind vertikale Spalten, in denen wir die Bilder platzieren. Auf diese Weise stapeln sich die Bilder übereinander und das Höhenproblem ist irrelevant.
Wir könnten gleiche Anzahlen von Bildern in geflochtene Divs einwickeln, aber das ist nicht sehr einfach auszubalancieren. Der Trick wird darin bestehen, **Masonry CSS** zu verwenden, bei dem die vertikalen Spalten durch die CSS3-Eigenschaft `column-count` erstellt werden. Ja, buchstäblich die Sache, bei der Sie Text automatisch in schmale Spalten setzen können.
Solange das Elternelement mit den mehreren Spalten so breit ist wie das Browserfenster (Standard) und der `column-gap` 0 ist, haben wir es geschafft. Indem wir die Breite des Bildes auf 100 % setzen, nehmen sie genau die Breite einer Spalte ein.
Hier ist das CSS
#photos {
/* Prevent vertical gaps */
line-height: 0;
-webkit-column-count: 5;
-webkit-column-gap: 0px;
-moz-column-count: 5;
-moz-column-gap: 0px;
column-count: 5;
column-gap: 0px;
}
#photos img {
/* Just in case there are inline attributes */
width: 100% !important;
height: auto !important;
}
Aber was ist, wenn das Browserfenster schmaler wird? 5 Spalten mögen für ein sehr breites Browserfenster gut sein, aber für ein schmaleres zu viele (5 Bilder nebeneinander könnten zu schmal werden). Wir können das Problem ganz einfach lösen, indem wir mit Media Queries die Browserbreite testen und die Anzahl der Spalten entsprechend anpassen.
@media (max-width: 1200px) {
#photos {
-moz-column-count: 4;
-webkit-column-count: 4;
column-count: 4;
}
}
@media (max-width: 1000px) {
#photos {
-moz-column-count: 3;
-webkit-column-count: 3;
column-count: 3;
}
}
@media (max-width: 800px) {
#photos {
-moz-column-count: 2;
-webkit-column-count: 2;
column-count: 2;
}
}
@media (max-width: 400px) {
#photos {
-moz-column-count: 1;
-webkit-column-count: 1;
column-count: 1;
}
}
Schick.
Demo
Siehe den Pen Seamless Responsive Photo Grid von CSS-Tricks (@css-tricks) auf CodePen.
Was an dieser Technik cool ist, ist, dass da sie rein aus CSS besteht, alles sehr reibungslos und schnell abläuft. Sie können Ihren Browser beliebig skalieren und beobachten, wie sich die Dinge sehr schnell skalieren und bewegen.
Was ist mit, wissen Sie.
Was die Browserunterstützung angeht, ist sie ziemlich gut, außer bei IE, wo sie nur in 10+ funktioniert. Ansonsten: Firefox 3.6+, Opera 11.1+, Safari 4+, Chrome 10+. Könnte sogar noch tiefer sein.
Sie könnten einen Fallback überspringen, weil er nicht so schlimm ist und nur ein paar weiße Lücken hat. Oder Sie verwenden die Modernizr/YepNope-Kombination (Modernizr kann ihn als `csscolumns` testen), um jQuery Masonry zu laden und zu sehen, was Sie damit machen können. Oder Sie testen ihn und schreiben Ihr eigenes JS, das die Bilder zählt, sie in gleiche Gruppen aufteilt und geflochtene Divs darum wickelt. Was immer Ihnen gefällt.
Super süße Katzen!!
Total. Die sind von LoremPixel. Für die Demo haben wir Bilder in zufälligen Größen mit jQuery geholt
function getRandomSize(min, max) {
return Math.round(Math.random() * (max - min) + min);
}
for (var i = 0; i < 25; i++) {
var width = getRandomSize(200, 400);
var height = getRandomSize(200, 400);
$('#photos').append('<img src="//www.lorempixel.com/'+width+'/'+height+'/cats" alt="pretty kitty">');
}
Sehr cool. :)
Hm… gibt es eine Möglichkeit, das untere Ende zu beheben?

Ich hoffe ja, dass Kommentare Markdown hätten… ach egal. :/
Sehr gut, Chris. Ich hatte vor ein paar Tagen in Foren gepostet, wie man ein solches Rasterlayout erstellt. Danke, dass du ein Tutorial dazu erstellt hast :)
Toller Artikel! Es gibt definitiv einen „Masonry“-Trend im Web, besonders für Bildergalerien. Aber das ist eine reine CSS-Lösung.
Gute Arbeit! Und Danke!
Das ist cool, aber ich würde denken, dass in den meisten Fällen Bilder von links nach rechts und nicht von oben nach unten in Spalten geladen werden sollen… Ich schätze, man könnte seine Bilder sortieren, damit sie so geladen werden, aber das scheint viel Arbeit zu sein, es sei denn, es ist eine statische Liste.
1|2|3|4
5|6|7|8
vs
1|3|5|7
2|4|6|8
Es könnte eine Art jQuery-Ding geben, das die Fotos richtig anordnet
1|2|3|4
5|6|7|8
Wenn jemand es kann, dann kannst du noch einen gelben Stern verdienen!
Sehr schöner Artikel, danke für den Tipp. Interessantes Konzept für Portfolio-Seiten.
-Matt
Schade, dass CSS-Spalten keine „column-min-width“ und „column-max-width“ erlauben. Das wäre „im Trockenen“ ohne Media Queries.
Schöner Artikel. Ziemlich clevere Idee. Das wird sicherlich meine nächste Bilderwand inspirieren.
Muss bei der Kompatibilität korrigieren. Zumindest in meinem Firefox 3.6.18 funktioniert es nicht. Bilder werden auf 100% des Browserfensters skaliert. Es sieht so aus, als würden die Spalten nicht verwendet.
Ich werde später nachforschen.
Danke für den Artikel
Sascha
Cool, Chris, danke für dieses Tutorial. Habe gerade neulich mit ein paar Entwicklern über dieses genaue Format gesprochen, sie wollten jegliches jQuery usw. minimieren, um ein Design in ein CMS zu übertragen. Wenn wir also noch diesen Weg gehen müssen, werde ich ihnen auf jeden Fall diese reine CSS-Technik zeigen.
Was macht das „rand(200, 400)“ im PHP? Es scheint keine Höhe zu sein, sondern Teil des Bildlinks.
Originalcode
gibt das aus
`rand(200,400)` gibt eine zufällige Zahl zwischen 200 und 400 zurück und gibt sie im Höhenteil der URL aus (echoed).
Es ist Teil der URL. Der Dienst (placedog) nimmt Argumente aus der URL und gibt Hundebilder mit den angegebenen Abmessungen zurück.
Großartige Arbeit!
Hey Chris! Ich frage mich, warum du aufgehört hast, `rel="(CSS, HTML, PHP usw.)"` zu verwenden
Ich war einfach faul, ich habe diese behoben.
Danke! Obwohl es dann nicht nötig wäre, zum Beispiel vor dem Code „PHP:“ zu schreiben und dann PHP wieder im „Code-Bereich“ zu schreiben. Ich habe vorgeschlagen, `rel` wieder zu verwenden, weil ich dachte, Sie müssten dann nicht mehr „PHP:“ oder „Hier ist das CSS:“ vor dem Code-Bereich schreiben.
Und wenn der obige Kommentar unhöflich klingt, dann nehmen Sie es mir nicht übel, ich entschuldige mich im Voraus =)
Hallo Chris, schöner Artikel und eine sehr schicke Technik.
Wenn ich mich nicht irre, gibt es einen kleinen Tippfehler in Ihren Media Queries. Sollte `#people` nicht `#photos` sein?
Ja, sollte es :-) Habe nur viel zu viel Zeit damit verbracht, alles im Download zu debuggen.
Ja… behoben, danke
Wow, das ist so geradlinig und nützlich. Prost.
Cool. Und wie schön wäre das als Plugin für WordPress: Eine Übersicht über jedes jemals veröffentlichte Bild, verlinkt zu seinem Beitrag… ;o)
Wie wäre es mit der Idee eines WordPress-Themes, das Miniaturansichten von Bildern wie diesen im Vollbildmodus als Abkürzungen zu Blogbeiträgen postet? Ein Feld bliebe jedoch an fester Stelle als Logo?
Das ist eigentlich eine tolle Idee. Ich sehe, dass das sehr nützlich sein könnte, besonders für Portfolio-ähnliche WordPress-Seiten. Es könnte Text geben, der beim Überfahren eines Bildes erscheint, um den Beitrag kurz zu beschreiben. So viele verschiedene Dinge könnten damit gemacht werden.
Ich stimme Darryl zu. Meine Hauptidee dazu ist ein einfacher Ort, um Pix-Nachrichten (per Telefon) sowie andere Fotos, Designs, Grafiken und Beiträge zu mischen. Ich werde sehen, was ich tun kann, um eines zu machen. Bin mir nicht sicher, wie ich die Funktionen zum Schleifen bringen soll und trotzdem eine einzelne Box an Ort und Stelle halten kann.
Tolle Idee… hat die Zahnräder dafür in Gang gesetzt!
Ihre Lösung ist in IE7 so nah dran… tolles Tutorial! Danke.
Das ist wirklich nett!
ziemlich cool.
Ich benutze diese Technik auf einer meiner Lifestyle-Websites
http://iliketheweekend.com/
Eine Sache ist beim img-Stil zu beachten: Wenn Sie eine Positionierung wie relativ oder etwas anderes hinzufügen, hat Safari einen seltsamen Bug, der das CSS3-Spaltenlayout unterbricht.
AWSOME!! Wandfüllende Kätzchen durch reine CSS-Power. Der Tag kann nicht besser werden! ;-) Gute Arbeit.
Eine weitere Idee für einen Nicht-CSS-Fallback wäre die Verwendung des Attributs `align=”absmiddle”` bei den img-Tags. Dies würde die Bildmittelpunkte horizontal ausrichten.
Schöne reine CSS-Lösung.
Schön. Es ist nützliches CSS.
Sehr schön! Das muss ich ausprobieren, viel schöner (und sauberer) als eine (nicht von Ihnen), die ich in der Vergangenheit verwendet habe. Danke!
Sehr sehr cool!
Hey, Chris!
Das ist eine ausgezeichnete Anwendung des „Masonry“-Stils! Und zu sehen, dass du meine `column-count`-Technik dafür benutzt, ist die größte Bestätigung, dass es eine gute Idee war, die ich mir hätte wünschen können.
Prost und danke!
PS: +1 für die Idee „mach das zu einem WordPress-Plugin“.
Toller Artikel, ich liebe das Ghostbusters-Zitat darin.
Schick. Es ist schön zu sehen, wie CSS-Techniken angewendet werden, um Probleme zu lösen, die nicht immer offensichtlich sind.
Ich bin ein großer Fan davon, HTML-Markup super einfach zu halten, und CSS3 ermöglicht es uns, fantastische Dinge zu tun, ohne das Markup zu überladen.
Machen Sie weiter so!
Wow! Ich liebe diese Seite wirklich. Ihr bietet gute Informationen. Ich liebe auch Ihren Einsatz von Kätzchen. Ich bin ein Tucson Webdesigner, daher ist das alles super nützlich für mich. Machen Sie weiter so. Ich werde regelmäßig vorbeischauen, um weitere Tipps und Hinweise zu erhalten. Danke.
Das ist eine wirklich schöne Lösung für ein seit jeher bestehendes Problem. Sehr nützlich.
Anstatt CSS3 zu verwenden, hätten Sie sie nicht als Inline-Blöcke belassen und `vertical-align: top` verwenden können? Und Sie hätten die Leerzeichen zwischen ihnen entfernen können, indem Sie `font-size` auf 0 setzen?
Ich möchte nicht auf einer toten Pferdestute herumreiten, aber der Download hat immer noch den Fehler, dass die Section-ID `people` statt `photos` lautet.
Tolles Tutorial! Ich suche das schon lange! Und das rein mit CSS!
Es gibt placedog.com? Super!
Hey Chris, ich liebe diese Idee.
Ich versuche, eine Version dieser Technik auf meiner Seite zu implementieren, aber ich glaube, ich stoße auf ein paar Probleme mit der Art und Weise, wie Webkit Spalten behandelt?
Ich habe 6 Bilder / 6 Spalten bei hohen Auflösungen und 6 Bilder / 3 Spalten bei niedrigeren Auflösungen. In Firefox verhält es sich wie erwartet, aber nicht in Chrome oder Safari. Wenn man zu den höheren Auflösungen zurückkehrt, bleibt es bei 3 Spalten?
Wenn jemand einen schnellen Blick darauf werfen könnte, wäre das sehr willkommen – http://jsfiddle.net/Pa7mU/2/
Danke
Dasselbe ist mir passiert. Das ist ein Webkit-Problem, es behandelt CSS3-Sachen normalerweise anders. Ich versuche, eine Lösung zu finden, um es besser aussehen zu lassen, aber bisher erfolglos… Haben Sie dieses Problem gelöst?
Soweit ich gesehen habe, erscheint auch ein Fehler, wenn man `line-height` deklariert, und es funktioniert ziemlich gut ohne diese. Sozusagen.
@Janos – Ich habe im Grunde aufgegeben, eine Lösung nur mit CSS zu finden und stattdessen jQuery Masonry verwendet.
Was für eine clevere Technik, danke!
Aber etwas hat mich an Ihrem PHP am Ende gefesselt
if ($i % 2 == 1) {Sie können natürlich das `== 1` weglassen, da PHP 1 als wahr und 0 als falsch behandelt. Könnte kleinlich erscheinen, aber ich denke, es ist etwas eleganter
Großartige Arbeit!
Ich habe ein ärgerliches Problem mit dem Hinzufügen von Bildunterschriften und frage mich, ob mir jemand helfen kann.
Hier ist die Testseite: http://souchi.com/pages/celebrity3 Wie Sie sehen können, bleibt der Text, der am Ende der längsten Spalte landet, nicht am Ende dieser Spalte. Er möchte in die nächste Spalte wechseln.
Mein HTML sieht so aus
und mein CSS sieht so aus
Weiß jemand die Lösung, um diese Bildunterschrift mit dem Bild zu verbinden? Prost.
Übrigens, hallo Chris! Sie könnten `column-width` verwenden und die Media Queries komplett weglassen… Hier ist eine Demo: http://jsfiddle.net/tovic/nX9NT/1/embedded/result%2Chtml%2Ccss/
Hallo Chris, danke für den genial einfachen Code, es hat mich Stunden und Stunden gekostet, ihn auf dem iPhone zum Laufen zu bringen. Ich habe endlich entdeckt, dass der Kopf die Meta-Angabe `name=”viewport” content=”width=device-width,initial-scale=1.0″` enthalten muss, sonst bleibt das Telefon bei seiner Auflösung stehen, die zwischen 800px und 1000px liegt (3 Spalten, 2 Bilder breit). Ihr Code funktionierte auf http://iphonetester.com/ und ich konnte meinen Laptop-Chrome-Bildschirm verkleinern und sehen, wie er sich gut verkleinert, aber auf dem iPhone war er kaputt… daher denke ich, Sie sollten die unverzichtbare Viewport-Zeile zu Ihrem Download hinzufügen :)
Eine Frage, können Sie die Bilder so laden lassen, dass sie über die Zeilen statt über die Spalten laufen? Auf einem Fünf-Spalten-Bildschirm möchte ich, dass die Geschichte von links nach rechts durch die Zeilen geht…
Was geht verloren, wenn man den Spaltenabstand von 0 auf etwas Größeres ändert? 1px, 2px? Ich liebe den Effekt, hätte aber gerne die Option eines kleinen Abstands zwischen den Bildern. Habe 1px Abstand in Firefox versucht und es sieht okay aus. Beeinträchtigt das Mobilgeräte/Responsivität? Danke!
Schauen Sie sich diese Seite an, die ich gerade fertigstelle
http://www.moopio.com/pictures.php?id=439441916098422&page=1
Verwendung von Bootstrap + Masonry + Infinite Scroll Plugin
Grüße!
Schöne Technik. Placedog.com scheint abgelaufen zu sein und von einem Spekulanten gekauft worden zu sein, sodass die Hundebilder in der Demo nicht angezeigt werden. Vielleicht ist es Zeit, voll auf Katzen umzusteigen?
Vorerst mit Katzen behoben, danke!
Wie üblich, wenn ich Ihre Website besuche, bin ich beeindruckt von den Möglichkeiten einer einfachen CSS-Eigenschaft. Sie sind wirklich großartig, ich liebe Ihre Seite!! Vielen Dank für das Teilen so interessanten Wissens und Tricks!