Ich muss ein ziemlich gewöhnliches Mauerwerkslayout implementieren. Aus einer Reihe von Gründen möchte ich jedoch kein JavaScript verwenden, um dies zu tun.
Parameter:
- Alle Elemente haben die gleiche Breite
- Elemente haben eine Höhe, die serverseitig nicht berechnet werden kann (ein Bild plus verschiedene Textmengen)
- Ich kann mit einer festen Anzahl von Spalten leben, wenn ich muss
Es gibt eine triviale Lösung dafür, die in modernen Browsern funktioniert, die column-count
Eigenschaft.
Das Problem bei dieser Lösung ist, dass die Elemente in Spalten angeordnet sind:
Während ich die Elemente in Reihen anordnen muss, zumindest ungefähr:
Ansätze, die ich ausprobiert habe und die nicht funktionieren:
- Gegenstände herstellen
display: inline-block
: Verschwendet vertikalen Raum. - Gegenstände herstellen
float: left
: lol, nein.
Jetzt könnte ich das serverseitige Rendering ändern und die Elemente neu ordnen, indem ich die Anzahl der Elemente durch die Anzahl der Spalten dividiere. Dies ist jedoch kompliziert und fehleranfällig (basierend darauf, wie Browser die Elementliste in Spalten aufteilen) um es wenn möglich zu vermeiden.
Gibt es eine neue Flexbox-Magie, die dies ermöglicht?
Antworten:
Flexbox
Ein dynamisches Mauerwerkslayout ist mit flexbox nicht möglich, zumindest nicht sauber und effizient.
Flexbox ist ein eindimensionales Layoutsystem. Dies bedeutet, dass Elemente entlang horizontaler oder vertikaler Linien ausgerichtet werden können. Ein Flex-Element ist auf seine Zeile oder Spalte beschränkt.
Ein echtes Rastersystem ist zweidimensional, dh es kann Elemente entlang horizontaler UND vertikaler Linien ausrichten. Inhaltselemente können sich gleichzeitig über Zeilen und Spalten erstrecken, was Flex-Elemente nicht können.
Aus diesem Grund verfügt die Flexbox nur über eine begrenzte Kapazität zum Aufbau von Gittern. Dies ist auch ein Grund, warum das W3C eine andere CSS3-Technologie entwickelt hat, Grid Layout .
row wrap
In einem Flex-Container mit
flex-flow: row wrap
müssen Flex-Elemente in neue Zeilen umbrochen werden .Dies bedeutet, dass ein Flex-Element nicht unter ein anderes Element in derselben Zeile gewickelt werden kann .
Beachten Sie oben, wie Div # 3 unter Div # 1 umschließt und eine neue Zeile erstellt. Es kann nicht unter div # 2 gewickelt werden .
Wenn die Elemente nicht die höchsten in der Reihe sind, bleibt der Leerraum erhalten, wodurch unschöne Lücken entstehen.
column wrap
Wenn Sie zu wechseln,
flex-flow: column wrap
ist ein gitterartiges Layout besser erreichbar. Ein Container in Säulenrichtung weist jedoch auf Anhieb vier potenzielle Probleme auf:Infolgedessen ist ein Container in Spaltenrichtung in diesem Fall und in vielen anderen Fällen keine Option.
CSS-Raster mit undefinierten Artikelabmessungen
Das Rasterlayout wäre eine perfekte Lösung für Ihr Problem, wenn die verschiedenen Höhen der Inhaltselemente im Voraus festgelegt werden könnten . Alle anderen Anforderungen liegen innerhalb der Kapazität von Grid.
Die Breite und Höhe von Rasterelementen muss bekannt sein, um Lücken mit umgebenden Elementen zu schließen.
Daher ist Grid, das beste CSS-Angebot für den Bau eines horizontal fließenden Mauerwerks, in diesem Fall nicht ausreichend.
Bis eine CSS-Technologie mit der Fähigkeit zum automatischen Schließen der Lücken eintrifft, hat CSS im Allgemeinen keine Lösung. So etwas würde wahrscheinlich ein erneutes Fließen des Dokuments erfordern, daher bin ich mir nicht sicher, wie nützlich oder effizient es sein würde.
Du brauchst ein Skript.
JavaScript-Lösungen verwenden in der Regel die absolute Positionierung, bei der Inhaltselemente aus dem Dokumentfluss entfernt werden, um sie ohne Lücken neu anzuordnen. Hier sind zwei Beispiele:
Desandro Mauerwerk
So erstellen Sie eine Website, die wie Pinterest funktioniert
CSS-Raster mit definierten Artikelabmessungen
Für Layouts, bei denen die Breite und Höhe von Inhaltselementen bekannt sind, finden Sie hier ein horizontal fließendes Mauerwerkslayout in reinem CSS:
jsFiddle-Demo
Wie es funktioniert
inline-grid
wäre die andere Option)grid-auto-rows
Eigenschaft legt die Höhe automatisch generierter Zeilen fest. In diesem Raster ist jede Reihe 50 Pixel groß.grid-gap
Anwesen ist eine Abkürzung fürgrid-column-gap
undgrid-row-gap
. Diese Regel legt eine 10-Pixel-Lücke zwischen Rasterelementen fest . (Dies gilt nicht für den Bereich zwischen Elementen und dem Container.)Die
grid-template-columns
Eigenschaft legt die Breite explizit definierter Spalten fest.Die
repeat
Notation definiert ein Muster sich wiederholender Spalten (oder Zeilen).Die
auto-fill
Funktion weist das Raster an, so viele Spalten (oder Zeilen) wie möglich auszurichten, ohne den Container zu überlaufen. (Dies kann zu einem ähnlichen Verhalten wie bei Flex-Layouts führenflex-wrap: wrap
.)Die
minmax()
Funktion legt einen minimalen und maximalen Größenbereich für jede Spalte (oder Zeile) fest. Im obigen Code beträgt die Breite jeder Spalte mindestens 30% des Containers und höchstens den verfügbaren freien Speicherplatz.Die
fr
Einheit repräsentiert einen Bruchteil des freien Speicherplatzes im Gittercontainer. Es ist vergleichbar mit derflex-grow
Eigenschaft von Flexbox .Mit
grid-row
undspan
sagen wir den Rasterelementen, über wie viele Zeilen sie sich erstrecken sollen.Browser-Unterstützung für CSS Grid
Hier ist das vollständige Bild: http://caniuse.com/#search=grid
Coole Grid-Overlay-Funktion in Firefox
Wenn Sie in Firefox-Entwicklungstools den Rastercontainer überprüfen, befindet sich in der CSS-Deklaration ein winziges Rastersymbol. Beim Klicken wird auf der Seite ein Umriss Ihres Rasters angezeigt.
Weitere Details finden Sie hier: https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Examine_grid_layouts
quelle
Dies ist eine kürzlich entdeckte Technik mit Flexbox: https://tobiasahlin.com/blog/masonry-with-css/ .
Der Artikel macht für mich Sinn, aber ich habe nicht versucht, ihn zu verwenden, daher weiß ich nicht, ob es irgendwelche Einschränkungen gibt, die nicht in Michaels Antwort erwähnt sind.
Hier ist ein Beispiel aus dem Artikel, in dem die
order
Eigenschaft verwendet wird, kombiniert mit:nth-child
.Stapelschnipsel
quelle
order
Eigenschaft, sodass sie so aussieht, als würden Elemente von links nach rechts fließen. Dennoch ist sein Haupttrickflex-flow: column wrap
, der in der obigen Antwort erwähnt wird. Außerdem kann es die Elemente nicht so fließen lassen, wie es ein echtes Mauerwerk tut, z. B. wenn das 3. und 4. Element in die 3. Spalte passen würde, würden sie es tun, das verknüpfte nicht. Aber wie gesagt, alles hängt von den Anforderungen ab, und in diesem Fall (dieser Frage) funktioniert es nicht so, wie es verlangt wurde.