Leser Marcin A schrieb uns mit dieser Frage zu einer einfachen ungeordneten Liste, bei der die Elemente vertikal (von oben nach unten) statt horizontal (von links nach rechts) angeordnet sein sollten.
Also Markup wie
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
Was dann so aussehen würde
1 4
2 5
3 6
Nun, Marcin, leider gibt es hier kein float: down;, das Sie vielleicht möchten. Es gibt eine Reihe von Möglichkeiten, aber wie Sie vielleicht vermuten, haben alle ihre Vorbehalte.
Absolute Positionierung
Wenn Sie wissen, dass Sie das Layout genau wie in diesem Textdiagramm haben möchten und die genaue Breite und Höhe jedes Elements kennen, können Sie sie einfacher absolut positionieren. Das sind viele Wenns, aber es kann der Fall sein, wenn es sich hauptsächlich um eine Reihe von Bildern handelt.
Siehe den Pen gasif von Chris Coyier (@chriscoyier) auf CodePen
Noah Blon hat eine automatisierte Sass-basierte Version, um dies für eine beliebige Anzahl von Listenelementen zu erleichtern.
Siehe den Pen Vertikal ausgerichtete Liste in 2 Spalten – IE9+ von Noah Blon (@noahblon) auf CodePen
Flexbox-Spalten
Flexbox wurde für solche Dinge entwickelt. Sie können die ungeordnete Liste als Flex-Container mit Spaltenausrichtung verwenden und Umbrüche zulassen. Im Wesentlichen
ul {
display: flex;
flex-direction: column;
flex-wrap: wrap;
}
Um das Layout genau abzugleichen, werde ich dem Flex-Container eine Breite und Höhe zuweisen. Wenn Sie keine Breite haben, ist jede Spalte so breit wie nötig, um den Container zu füllen. Wenn Sie keine Höhe haben, werden die Elemente nicht umbrochen.
Siehe den Pen yHoeI von Chris Coyier (@chriscoyier) auf CodePen
Zur Erinnerung: Sie möchten hier die Syntax mischen, um die beste Unterstützung zu erzielen.
Der Vorteil hierbei ist, dass die Elemente beliebig groß sein können und das Verhalten beibehalten wird. Der Nachteil ist nur IE 10+.
Textspalten
Eine weitere Möglichkeit ist, die Elemente als Inline-Block zu gestalten und CSS3-Textspalten zu verwenden. Im Wesentlichen
ul {
column-count: 2;
column-gap: 0;
}
li {
display: inline-block;
}
Jeder Block verhält sich wie normaler Text, er füllt die Spalte vertikal, bevor er zur nächsten übergeht.
Siehe den Pen oFyEH von Chris Coyier (@chriscoyier) auf CodePen
Textspalten werden gleichmäßig über die Breite des Containers verteilt. Wenn Sie also sehr spezifisch bezüglich der Spaltenbreiten sein möchten, müssen Sie die Breite des Containers genau festlegen.
Ein Unterschied zu Flexbox ist, dass versucht wird, die Elemente so gut wie möglich gleichmäßig auf die Spalten zu verteilen. Sie müssen also keine Höhe angeben, wenn Sie nicht wollen. Im Wesentlichen wird versucht, es so kurz wie möglich zu machen.
Bringen Sie Ihre eigenen Präfixe mit, und wieder auch IE 10+.
Haben Sie eine andere Methode?
Lassen Sie es uns hören! CSS macht Spaß. Vielleicht Grid Layout in der Zukunft?
Absolut toll!
Aber was ist mit Elementen einer Tabelle? Das wäre großartig.
http://cdpn.io/yHoeI würde für ie9+ funktionieren, aber man müsste die Anzahl der Elemente kennen und ich bin mir nicht sicher, wie das mit unbekannten Breiten funktioniert
Benötigt die Flexbox-Option ein Vendor-Präfix, um unter Firefox zu funktionieren, oder unterstützt ffx diese Syntax einfach nicht?
Ja, ich sehe auch keine Umbrüche in FF.
Firefox unterstützt flex-wrap noch nicht. Sie können den Fortschritt hier verfolgen: https://bugzilla.mozilla.org/show_bug.cgi?id=702508
Gut zu wissen. Und auch gut zu wissen, dass es wahrscheinlich noch in diesem Jahr unterstützt wird (siehe die letzten 3 Kommentare im Bug-Report)
^ Das hätte sein sollen http://codepen.io/anon/pen/CnIJe
Diese Lösung gefällt mir sehr gut. Sie ist sauber und einfach... und keine Kompatibilitätsprobleme
vielleicht verstehe ich das Problem nicht, aber…
http://codepen.io/anon/pen/zuArf
aaah, Entschuldigung, löschen Sie meinen Kommentar :)
Das wäre die einfache Option... wenn
<div>innerhalb von<ul>gültiges HTML wäre (meiner Meinung nach gibt es keinen Grund, warum es das nicht sein sollte, aber es ist es nicht): http://codepen.io/stucox/pen/twrCGFast jeder Browser sollte das aber trotzdem problemlos rendern.
Sie können CSS-Spalten verwenden. Sehen Sie sich mein Beispiel hier an: http://codepen.io/anon/pen/tgcow
Ja Mann! Das habe ich auch im Artikel stehen.
Hier ist es mit einfachen Floats und nicht viel Trickerei.
(Für diese Lösung müssen Sie die Breiten nur in bestimmten Fällen kennen. Wenn der Inhalt Ihrer Liste einfacher Text ist, fließt der Inhalt von 3/4/5 um die gefloateten 1/2/3, ohne dass breitenabhängige Ränder erforderlich sind.)
Wie würde das mit 3 Spalten gemacht? Würde der 'clear' das durcheinanderbringen?
Ja, das Clear bewirkt, dass dieser Ansatz nur mit 2 Spalten funktioniert. Er funktioniert nur, weil die 2. Spalte nicht tatsächlich gefloatet ist.
Es könnte durchaus ein float: bottom geben. Wenn die Spezifikationen für CSS Books und CSS Figures durchgehen (http://blog.whatwg.org/css-books-css-figures).
Vielleicht mit etwas zusätzlichem Markup?
http://codepen.io/Bennyville/pen/KIbtA
Ach, ungeordnete Liste... mein Fehler :)
Haben Sie jemals darüber nachgedacht, etwas mehr hinzuzufügen
als nur Ihre Artikel? Ich meine, was Sie sagen ist wichtig
und alles. Stellen Sie sich aber vor, Sie hätten einige großartige Bilder oder Videos hinzugefügt
Clips, um Ihren Beiträgen mehr "Pepp" zu verleihen! Ihr Inhalt ist ausgezeichnet, aber mit
Bildern und Videos könnte diese Website definitiv
eine der besten in ihrem Bereich sein. Toller Blog!
Eine Mischung aus Float- und Inline-Block-Elementen kann den Deal machen
http://codepen.io/nobuti/pen/kuEio
Ich wusste nichts von dem ~ Selektor – sehr nützlich!
Ich dachte, ich füge dies etwas sauberer hinzu, mit ein wenig Erklärung.
Annahmen
1 – Sie wissen, wie viele Listenelemente in der Sammlung sind. Persönlich würde ich einen Klassen auf der Serverseite am mittleren Punkt für dynamische Listen anwenden
2 – Sie kennen die Abmessungen der Listenelemente oder sind bereit, border-collapse oder keine Ränder zu verwenden, um eine prozentuale Positionierung zu ermöglichen
3 – Sie müssen IE8 nicht unterstützen (oder haben ein Polyfill für nth-child)
Mit diesen Aspekten können Sie nth-child(4) verwenden, um (im Falle von 6 Elementen) das erste Element nach der Mitte anzusprechen und es aus dem Fluss zu ziehen, indem Sie einen negativen oberen Rand verwenden. Nachfolgende Elemente werden damit fließen. Sie können dann nth-child(n+4) verwenden, um das erste Element nach der Mitte und nachfolgende Elemente anzusprechen und einen linken Rand hinzuzufügen.
http://codepen.io/anon/pen/nkgaG
Am einfachsten, am hässlichsten, aber es funktioniert :)
http://codepen.io/erykpiast/pen/Hdfyu
Benutzen Sie einfach float: right und lassen Sie es so aussehen wie float: bottom.
Ähnlich wie AP (aber ohne Elemente aus dem Fluss zu nehmen) könnten Sie Ränder zur Positionierung von Elementen verwenden. so:
Ich würde die Textspaltenlösung als praktikable Alternative zu Flexbox sehen. Man sollte jedoch beachten, dass in Webkit, wenn die Höhen Ihrer Elemente nicht alle gleich sind, ein seltsamer Abstand am unteren Rand aller Spalten entsteht, selbst bei der höchsten (was seltsam ist); Ich vermute, das ist der übliche Webkit-Leerzeichen-Bug.
Streichen Sie diesen Webkit-Bug-Kram. mein Fehler.. dieses Verhalten tritt nur auf, wenn Sie den Elementen eine Breite geben, worüber Chris gewarnt hat.
Okay, ich habe eine Weile mitgelesen und dies ist mein erster Beitrag, also seien Sie nett, auch wenn dies einen Hack für IE erfordert.
Das CSS ist wirklich einfach und es ist semantisch für jeden, der einen modernen Browser benutzt.
Wenn nicht – nun, dann bekommen Sie, was Sie verdienen.
Verwenden Sie ein umschließendes Div mit column-count und dann bedingte Kommentare für IE, um es in einzelne Listen zu verwandeln, die nach links gefloatet sind.
Wie hier: http://fastexas.org/honors/district.php
oder dieser Codepen: http://codepen.io/RioBrewster/pen/CafsF
(Sie benötigen dies in der Datei ieHacks.css. CodePen scheint dies in den bedingten Kommentaren nicht zu ignorieren)
Wirklich nützlicher Tipp! Danke fürs Teilen
Ich mag die Flex-Eigenschaft jedoch nicht besonders, da sie auf Mobilgeräten eine geringe Leistung hat..
Je nach Bedarf könnte man
position: relative;und dann:nth-child()mittop: items-compiled-height-px;undleft: items-width-pxverwenden.Codepen Link
Ich denke, dies sollte semantisch eine geordnete Liste sein, oder?