Dies ist eines dieser kniffligen CSS-Dinge, die mir alle paar Monate wieder begegnen. Ich schätze, wo könnte man es besser ansprechen als bei CSS-Tricks, oder?
Die Situation betrifft linksbündig umbrochenen Zeichensatz. Wie wenn ein Absatz Text in die nächste Zeile umbrochen wird, sobald das nächste Wort nicht mehr passt (d.h. die meisten Texte im Internet). Sie möchten einen Hintergrund hinter diesem Text hinzufügen, der
- Dem unregelmäßigen rechten Rand folgt
- Auf beiden Seiten, links und rechts, jeder Zeile gepolstert ist
Was Sie nicht tun können, ist einfach einen Hintergrund und Polsterung auf z.B. das <p> Element anzuwenden. Absätze sind Block-Level-Elemente, daher ist der Hintergrund einfach ein Rechteck und folgt nicht der linksbündigen Kante.
Sie können auch nicht einfach den Hintergrund und die Polsterung auf ein <span> oder ein Inline-Element anwenden. Die linke und rechte Polsterung gelten nur für die allererste und allerletzte Zeile. Auf jeder der mittleren Zeilen schließt der Hintergrund direkt an den Text an.
Das zu beschreiben ist ein wenig vergeblich. Hier ist das Problem visuell

Was wir wollen, ist, dass jede Zeile wie der Anfang der ersten Zeile und das Ende der letzten Zeile gepolstert ist. Wir wollen nichts Ekelerregendes wie das Umwickeln jeder Zeile in ihren eigenen Span (wo Zeilen umbrechen ist zu unvorhersehbar). Und es gibt leider kein :nth-line leider.
Es gibt jedoch einige Lösungen!
Harry Roberts Pseudo-Element / white-space Methode
Der große Trick hier ist die Verwendung von white-space: pre-wrap; Das gibt uns die Polsterung bei den linksbündigen Zeilen. Um die Polsterung links zu erhalten, wird ein Pseudo-Element am linken Rand hinzugefügt. Hier ist das Original und dann mein Fork, um die Elemente in Aktion zu zeigen
Siehe den Pen BtpGo von Chris Coyier (@chriscoyier) auf CodePen
Leider mag Firefox die Art und Weise nicht, wie das Pseudo-Element in dieser Technik positioniert ist. Wahrscheinlich behebbar, aber vielleicht gibt es einen besseren Weg...
Fabien Doirons Box-Shadow-Methode
Es stellt sich heraus, dass Sie eine Box-Shadow mit Null-Streckung auf einem Inline-Element nur auf der x-Achse verwenden können, um jede Zeile zu polstern. Im Wesentlichen
.padded-multi-line {
display: inline;
background: orange;
box-shadow: 10px 0 0 orange, -10px 0 0 orange;
}
Hier ist das Original und dann mein Fork, um zu zeigen, wie es funktioniert
Siehe den Pen Wrapping Highlighted Text von Chris Coyier (@chriscoyier) auf CodePen
Hinweis: Ich musste diesen Code aktualisieren, als Firefox 32 veröffentlicht wurde. Firefox benötigt box-decoration-break: clone; da der Standardwert box-decoration-break: split; ist.
Dave Ruperts JavaScript / Unicode-Methode
Warnung: Dave sagt, benutzen Sie das nicht. Ich nehme es auf, weil ich es clever finde und es sich auf eine seltsame Weise für mich sogar weniger hacky anfühlt. Die Idee ist, den Text jedes Elements zu durchlaufen und die Leerzeichen durch das Unicode-Zeichen \u205f zu ersetzen, das MEDIUM MATHEMATICAL SPACE Zeichen. Das funktioniert aus irgendeinem Grund besser mit der Polsterung am rechten Rand. Für den linken Rand verwenden Sie einfach einen border-left am Block-Level-Elternelement.
Hier ist das Original und mein abgespeckter Fork
Siehe den Pen Wrapping Highlighted Text von Chris Coyier (@chriscoyier) auf CodePen
Es ist etwas knifflig, die Zeilenhöhe genau richtig einzustellen, damit der Rand mit der Polsterung übereinstimmt, aber ich bin sicher, Sie können das herausfinden. Es gibt wahrscheinlich sogar einige schicke Berechnungen, um sicherzustellen, dass es richtig ist.
Wenn JavaScript für Sie funktioniert, gibt es auch ein jQuery-Plugin wraplines, mit dem Sie dann die Polsterung auf jede einzelne Zeile anwenden können. Demo.
Matthew Pennells Dreielement-Methode
Es stellt sich heraus, dass Sie dies mit fast keiner ausgefallenen CSS oder JS tun können, sondern durch die Verwendung von drei Elementen. Sie benötigen ein Block-Level-Elternelement für einen linken Rand. Dann ein Inline-Element, um die Polsterung und den Hintergrund darauf anzuwenden. Dann ein weiteres Inline-Element, um den Text nach links zu schieben, um die Polsterung an den rechten Rändern zu erhalten.
<div class="padded-multiline">
<h1>
<strong>
How do I add padding to subsequent lines of an inline text element?
</strong>
</h1>
</div>
.padded-multiline {
line-height: 1.3;
padding: 2px 0;
border-left: 20px solid #c0c;
width: 400px;
margin: 20px auto;
}
.padded-multiline h1 {
background-color: #c0c;
padding: 4px 0;
color: #fff;
display: inline;
margin: 0;
}
.padded-multiline h1 strong {
position: relative;
left: -10px;
}
Das Original befindet sich in diesem Thread und meine Demo
Siehe den Pen pvBFg von Chris Coyier (@chriscoyier) auf CodePen
Wenn Sie dies in Firefox betrachten, kann es zu einigen Zeilenhöhe-Problemen kommen. Ich habe im Grunde keine Ahnung, warum das so ist, es ist ziemlich frustrierend, besonders in solchen Situationen.
Adam Campbells box-decoration-break Methode
Während einer Diskussion, die sich um dieses Thema drehte, wies Adam darauf hin, dass es eine neue CSS-Eigenschaft gibt, die (soweit ich weiß) speziell dafür gedacht ist. Dies macht die Notwendigkeit von drei Elementen überflüssig. Technisch gesehen brauchen Sie nur eines, das Inline-Element, aber wahrscheinlich werden Sie dies bei einer Überschrift tun, so dass Sie am Ende wahrscheinlich trotzdem ein Block-Elternelement haben werden, was für die Abstände am besten ist.
Hier ist das Original und meine abgespeckte Demo
Siehe den Pen hIvFe von Chris Coyier (@chriscoyier) auf CodePen
Dies funktioniert in Chrome und Safari, aber nicht in Firefox funktioniert jetzt in Firefox 32+, in meinen schnellen Tests. Chrome und Safari benötigen dafür -webkit-box-decoration-break.
Vorherige Kunst
Die Personen, denen ich in diesem Artikel Credits gebe, waren die Personen, von denen ich die Technik zuerst gesehen habe. Aber sie repräsentieren nicht unbedingt die absolut erste Person, die jemals darauf gekommen ist™. In den Kommentaren unten kamen ein paar ältere Blogbeiträge auf, die sich mit demselben Problem befassten. Einer von Sergey Chikuyonok (Russisch) und einer von HTeuMeuLeu (Französisch).
Ich suche nach einer Möglichkeit, dies bei zentriertem Text zu tun. Es sieht so aus, als ob Fabien Doirons Methode oder box-decoration-break die einzigen beiden Techniken sind, die mit dem funktionieren.
Sie können letter-spacing und text-shadow zusammen verwenden, um einen Effekt der Polsterung um die Zeilen zu erzielen. Allerdings bin ich damit verrückt geworden und habe herausgefunden, dass man auch text-indent und negative margin bei Inline-Elementen verwenden kann und interessante Ergebnisse erzielt: http://codepen.io/Merri/pen/tDHsC
Auch ein zusätzliches Inline-Element ermöglicht eine bessere Kontrolle über box-shadow, damit die Schattenfarbe nicht über den Text gelegt wird: http://codepen.io/Merri/pen/giuLj
Sehr schöner Effekt. Und einfach.
Man kann das einigermaßen mit einer Umrandung und einem einzigen Span tun
http://codepen.io/impressivewebs/pen/nuFHq
Es ist jedoch schwer, es gut aussehen zu lassen. Leider kann man für Umrandungen keine einzelnen Seiten festlegen. Aber vielleicht kann jemand die Werte anpassen, damit es schöner aussieht.
Und was seltsam ist, wenn man die Zeilenhöhe des Spans anpasst, erhält man diese seltsame Raumschiff-Armaturenbrett-artige Sache!
http://codepen.io/impressivewebs/pen/adrEg
Das ist ein guter Ansatz, Louis, danke.
+1 für die seltsame Raumschiff-Armaturenbrett-artige Sache!
Ja, ich hatte auch schon früher Schwierigkeiten, Lösungen dafür zu finden.
Leider ist die einzige der oben genannten Methoden, die funktioniert, wenn die Zeilenhöhe erhöht wird – sodass Sie tatsächlich mehrere „Zeilen“ mit Hintergrund und leerem Raum zwischen den Zeilen haben – die Box-Shadow-Methode. Und das funktioniert nur für Farben, aber nicht, wenn Sie ein Hintergrundbild über den gesamten Zeilenhintergrund haben möchten.
Ich kann nicht glauben, dass sie in CSS noch nichts erfunden haben, das es Ihnen erlauben würde, anzugeben, dass Sie die linke und rechte Polsterung für ein Inline-Element, das sich über mehrere Zeilen erstreckt, am Anfang und Ende jeder Zeile anwenden möchten :-/
Ich habe mich mit Ansätzen wie dem Aufteilen von Text in Elemente mit einzelnen „Wörtern“ mit JS beschäftigt und ihnen Seitenränder hinzugefügt und versucht, durch Wortabstand oder negative Ränder sie wieder nah genug zusammenzuziehen, damit der Abstand zwischen Wörtern in einer Zeile wie der eines einzelnen „Leerzeichens“ aussieht ... aber diese Ansätze hatten alle verschiedene plattformübergreifende Probleme.
Das Problem wurde letztes Jahr auf @HteuMeuLeus Blog (französisch) behandelt
Viele Lösungen in den Kommentaren (hauptsächlich im französischen Artikel)
[en]
http://www.hteumeuleu.fr/a-css-brain-teaser/
[fr]
http://www.hteumeuleu.fr/un-joli-casse-tete-en-integration/
Meins war dieses hier: http://jsfiddle.net/oilvier/qktGR/
Aber das beste war wahrscheinlich dieses hier: http://dabblet.com/gist/2994237
Ich finde es auch sehr schwierig, hier
border-radiuszu aktivieren.Meine erste Reaktion war: „Wer fragt Sie alle paar Monate: ‚Können Sie bitte meinen gesamten Text schrecklich hässlich aussehen lassen?'“.
Aber am Ende des Artikels hat es mir gefallen. Es hat irgendwie ein Gefühl von „aus der Zeitung ausgeschnitten“.
@Louis erwähnte Umrandungen. Diese haben eine breite Browserunterstützung. Leider haben einige Browser (Firefox) auch Rundungsfehler, die ein Pixel Lücken zwischen der Umrandung und der Textbox verursachen können. Die gute Nachricht ist, dass dies mit 1px box-shadow nach links und rechts behoben werden kann.
http://codepen.io/Merri/pen/porgF
Scheint die cross-browser-sicherste Lösung zu sein, sieht auf allem gut aus, was ich testen kann, beginnend bei IE8.
Und durch Hinzufügen eines weiteren Elements können Sie einen schönen Schatten erhalten: http://codepen.io/Merri/pen/Agrus
Sie können die Box-Shadow vermeiden und einfach outline-offset: -1px; verwenden, um die Lücke zu schließen.
Das gleiche Problem wurde bereits 2010 auf Sergey Chikuyonoks (Emmet-Autor) Blog diskutiert: „Gleichmäßiger Hintergrund unter dem Text“ (auf Russisch). Dort werden zwei Lösungen vorgeschlagen: eine nutzt die Eigenschaft „outline“ und eine andere verwendet verschachtelte Elemente mit relativer Positionierung.
Ich habe das kürzlich auf ein paar Websites gemacht.
Einleitungstext: http://www.jwrihoy.com/
Und die Zitate: http://sueco.gg/
Beide benötigten auch Linien zwischen den Leerzeichen, es dauerte eine Weile, bis es so war, wie ich es wollte, aber ich bin mit dem Ergebnis zufrieden. Die Zitate schummeln ein wenig und verwenden ein Bild, aber das erste ist reines CSS.
Schöner Beitrag!! Das musste ich schon mal machen.
Ich hatte eine h1, bei der jedes Wort darin in einem Span-Element eingeschlossen war. Diese Span-Elemente waren schwebend und hatten eine linke/rechte Polsterung, um den Leerraum zwischen den Wörtern zu erzeugen. Jetzt sehe ich, dass es viele Lösungen gibt, aber hey! Es funktioniert. Hier ist mein Beispiel: http://rehabitare.com/
Das hat für mich am besten funktioniert
span {
color: white;
background-color: #343132;
** box-shadow: 0.5em 0 0 #343132,-0.5em 0 0 #343132;**
}
http://stackoverflow.com/questions/12709313/css-background-color-on-multi-line-text
Das habe ich schon länger gebraucht! Tolle Arbeit.
Zuerst scheint die Box-Shadow-Methode am besten zu funktionieren, aber wenn man sie auf einem hochauflösenden Gerät betrachtet, gibt es immer kleine Überlappungen oder Lücken – ich kann sie nicht als vollständige Lösung empfehlen.
Es sieht so aus, als gäbe es einen Bug in iOS WebKit mit Box-Shadow, der den Schatten komplett abschneidet, wenn man genug zoomt. Das ist auf meinem iPad in meinem Pen leicht zu sehen: http://codepen.io/Merri/full/giuLj
Das Problem tritt auf dem Desktop nicht auf und der Versuch, es mit erzwungener GPU-Zeichnung zu beheben (
-webkit-transform: translate3d(0, 0, 0);), hat nichts bewirkt.Fabien's Box-Shadow-Methode rockt! 2 Sekunden Hack, und es funktioniert für mich! Es braucht ein wenig Neukonfiguration mit den Abständen, aber ich liebe es:) Rettender Hack:)
Hallo,
Kann mir jemand sagen, wie man Text in HTML eine Hintergrundfarbe geben kann, ohne CSS zu verwenden (kein Inline und keine externe CSS)?
Leon Wilmanns schreibt nach Schlussschluss.
https://jsfiddle.net/uuot1bwa/1/