Ich bin gerade auf eine Situation gestoßen, in der ich einen Titel hatte, der in zwei Abschnitte unterteilt war. Der Haupttitel, groß und fett, linksbündig wie jeder normale Titel. Aber dann eine Art Untertitel, rechtsbündig, auf derselben Zeile wie der Titel. Wenn dafür Platz ist, ist das großartig. Aber natürlich ändert sich Text ständig und der verfügbare Platz ist variabel. Schauen wir uns das mal an.
So soll es aussehen, wenn Platz vorhanden ist

Wenn nicht genügend Platz vorhanden ist, je nach Bildschirmgröße oder Länge, ist linksbündiges Umbrechen das, was wir wollen

Es gibt eine Reihe von Möglichkeiten, diesen rechtsbündigen Text dort zu platzieren, wenn Platz vorhanden ist.
- Wir könnten ihn absolut positionieren rechts. Das Hauptproblem dabei ist jedoch, dass absolut positionierte Elemente aus dem Dokumentfluss genommen werden, sodass sie nicht intelligent entscheiden können, wann sie mit anderem Text umbrechen sollen. Wir müssten einige feste Breiten festlegen, was wir in diesem Fall nicht wollen.
- Wir könnten ihn rechts float. Wir müssen keine Breiten festlegen und der Text bleibt im Dokumentfluss, was großartig ist. Aber sobald ein Umbruch erforderlich ist, bleibt der Text rechts "angeheftet" und ist nicht schön linksbündig, wie wir es wollen.
- Wir könnten das Ganze als Tabelle gestalten, was es uns ermöglicht, den Text problemlos am rechten Rand zu platzieren. Aber Tabellenzellen brechen überhaupt nicht um, daher können wir das gewünschte Layout nicht erreichen.
Glücklicherweise kann uns Flexbox hier helfen! Indem wir den Titel zu einem Flex-Container mit display: flex; und den Titel selbst mit flex-grow: 1; machen, kann er den Untertitel ganz nach rechts schieben. Flex-Container können umbrechen, daher stellen wir sicher, dass dies mit flex-wrap: wrap; geschieht.
Hier ist ein Video, das all die nicht so guten Methoden zeigt und wie Flexbox gewinnt
Und eine Live-Demo
Siehe den Stift Wrapping Same-Line Titles von Chris Coyier (@chriscoyier) auf CodePen.
Tolle Lösung.
Ich frage mich, was die Aufgabe von "align-items: flex-end" ist?
align-items: flex-endrichtet alle untergeordneten Elemente vertikal am unteren Rand des Containers aus.(oder allgemeiner gesagt, am Ende der Querachse, denn wenn
flex-direction"column" wäre, würde es alles nach rechts verschieben)Nützliche Flex-Grid-Systemtechnik: Ausrichtung verschiebendes Umbrechen :)
http://codepen.io/dnomak/pen/warrKM?editors=110
Die Flex-Lösung ist die einzige, die auf kleineren Viewports auf schöne Weise abfällt (kein überlappender/überlaufender Text usw.). Gut gemacht!
Ich habe eine Lösung für so etwas mit
text-align: justifyund :after-Elementen gefunden. Sie hat genau die gleichen abfallenden Eigenschaften wie die Flex-Lösung :)Sollte in IE8+ funktionieren
http://jsfiddle.net/rasmusfl0e/ao989zs7/
(... mit einer kleinen Einschränkung: nicht zusammengebrochener Leerraum nach dem letzten Text wird als einzelnes Leerzeichen interpretiert...)
Das ist das übliche Problem von Inline-Elementen. Du löst es, indem du entweder
1) Alle Symbole zwischen den Elementen im Markup entfernst (HTML-Kommentarblöcke sind erlaubt)
oder
2) Die Schriftgröße des Elternteils auf 0 setzt und die Schriftgröße der Kinder auf etwas anderes als Null.
Ja – es war nur ein Hinweis, falls jemand versucht, diese Technik zu verwenden, und wegen des zusätzlichen Leerraums stolpert.
Es ist behebbar – wie du bemerkst :)
Es gibt Baseline-Ausrichtungsprobleme in den Float- und Flexbox-Beispielen.
Damit meine ich, dass Titel-Hauptteil und Titel-Notiz nicht auf der gleichen Baseline liegen.
Ja, aber alles, was du brauchst, ist
align-items: baseline;Das funktioniert gut, bis die Elemente auf die nächste Zeile springen, woraufhin sie sich näher an den Rand schieben. Trotzdem ist es eine akzeptable Lösung.
Media-Queries... eure Tage sind gezählt.* :D
*Wenn es nicht für IE wäre, wärt ihr wahrscheinlich schon tot.
Ich glaube nicht, dass Media-Queries verschwinden werden, nur weil es Flexbox gibt. Es gibt viele andere Anwendungsfälle dafür. Z. B. das Ändern der Schriftgröße.
Außerdem möchte man vielleicht andere Layout-Arrangements mit Flexbox vornehmen, wie bereits in der ultimativen Flexbox-Cheatsheet demonstriert wurde -> http://codepen.io/HugoGiraudel/pen/pkwqH
Warum nicht text-align justify auf dem Eltern-Container verwenden, inline-block auf den beiden Kindern und ein zusätzliches after Pseudo-Element des Containers, um justify zu ermöglichen und beide Kinder links und rechts zu positionieren?
Das sollte in IE8+ funktionieren.
Ich mochte dein Denken so sehr, dass ich in die Vergangenheit gereist bin und das vorgeschlagen + eine Demo erstellt habe in einem Kommentar weiter oben ;D
Das sieht großartig aus und scheint auch gut für die Navigation zu funktionieren? Ein Muster, das ich oft verwende, ist, die Nav links zu floaten und die Nav-UL rechts zu floaten, was die gleichen Probleme wie in Beispiel Nr. 2 in deinem Pen hat.
Ich suche seit 8 Jahren nach diesem Umbruch und es ist sehr einfach, vielen Dank!
Bis jetzt habe ich den Ansatz der absoluten Positionierung verwendet! Nun, ich hätte ihn verwendet, wenn es nicht die IE8-Einschränkung gäbe, mit der ich gearbeitet habe.
Und er wird in allen gängigen Browsern unterstützt. Puh!
http://caniuse.com/#feat=flexbox
Danke für deinen Artikel!
Du kannst auch einfach Folgendes tun
Dies vermeidet die Notwendigkeit, die
flex-growEigenschaft auf den Haupttitel zu setzen. Wahrscheinlich kein Unterschied, aber nur eine Alternative!Es gibt einen kleinen Unterschied: in Chris' Version gibt es keinen Abstand zwischen den Elementen, wenn sie auf einer Zeile sind; in deiner gibt es Abstand. Du kannst den Unterschied sehen, wenn du den Elementen einen Hintergrund gibst: http://codepen.io/karaken12/pen/KpyQwM
Keine der beiden ist besser als die andere, denke ich; es hängt nur davon ab, welche für deine Bedürfnisse am besten geeignet ist.