Dies ist praktisch das Pinterest-Layout. Die online gefundenen Lösungen sind jedoch in Spalten eingeschlossen, was bedeutet, dass der Container versehentlich horizontal wächst. Das ist nicht das Pinterest-Layout, und es funktioniert nicht gut mit dynamisch geladenen Inhalten.
Was ich tun möchte, ist eine Reihe von Bildern mit fester Breite und asymmetrischer Höhe, die horizontal angeordnet sind, aber in eine neue Reihe gewickelt werden, wenn die Grenzen des Containers mit fester Breite erreicht sind:
Kann Flexbox dies tun oder muss ich auf eine JS-Lösung wie Masonry zurückgreifen?
javascript
css
flexbox
pinterest
Guybrush Threepwood
quelle
quelle
answer to a similar question
von Evan Sharp, Autor des Pinterest-Skripts und Mitbegründer von Pinterest, der die Logik erklärt.Antworten:
Flexbox ist ein "1-dimensionales" Layoutsystem: Es kann Elemente entlang horizontaler oder vertikaler Linien ausrichten.
Ein echtes Rastersystem ist "zweidimensional": Es kann Elemente entlang horizontaler UND vertikaler Linien ausrichten. Mit anderen Worten, Zellen können sich über Spalten und Zeilen erstrecken, was Flexbox nicht kann.
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 (siehe unten).
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 umbrochen wird und eine neue Zeile erstellt. Es kann nicht unter div # 2 gewickelt werden .
Wenn Elemente nicht die höchsten in der Reihe sind, bleibt daher ein Leerraum übrig, wodurch unschöne Lücken entstehen.
Bildnachweis: Jefree Sujit
column wrap
LösungWenn Sie zu wechseln
flex-flow: column wrap
, werden Flex-Elemente vertikal gestapelt, und ein gitterartiges Layout ist besser erreichbar. Ein Container in Säulenrichtung weist jedoch auf Anhieb drei potenzielle Probleme auf:Infolgedessen ist ein Container in Spaltenrichtung in vielen Fällen möglicherweise nicht realisierbar.
Andere Lösungen
Container hinzufügen
In den ersten beiden Bildern oben sollten Sie die Elemente 2 und 3 in einem separaten Behälter verpacken. Dieser neue Container kann ein Geschwister von Punkt 1 sein. Fertig.
Hier ein detailliertes Beispiel: Layout der Taschenrechner-Tastatur mit Flexbox
Ein Nachteil, der hervorgehoben werden sollte: Wenn Sie die
order
Eigenschaft verwenden möchten, um Ihr Layout neu anzuordnen (z. B. bei Medienabfragen), wird diese Option möglicherweise durch diese Methode beseitigt.Desandro Mauerwerk
So erstellen Sie eine Website, die wie Pinterest funktioniert
CSS-Grid-Layout-Modul Ebene 1
Beispiel für ein Rasterlayout: Nur CSS-Mauerwerkslayout, jedoch mit horizontal angeordneten Elementen
quelle
Was Sie wollen, können Sie in
3 erreichen2 Arten werden, CSS-weise:1.
Flexbox:.parent { display: flex; flex-direction: column; flex-wrap: wrap; max-width: {max-width-of-container} /* normally 100%, in a relative container */ min-height: {min-height-of-container}; /* i'd use vh here */ } .child { width: {column-width}; display: block; }
2. CSS-Spalten
(Diese Lösung hat den sehr netten Vorteil der eingebauten Lösung
column-span
- ziemlich praktisch für Titel). Der Nachteil ist die Reihenfolge der Artikel in Spalten (die erste Spalte enthält das erste Drittel der Artikel usw.). Ich habe eine jsFiddle dafür gemacht..parent { -webkit-columns: {column width} {number of columns}; /* Chrome, Safari, Opera */ -moz-columns: {column width} {number of columns}; /* Firefox */ columns: {column width} {number of columns}; } .child { width: {column width}; } /* where {column width} is usually fixed size * and {number of columns} is the maximum number of columns. * Additionally, to avoid breaks inside your elements, you want to add: */ .child { display: inline-block; -webkit-column-break-inside: avoid; page-break-inside: avoid; break-inside: avoid-column; }
3. Mauerwerk Plugin
absolute Positionierung nach Berechnung der gerenderten Artikelgrößen über JavaScript (Masonry Plugin).
quelle
Der
column
Ansatz scheint ein guter Kompromiss zu sein, wenn Siecolumn-width
übervmin
odervmax
Einheiten und Drop setzencolumn-count
(erstes Snippet),display:grid
undvmin
ist auch eine Option für die Zukunft (zweites Snippet).Demo mit vmin testen
.container { } ul { margin: 0; padding: 0; } ul li { list-style: none; font-size: 0; } .portfolio ul { -webkit-column-width:50vmin; -moz-column-width:50vmin; column-width:50vmin; -webkit-column-fill:balance; -moz-column-fill:balance; column-fill:balance; -webkit-column-gap: 3px; -moz-column-gap: 3px; column-gap: 3px; } .portfolio ul:hover img { opacity: 0.3; } .portfolio ul:hover img:hover { opacity: 1; } .portfolio ul li { margin-bottom: 3px; } .portfolio ul li img { max-width: 100%; transition: 0.8s opacity; }
<section class="container portfolio"> <ul> <li><img src="http://lantosistvan.com/temp/freecodecamp/IMG_2959-1400px.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/lantosistvan-portfolio-010.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/IMG_6188-dng-k.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/20151220-csaladi-peregi-046-k.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/20151230-csalad-szalai-0194-k.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/lantosistvan-portfolio-001(1).jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528171819-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528171829-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528171938-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528171953-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528194754-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528184948-portfolio.jpg" alt="" /></li> </ul> </section>
ein Link unter anderem https://web-design-weekly.com/2014/11/18/viewport-units-vw-vh-vmin-vmax/
display:grid
Dies macht es auch mit der automatischen Füllung einfach, erfordert jedoch die Festlegung eines Bereichswerts auf das höchste Bild, damit Zeilen und Spalten inbrizieren können.container {} ul { margin: 0; padding: 0; } ul li { list-style: none; font-size: 0; } .portfolio ul { display: grid; grid-template-columns: repeat(auto-fill, minmax(50vmin, 1fr)); grid-gap: 5px; grid-auto-rows: minmax(10px, 1fr); grid-auto-flow: dense; } .portfolio ul:hover img { opacity: 0.3; } .portfolio ul:hover img:hover { opacity: 1; } .portfolio ul li { margin-bottom: 3px; } .portfolio ul li img { max-width: 100%; transition: 0.8s opacity; } li { border: solid blue; grid-row-end: span 1; display: flex; align-items: center; background: lightgray; } li:nth-child(1), li:nth-child(3), li:nth-child(6), li:nth-child(7), li:nth-child(8), li:nth-child(9), li:nth-child(10), li:nth-child(11) { border: solid red; grid-row-end: span 2 }
<section class="container portfolio"> <ul> <li><img src="http://lantosistvan.com/temp/freecodecamp/IMG_2959-1400px.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/lantosistvan-portfolio-010.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/IMG_6188-dng-k.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/20151220-csaladi-peregi-046-k.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/20151230-csalad-szalai-0194-k.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/lantosistvan-portfolio-001(1).jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528171819-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528171829-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528171938-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528171953-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528194754-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528184948-portfolio.jpg" alt="" /></li> </ul> </section>
Sie können https://css-tricks.com/snippets/css/complete-guide-grid/ sehen.
quelle
Sie können den Mauerwerkseffekt gemäß Ihrem Screenshot erzielen, aber Sie haben die Höhe des äußeren Div dynamisch eingestellt
html { box-sizing: border-box; } *, *:before, *:after { box-sizing: inherit; } .item-list { max-width: 400px; border: 1px solid red; display: -ms-flexbox; -ms-flex-direction: column; -ms-flex-wrap: wrap; display: flex; flex-direction: column; flex-wrap: wrap; height: 100vw; } .item-list__item { border: 1px solid green; width: 50%; }
<div class="item-list" > <div class="item-list__item"> Is we miles ready he might going. Own books built put civil fully blind fanny. Projection appearance at of admiration no. As he totally cousins warrant besides ashamed do. Therefore by applauded acuteness supported affection it. Except had sex limits county enough the figure former add. Do sang my he next mr soon. It merely waited do unable. </div> <div class="item-list__item"> Is we miles ready he might going. Own books built put civil fully blind fanny. Projection appearance at of admiration no. As he totally cousins warrant besides ashamed do. </div> <div class="item-list__item"> Is we miles ready he might going. Own books built put civil fully blind fanny. Projection appearance at of admiration no. As he totally cousins warrant besides ashamed do. Therefore by applauded acuteness supported affection it. Except had sex limits </div> <div class="item-list__item"> Is we miles ready he might going. Own books built put civil fully blind fanny. Projection appearance at of admiration no. As he totally cousins warrant besides ashamed do. </div> <div class="item-list__item"> Is we miles ready he might going. Own books built put civil fully blind fanny. Projection appearance at of admiration no. As he totally cousins warrant besides ashamed do. Therefore by applauded acuteness supported affection it. Except had sex limits </div> </div>
quelle
Stattdessen
flexbox
empfehle ich, für solche Gitter Spalten zu verwenden . Wie Sie sehen können, kann der Abstand auf den unteren Bildern besser sein, aber für eine native CSS-Lösung finde ich das ziemlich ordentlich. Nicht mehr JS:.container { max-width: 900px; width: 100%; margin: 0 auto; } ul { margin: 0; padding: 0; } ul li { list-style: none; font-size: 0; } .portfolio ul { -moz-column-count: 4; -webkit-column-count: 4; column-count: 4; -moz-column-gap: 3px; -webkit-column-gap: 3px; column-gap: 3px; } .portfolio ul:hover img { opacity: 0.3; } .portfolio ul:hover img:hover { opacity: 1; } .portfolio ul li { margin-bottom: 3px; } .portfolio ul li img { max-width: 100%; transition: 0.8s opacity; }
<section class="container portfolio"> <ul> <li><img src="http://lantosistvan.com/temp/freecodecamp/IMG_2959-1400px.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/lantosistvan-portfolio-010.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/IMG_6188-dng-k.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/20151220-csaladi-peregi-046-k.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/20151230-csalad-szalai-0194-k.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/lantosistvan-portfolio-001(1).jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528171819-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528171829-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528171938-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528171953-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528194754-portfolio.jpg" alt="" /></li> <li><img src="http://lantosistvan.com/temp/freecodecamp/160528184948-portfolio.jpg" alt="" /></li> </ul> </section>
quelle