Ich hatte eine kleine Situation, in der ich eine Überschrift mit einem `span`-Element darin hatte und sicherstellen wollte, dass vor dem `span`-Element ein Zeilenumbruch eingefügt wird. Um das klarzustellen, ist es überhaupt kein Problem, einfach ein `
`-Tag davor zu setzen (und tatsächlich ist die Möglichkeit, dies ein- oder auszublenden, sehr nützlich). Aber… es fühlt sich immer ein wenig seltsam an, HTML verwenden zu müssen, um ein Layout-Problem zu lösen.
Lasst uns also eine Reise unternehmen. Eine Reise, auf der wir viel „Aber…“ sagen.
<h1 class="one">
Break right after this
<!-- <br> could go here, but can we do it with CSS? -->
<span>
and before this
</span>
</h1>
Ein Block-Level-Element würde es tun
Anstelle eines `` könnten wir ein ` Aber wir verwenden aus Designgründen absichtlich einen ``. Der Text nach dem Umbruch sollte inline/inline-block sein, da er einen Hintergrund, einen Innenabstand und dergleichen haben wird. Das ist einfach Aber… der `` ist ein Inline-Element. Der Zeilenumbruch hat keine Wirkung! Genau wie ein *echter* Zeilenumbruch keine Wirkung hätte. Wir können diesen Zeilenumbruch zum Funktionieren bringen, indem wir Leerzeichen bedeutungsvoll machen… Das funktioniert tatsächlich. Aber… wegen des Innenabstands und Hintergrunds bleibt ein kleines Stück davon übrig, wenn die Zeile umbrochen wird. Wir könnten die unbeholfenen, an den Rand geschmiegten Kanten mit `box-decoration-break: clone;` beheben, aber… das lässt nur ein größeres Stück oben. Wenn wir den `span` inline-block machen würden, würde der Umbruch innerhalb dieses Blocks erfolgen, was wir auch nicht wollen. Das Pseudo-Element auf block-level zu setzen und den `span` alleine zu lassen, bringt den Trick auch nicht. Das war Aaron Bushnells Idee. Der Trick hierbei ist, den `span` als Block-Element zu gestalten, aber dann den Text mit einem Pseudo-Element einzufügen und ihn als Inline-Element zu stylen. Ich bin schon lange ein Fan von Pseudo-Element-Tricks, aber das fühlt sich leicht gefährlich an, da es die Barrierefreiheit beeinträchtigen könnte. Ich glaube, einige Screenreader lesen Pseudo-Elemente, aber nicht alle, und sie sind auch nicht dazu gedacht. Ganz zu schweigen davon, dass man den Text auf diese Weise nicht kopieren und einfügen kann. Zumindest ist der Text immer noch vollständig im HTML erhalten! Meine Lieblings-Idee stammt von Thierry Koblentz. Machen Sie einfach den `span` zu `display: table;` und fertig. Es handelt sich natürlich nicht um tabellarische Daten, aber das spielt keine Rolle. Die Tatsache, dass Sie Tabellen-Layout aus CSS erzwingen können, dreht sich alles um die Nutzung der einzigartigen Layout-Eigenschaften von Tabellen-Layout – nicht um Semantik. Einschließlich einer, bei der wir einfach nur ein ` Siehe den Pen Attempting a line break before and inline-block within a header von Chris Coyier (@chriscoyier) auf CodePen.
Zeilenumbrüche können über Pseudo-Elemente eingefügt werden
h1 span::before {
content: "\A";
}h1.two span::before {
content: "\A";
white-space: pre;
}



Man könnte ein wenig verrückt werden und den tatsächlichen Text mit einem Pseudo-Element einfügen
h1 span {
display: block;
}
h1 span::before {
content: attr(data-text);
background: black;
padding: 1px 8px;
}
Ausnutzen von Tabellen-Layout
h1 span {
display: table;
}
Live-Demos
` verwenden, was in Ordnung ist.
Aber
… ja … noch ein langweiliger Tag im Büro. So sind alte Websites, die einst in wenigen KB codiert waren, jetzt Gigabyte-Monster, die große Mengen an Bandbreite und Serverkapazität benötigen, um … nun ja … im Wesentlichen das Gleiche zu sagen, was sie vorher gesagt haben, aber jetzt mit vielen schönen Bildern und Farben. :D < Augen rollen >
Aber, warum nicht `div` anstelle von `span` verwenden und es mit `display: inline-block` markieren?
Ich überlasse es Ihnen, zu erklären, wie das helfen würde ;) Demo?
Ich würde mich für diese hier entscheiden
Es funktioniert nicht.
Bei inline-block, wenn die Texte außerhalb des `div` und innerhalb des `div` auf einer Zeile passen, wird nicht umgebrochen.
Ich sehe das Problem bei der Verwendung eines `
` hier nicht. Ein Zeilenumbruch ist ein Zeilenumbruch, warum so tun, als wäre er etwas anderes?
Weil es einen Unterschied geben sollte, wie ein Dokument einen Zeilenumbruch innerhalb eines Inhaltsblocks beschreibt, und wie ein Zeilenumbruch stilistisch ist. In einem Wort: Semantik, mein Lieber!
Tatsächlich hilft dies bei responsivem Text. Brüche immer. Auf diese Weise können Sie einfach Media Queries verwenden, um es dort brechen zu lassen, wo Sie wollen. Entschuldigung für mein Englisch. Kein Muttersprachler.
Wie wäre es mit Flexbox?
http://codepen.io/freekbron/pen/jrNNMZ/
oooo schön das! Es ist seltsam, darüber nachzudenken, weil man Textknoten nicht oft als Flex-Items betrachtet, aber hey, ich wette, es funktioniert nach Spezifikation.
Die Schönheit des `span` als Flex-Item ist, dass Sie weitere Eigenschaften verwenden könnten wie
…um den `span` rechts zu positionieren, nicht dass ich sagen würde, dass Sie das in diesem Fall tun würden, aber… Flexbox ist ideal ;) Der einzige Nachteil, den ich mir vorstellen kann, ist, dass, wenn Sie aus irgendeinem Grund nicht alle Geschwister zu Flex-Items machen könnten.
Morgan, mit `display:table` (oder `display:block; width: fit-content`, wie von Šime Vidas unten vorgeschlagen) können Sie es auch mit `margin-left: auto` tun.
Ich benutze Flexbox so viel, ich habe fast vergessen, dass das ein häufiges Problem war…
SelenIT, ahaaaa… intrinsische Größenbestimmung, nun ja… bisher sieht das nach der einfachsten Methode aus. Etwas gelernt!
Mein Kollege hat mich gestern gefragt, wie man einen Zeilenumbruch in eine H1-Überschrift einfügt. Das ist genau das, was mir durch den Kopf ging.
Warum nicht `white-space: nowrap;` auf dem `span`, damit er sich automatisch bricht?
Keine Notwendigkeit für Media Queries
nowrap verhindert nur, dass der Inhalt innerhalb des `span` bricht.
Wenn die gesamte H1 auf einer Zeile passt, wird sie nicht umgebrochen.
Es würde funktionieren, wenn wir ihm einen riesigen `margin-right` hinzufügen und den Overflow des Containers verbergen, der durch diesen Margin verursacht wird: http://codepen.io/SelenIT/pen/rLBxod
Sehr begrenzt, aber in einigen Situationen immer noch brauchbar. Aber immer noch mein persönlicher Favorit ist der `display:table`-Trick.
Mit einem riesigen Margin auf der rechten Seite für das -Element haben wir ein Problem, wenn der Text länger ist als die Box. Der Text wird dann überlaufen wegen `overflow: hidden;` und kann vom Benutzer nicht gelesen werden.
Die Tabellenlösung gefällt mir auch gut.
Berit, stimme völlig zu, das ist die Einschränkung dieser Methode.
Aber
`display: table` führt dazu, dass der nachfolgende Text in die nächste Zeile geht, anstatt inline mit dem `span`-Element zu sein. Es ist ein Trick, um ein Element wie ein Block zu machen, aber bis zur Breite des Inhalts zu reichen und nicht zur Breite des Containers.
Man kann das `
Eine weitere Variante
http://codepen.io/aagd/pen/PzYpMZ
Warum nicht `white-space: pre-line;`?
So: http://codepen.io/grantbunyan/pen/pbzGMQ/
Natürlich muss man sicherstellen, dass man nach dem öffnenden Tag des Elternelements keinen Zeilenumbruch einfügt, aber es fühlt sich wie eine sehr natürliche Lösung an.
Es ist argumentativ stilistisch, aber nur in der Codeformatierung, fühlt sich aber definitiv besser an, als Markup hinzuzufügen oder zu entfernen.
Alles gesagt, ich habe immer noch keine wirkliche Einwände gegen die Verwendung von `
` in diesen Situationen.
Aus Neugier, sprechen Screenreader das Vorhandensein von `
`s aus?
Vielleicht bin ich es nur, aber ich würde der `
` ein `:before` hinzufügen, wie so
Aber vielleicht verpasse ich etwas…
Danke für die Erwähnung, Chris! Ich stimme dem Aspekt der Barrierefreiheit bei der Verwendung des data-attr-Tricks auf jeden Fall zu. Ich denke, der `
`-Ansatz ist wahrscheinlich die schnellste Lösung hier, aber es ist cool, all diese Alternativen zu sehen!
h1.two span::before {
content: “\A”;
white-space: pre;
font-family: monospace;
margin: -2em;
color: transparent;
}
→ Scheint, als würde die linke Polsterung im `span` fehlen
Um die fehlende linke Polsterung zu vermeiden
h1.three span::before {
content: “\A”;
white-space: pre;
font-family: monospace;
margin: -2em;
color: transparent;
-webkit-box-decoration-break: clone;
box-decoration-break: clone;
}
Schöne Beispiele. Aber ich würde gerne mehr Methoden zur Steuerung von Zeilenumbrüchen im responsiven Design sehen. Jeder im Desktop-Publishing oder Printdesign weiß, wie wichtig ein Zeilenumbruch ist: Er kann mehrzeilige Texte visuell ausbalancieren, die Lesbarkeit verbessern und sogar das Verständnis beeinflussen. Aber mit responsivem Design: Sie müssen nun die Bildschirmbreite berücksichtigen und wie dieser Zeilenumbruch über alle Gerätegrößen hinweg funktionieren kann.
Dies ist ein Auszug aus einem größeren Projekt: http://codepen.io/team/adpearance/pen/QEwEwQ/
Die daraus resultierenden Klassen geben mir etwas Kontrolle darüber, wann Umbrüche angezeigt werden sollen oder wann die Zeile einfach natürlich fließen soll. Es ist nicht ideal; ich möchte immer noch mehr Kontrolle über die Gruppierung wichtiger Wörter, aber naja… es ist ein Anfang.
Ich würde sagen, viele Leute schlagen ihre Varianten vor, die nur das benötigte Bild replizieren, nicht das benötigte Verhalten.
Ein einfacher Test, indem man `text-align: center` auf eine `h1` anwendet, ist notwendig, um falsche Zeilenbrecher zu beschneiden. Denn in Wirklichkeit sollte der Inline-Block-Span auch zentriert sein und nicht links anhaften.
Hier habe ich es zu den Nummern 7 und Thierry's Nummer 8 hinzugefügt, was fehlgeschlagen ist.
http://codepen.io/anon/pen/LZVQNd