Selten genug macht sich einmal jemand die Mühe, <strong>
und <em>
umzugestalten. Wenn, dann ist meist Sperrsatz die erste Wahl, also das Erhöhen des Zeichenabstands mittels CSS. Warum es aber nicht damit getan ist, einfach em { letter-spacing:0.5em; }
in den Stylesheet zu kloppen, behandelt dieser Artikel.
Geschichte und Regelwerk
Sperrsatz wurde einst erfunden, weil gebrochene Schriften (landläufig Frakturschrift
) keine fetten oder kursiven Varianten hatten und man bestimmte Satzteile ja irgendwie hervorhaben musste. Und so klemmten die Setzer einfach kleine kleine Bleiplatten zwischen die Buchstaben.
Die Anwendung von Zeichenabstand unterliegt einem komplizierten Regelwerk und nicht alles davon kann man im Rahmen eines vertretbaren Aufwandes auch mit CSS umsetzen. So sollen etwa Zahlen nicht gesperrt werden, Satzzeichen schon, sofern sie nicht Punkt oder Anführungszeichen sind – wollte man das alles befolgen, stünde man in Windeseile vor einer unsemantischen HTML-Suppe.
Das Regelwerk schreibt auch vor, dass der gesperrte Satzteil Abstand zum normalen Text haben muss. Es sieht ohne diesen Abstand auch wirklich reichlich unschön aus:
Es gibt mehrere Möglichkeiten, hier mit CSS anzusetzen. Allerdings haben alle auch ihre Nachteile.
Möglichkeit 1: Leerzeichen mitsperren
Normalerweise erzeugt man den nötigen Abstand, indem man einfach die Leerzeichen vor und hinter dem fraglichen Text mitsperrt. Das hieße in HTML ausgedrückt, dass man zusätzliche Leerzeichen mit in die <strong>
und <em>
einschließt. Aus <em>Wort</em>
wird einfach <em> Wort </em>
. Das sieht zwar gut aus…
… wird aber dann zum Problem, wenn man eines Tages beschließen sollte, die fraglichen Elemente nicht mehr nur mit letter-spacing
zu gestalten. Wollte man dann zum Beispiel <strong>
und <em>
mit einer Unterstreichung versehen, sind auch die Leerzeichen vor und hinter dem hervorzuhebenden Wort betroffen. Anders herum sind in einem bereits bestehenden Text vermutlich nicht die Leerzeichen in die Hervorhebungs-Elemente eingeschlossen.
Diese Methode mag schulbuchmäßig sein, aber für das Web ist sie nicht wirklich praktikabel.
Möglichkeit 2: Margin/Padding
Naheliegend mag die Idee sein, die gesperrten Satzteile einfach mit ein wenig Außen- oder Innenabstand zu versehen. Optisch macht das auch einiges her…
…jedenfalls so lange, bis ein gesperrter Satzteil der erste nach einem Zeilenumbruch ist. Dann nämlich, wie rechts zu sehen, wird der Abstand mit die neue Zeile genommen und setzt den hervorgehobenen Satz unschön vom Rand statt vom Resttext ab. Das gleiche passiert leider, wenn man versucht mit der CSS-Eigenschaft content
Leerzeichen vor und hinter dem gesperrten Text zu platzieren. Bei mitgesperrten Leezeichen gemäß Methode 1 besteht dieses Problem nicht, aber da gibt es ja wiederum anderen Ärger. Und dann gibt es noch eine etwas unorthodoxe Lösung…
Möglichkeit 3: Spacer-GIFs
Spacer-GIFs sind eigentlich Relikte auf der finsteren Webdesign-Steinzeit. Als es noch kein CSS gab, platzierte man einfach transparente Bilder zwischen Elementen um Abstände zu erzeugen. Klingt aus heutiger Sicht grausig primitiv (ist es auch), aber um unser Problem zu lösen ist es eine ernstzunehmende Methode. Sehen wir uns erst einmal das Endergebnis an:
Schaut doch gut aus! Diese Methode verwendet zwar Spacer, aber sie basiert trotzdem auf CSS und verhunzt im Gegensatz zu Methode 1 nicht das HTML und hat keine Probleme mit Zeilenumbrüchen. Im Einzelnen geht das Ganze so: Wir basteln ein transparentes GIF, das die Breite unseres gewünschten Abstandes hat. Dieses platzieren wir mittels CSS vor und hinter den gesperrten Textteilen.
em:before, em:after { content:url(spacer.gif); }
So eingefügte Bilder werden nämlich umgebrochen, im Gegensatz zu den in Möglichkeit 2 erwähnten auf die gleiche Weise eingefügten Leerzeichen. Das HTML bleibt also unberührt, wir haben unseren Abstand und schöne Zeilenumbrüche sind auch dabei! Alles perfekt? Nun ja, nicht ganz.
Die Spacer haben eine feste Breite, die sich nicht dynamisch ändern lässt. Das heißt, dass bei einer Vergrößerung oder Verkleinerung des Textes der Abstand nicht mitwächst. Da tut es gut zu wissen, dass so gut wie niemand diese Funktion nutzt und man diesbezüglich kein zu schlechtes Gewissen haben muss.
Zweitens beherrscht der gute alte Internet Explorer 6 weder das Einfügen von Inhalten mittels content
, noch weiß er etwas mit den Selektoren :before
und :after
anzufangen. Das müsste man dann entweder scripten oder oder man weist dem IE mit einem eigenen Stylesheet die Abstände wie in Methode 2 zu. Beides keine optimalen Lösungen.
Fazit?
Wie zu sehen war haben alle vorgestellten Vorgehensweisen ihre Mängel. Die einzig wirklich schlimme Methode ist meines Erachtens Nummer 1, weil dort im HTML herumgefuhrwerkt wird – zwar nur ein wenig, aber dafür mit (möglicherweise) großem Effekt, wenn erst einmal das Redesign kommt. Methode 2 ist unter Umständen sehr hässlich, dafür aber was HTML und CSS angeht sauber und funktioniert auch überall. Und Methode 3 ist eine Mischung aus archaischen Spacern, modernem CSS und Methode 2 als Fallback für den IE6.
Es scheint dann wohl auf die berühmte Wahl zwischen Pest und Cholera hinauszulaufen. Ich persönlich würde vermutlich Methode 3 wählen. Alle Methoden im Vergleich gibt es auf einer Testseite.
Nachtrag vom 13.12.2007
Unbedingt lesen: Nachtrag zu Sperrsatz mit CSS – vergesst die Spacer! Die Spacer-Methode ist nämlich tatsächlich nicht die beste!
Kommentare (16)
alican ¶
9. Dezember 2007, 15:18 Uhr
Ähm, was ist wenn man dem Spacer eine Breite in em gibt? Dann funtzt das auch mit der Vergrößerung.
Wie wäre es damit?
... einem Debattierklub von Anonymen ...
Peter ¶
9. Dezember 2007, 15:22 Uhr
Zitat alican:
Das sagt die Logik, aber meine Browsertests sind da leider etwas anderer Ansicht. Was da mit
content
eingefügt wird, gehorcht nicht der Logik normaler Bilder.alican ¶
9. Dezember 2007, 15:26 Uhr
Boha, diese Kommentarfunktion muss mal überarbeitet werden. Scheiß Wordpress ... man könnte Textile einbauen.
Also, ich meine das:
http://img4.imagebanana.com/img/wy7cyi68/fuckwp.png
Und den 2. Kommentar kann man löschen.
Peter ¶
9. Dezember 2007, 15:30 Uhr
Diese Verkoppelung von
<strong>
und<em>
macht auf mich rein semantisch keinen zu sinnvollen Eindruck. Das würde ja wieder heißen, HTML so einzusetzen, dass es allein dem Ziele der optischen Gestaltung zu Gute kommt. Und das sollten wir doch wenn es geht vermeiden.mike ¶
9. Dezember 2007, 15:44 Uhr
Danke für die schöne Betrachtung des Problems, ich habe aber doch Einsprüche:
- Die Spacer-geschichte ist (abgesehen vom IE) designtechnisch auch nicht 100% sicher, schliesslich kann es - in ganz seltenen Fällen - auch passieren, dass der Spacer selbst in die nächste Zeile rutscht. (ich konnte das Verhalten gerade nicht provozieren, aber gefühlsmässig ist's theoretisch möglich)
- bei Text-size-einstellungen ist mir egal, was irgendeine Statistik sagt, Text wird skaliert und Punkt. Wenn 0,2% von 1 Millionen Besuchern im Browser skaliert, dann sind das zwar immer noch 0,2% aber eine ganze Menge Leute.
Hier kommt's dann auch wieder auf die Zielgruppe an, wenn die 0,2% zufällig meine Zielgruppe sind, dann sind das 100% Kunden ;)
Letztendlich muss man aber auch sagen, dass man mit margin/padding gut aufgehoben ist, eine Einrückung am Anfang der Zeile ist im Spezialfall eigentlich kein Beinbruch.
Peter ¶
9. Dezember 2007, 15:47 Uhr
Zitat mike:
Machst du immer noch deine Seiten auch immer noch für den IE 5 tauglich? Da bewegen wir uns doch bei sehr ähnlichen Anteilen.
mike ¶
9. Dezember 2007, 15:54 Uhr
Dass die Gegenfrage mit dem IE5 kommt, habe ich befürchtet, die kann ich nämlich nicht konsistent zu meiner Sklalierungsmeinung beantworten.
Nein, bzw. Jein, der IE5 bekommt von mir keine allzugrosse Sonderbehandlung.
Peter ¶
9. Dezember 2007, 15:58 Uhr
Schaust und das führt vermutlich zu sehr viel größeren Darstellungsproblemen als der nicht mitwachsende Abstand. Wenn man den Spacer großzügig proportioniert, fällt das erst auf, wenn man den Text richtig richtig groß macht.
Und warum erlaubt mein WP hier
<strike>
statt<del>
? Das soll das nicht!mike ¶
9. Dezember 2007, 16:50 Uhr
Mal schnell zurechtgestümpert: http://trash-wissen.de/2007-12-09/wordpress-xhtml-strict-und-delstrike/
Peter ¶
9. Dezember 2007, 16:57 Uhr
Ah, also quasi ein Fehler im System. Danke, ich werde das demnächst mal in ein Plugin verpacken.
serious ¶
9. Dezember 2007, 18:15 Uhr
das mit den margins funktioniert z.b. im Opera 9.5 wunderbar ohne unschöne nebeneffekte.
... außerdem wärs gut, wenn die testseite keine fixe, sondern eine dynamische breite hätte, sonst is es umständlich die testcases zu reproduzieren.
Peter ¶
9. Dezember 2007, 19:30 Uhr
Ich bin mir gerade nicht sicher, inwiefern das helfen würde. Aber auf jeden Fall kann man die Testseite herunterladen und bearbeiten oder eben mit Webtools wie Firebug beackern.
alican ¶
9. Dezember 2007, 23:05 Uhr
Man könnte dann das Browser-Fenster vergrößern/verkleinern so dass dann der Spersatz an Zeilenanfang oder -mitte landet. Das Testen in anderen Browser, vorallem mit den minderwertigen wie IE und Opera, die kein Firebug haben, würde dann leichter werden.
Ich verzichte in diesem Fall lieber auf einen Semantik und mach das so wie ich das vorgeschlagen habe. Habs noch nicht getestet aber so habe ich jedenfalls kein GIF drin, was nicht da reingehört, und so sieht es dann auch in allen Browsern gleich aus. Und das will ja der Webdesigner.
Peter ¶
10. Dezember 2007, 16:31 Uhr
Also, wenn dir HTML-Kollateralschäden egal sind, würde ich doch eher Methode 1 empfehlen. Da bekommst du auch mit unsauberem Code Abstand hin, sparst aber ein Element.
Gerald - hyperkontext ¶
12. Dezember 2007, 00:02 Uhr
Danke, guter Artikel zu dem Thema.
Zu Möglichkeit 3 (spacer.gif):
Das kannste ohne spacer.gif, viel flexibler haben:
em:before {content: '' (sind zwei einzelne '); margin-left: [irgendeinwert];}
Damit lässt sich der margin-Wert flexibel bestimmen. Zeilenumbruch erfolgt auch, nur an der kurzen Stelle des :before rückt der margin-Wert vor das Wort nach.
Das funzt in FF, O, im Safari wird das Wort sofort samt margin in die nächste Zeile gebrochen.
Im IE is natürlich überhaupt nix damit.
Jetzt aber noch eine Sache, die hierbei nicht zur Sprache kam:
Bei
letter-spacing
wird der gegebene Wert auch dem letzten Buchstaben mitgegeben. (Wie ich dem letzten Buchstaben den Wert wieder austreiben kann, bin ich noch nicht draufgekommen.)Das heißt, um hier eine optische Gleichstellung herbeizuführen, muss ich den selben Wert des
letter-spacing
mit vorher genannter Methode, oder direkt inem
mitpadding-left
, vor den ersten Buchstaben stellen.Also zum Beispiel:
em { letter-spacing:0.5em; padding-left:0.5em;}
hier ist beim Zeilenumbruch der erste Buchstabe immer eingerückt.
oder
em:before {margin-left:0.5em; content:'';}
em { letter-spacing:0.5em;}
So sehe ich das zumindest.
(Hoffe, mein eingefügter HTML-Code wird so akzeptiert.)
Peter ¶
12. Dezember 2007, 04:37 Uhr
Also, wenn das mit dem Margin für leeren Content stimmt, ist die Spacer-Methode natürlich völlig überholt und ich hatte beim Schreiben dieses Artikels ein Brett vor dem Kopf. Morgen nehme ich das mal unter die Lupe – heute bin ich den ganzen Tag auf Achse.
Zitat Gerald - hyperkontext:
Ich bin mir nicht sicher, aber würde nicht etwas negativer Margin rechts den Job erledigen?