Schriftenvielfalt
Schriften über die @font-face-Deklaration in Webseiten einbinden
Lange war man bei der Gestaltung von Webseiten auf die bekannten Standardschriften wie Arial, Verdana oder Georgia beschränkt – sofern man nicht auf Techniken wie sIFR oder Cufón zurückgreifen wollte. Dies ändert sich durch neue Techniken wie @font-face. Mit Hilfe der @font-face-Syntax lassen sich zahlreiche verschiedene Schriften in Webseiten einbinden.
Bereits 1998 wurde mit CSS2 eine Möglichkeit beschrieben, Schriften in Webseiten einzubinden. Microsoft (Internet Explorer 4) und Netscape unterstützten damals diese Möglichkeit, wählten aber nicht das weit verbreitete ttf-Format für die Schriften, sondern schufen eigene Formate: bei Microsoft das eot-Format und bei Netscape TrueDoc. Weil sich diese exotischen Schriftformate nur schlecht aus den ttf-Schriften generieren ließen, hat sich ihre Anwendung nie durchgesetzt.
@font-face
Neuere Browser-Versionen griffen das Thema Schriften mit CSS3 und @font-face wieder auf. Inzwischen wird von fast allen Browsern der Einsatz von webfonts unterstützt. Allerdings setzen die verschiedenen Browser auch momentan wieder auf unterschiedliche Formate. Diese werden im Folgenden kurz vorgestellt:
EOT, TTF oder OTF, WOFF und SVG
Diese Formate müssen eingebunden werden, um die gewählte Schrift auf möglichst vielen Browsern darstellen zu können.
Das eot-Format existiert seit langem und wird nur vom Internet Explorer seit der Version 4 unterstützt. Dabei handelt es sich um ein Format von Microsoft, in welches die Schriften mit Hilfe von bestimmten Tools umgewandelt werden müssen.
Schriften im ttf-und otf-Format werden von Firefox seit der Version 3.5, von Safari seit 3.1, von Chrome seit 4.0.249.78 und Opera seit der Version 10 angezeigt.
Das woff-Format (Web Open Font Format) setzt sich langsam als Standard durch. Es hat zwei Vorteile gegenüber otf– und ttf-Schriften. Zum einen sind die Dateien komprimiert und zum anderen können sie Metadaten mit Informationen zum Ursprung oder der Lizenz der Schriftart enthalten. Diese Eigenschaften machen es zum bevorzugten Format der Schriftenanbieter. Firefox unterstützt das woff-Format seit Version 3.6. Die anderen Browser werden folgen. Die Entwickler des IE9 haben die Unterstützung bereits angekündigt und auch die Safari Entwickler arbeiten an der Unterstützung.
Das svg-Format wird zur Darstellung im iPhone und iPad benötigt. Es kann aber auch von Safari seit der Version 3.1, von Chrome seit der Version 0.3 und von Opera seit der Version 9 angezeigt werden. Dabei handelt es sich nicht um ein webfont–Format im eigentlichen Sinne. svg-Schriften sind Textdateien, welche die einzelnen Zeichen als einzelne Vectorobjekte beschreiben. svg-Dateien sind nicht komprimiert und enthalten auch keine Hinting-Informationen (zusätzliche Informationen zu jedem Zeichen, z.B. Kerning/Unterschneidung). Die Schriftart ist im svg–Format also nicht für die Darstellung am Bildschirm optimiert. Opera führt jedoch ein automatisches Kerning von svg-Schriften durch, zu den anderen Browsern habe ich leider keine Angaben gefunden.
Schriften per CSS einbinden
Schriften lassen sich bei allen modernen Browsern mit Hilfe der @font-face Syntax in Webseiten einbinden. Dabei lassen sich die verschiedenen Formate für die unterschiedlichen Browser gemeinsam einbinden. Unterstützt ein Browser das angegebene Format nicht, wählt er automatisch das nächste mögliche Schriftformat. Eine Ausnahme ist hier der IE, wo das eot-Format als erstes angegeben werden muss:
@font-face {
font-family: "Schriftname";
src: url("type/filename.eot");
src: local("☺"),
url("type/filename.woff") format("woff"),
url("type/filename.otf") format("opentype"),
url("type/filename.svg#filename") format("svg");
}
@font-face {
font-family: "Schriftname kursiv";
src: url("type/filename-ital.eot");
src: local("☺"),
url("type/filename-ital.woff") format("woff"),
url("type/filename-ital.otf") format("opentype"),
url("type/filename-ital.svg#filename-ital") format("svg");
}
h2 { font-family: "Schriftname", Georgia, serif; }
h2 em { font-family: "Schriftname kursiv", Georgia, serif; }
em { font-style: italic; }
Die Idee, den lokalen Font mit einem ☺ zu bezeichnen, stammt übrigens von Paul Irish. Laut den OpenType spec funktionieren Unicode-Zeichen mit 2 Bytes (das Smily) nicht als Schriftnamen auf dem Mac – so dass es sehr unwahrscheinlich ist, dass es in Zukunft einen Font mit diesem Namen geben wird.
Im obigen Beispiel werden der normale und kursive Schnitt der Schrift über unterschiedliche Namen eingebunden. Stattdessen lassen sich aber auch beide Schnitte unter demselben Namen einbinden. Dazu erweitert man die @font-face-Deklaration um die entsprechende Eigenschaft, also font-weight oder font-style. Liegt eine Schriftfamilie in mehr als zwei Schriftstärken vor, müssen bei font-weight die numerischen Werte angegeben werden. Dazu später mehr.
@font-face {
font-family: "Schriftname";
src: url("type/filename.eot");
src: local("☺"),
url("type/filename.woff") format("woff"),
url("type/filename.otf") format("opentype"),
url("type/filename.svg#filename") format("svg");
font-style: normal;
}
@font-face {
font-family: "Schriftname";
src: url("type/filename-ital.eot");
src: local("☺"),
url("type/filename-ital.woff") format("woff"),
url("type/filename-ital.otf") format("opentype"),
url("type/filename-ital.svg#filename-ital") format("svg");
font-style: italic;
}
p {
font-family: "Schriftname", Georgia, serif;
font-style: normal;
}
em {
font-family: "Schriftname", Georgia, serif;
font-style: italic;
}
Die Renderqualität der Schriften schwankt je nach Browser und Betriebssystem stark. Tests auf den unterschiedlichen Plattformen sind daher dringend zu empfehlen.
Einen sehr ausführlichen Test der Darstellungsqualität verschiedener Schriften gibt es im Blog von David Sutoyo.
Google Font API
Die Browser verhalten sich unterschiedlich beim Laden von Schrift. So zeigt der Firefox eine Fallback-Schrift aus dem fontstack an, während die Schrift lädt. Der Safari zeigt hier erst einmal gar keinen Text an, bis alle Schriften vollständig geladen sind.
Dieses Verhalten lässt sich mit Hilfe des Google WebFont Loaders jedoch beeinflussen. Dabei kann man mit der API nicht nur Schriften von Google, sondern auch von anderen Anbietern wie Typekit sowie selbst gehostete Schriften einbinden.
Eine Ausführliche Beschreibung gibt es direkt bei Google, ein kleines Tutorial findet sich bei Paul Irish.
Probleme mit ClearType
Im Internet Explorer 7 und 8 gibt es es häufiger das Problem, dass die eingebundenen Schriften sehr ausgefranst angezeigt werden. Dies fällt besonders bei Überschriften in größeren Schriftgrößen unangenehm auf. Im Internet Explorer 6 tritt das Problem seltener auf.
Auch in anderen Browsern wie Firefox oder Safari kann es unter Windows zu Ausfransungen kommen.
Das Problem wird durch Microsofts ClearType-Funktion verursacht. Dabei versucht das System, Text für die Bildschirmdarstellung zu optimieren und führt eine Kantenglättung durch. Diese ist bei eingebundenen Schriften jedoch häufig nicht nötig und führt zum fransigen Ergebnis. ClearType ist dabei im IE7 und IE8 standardmäßig aktiviert. Im IE6 ist dies nicht der Fall. Allerdings gibt es für Windows XP bei Microsoft einen Clear Type Tuner, um die Einstellungen von ClearType zu beeinflussen und somit ClearType auch im IE6 zu aktivieren.
Hinting
Das Problem tritt jedoch keineswegs bei allen Schriften auf. Verfügt die Schrift über ein gutes Hinting, ist also für die Darstellung mit ClearType optimiert, wird sie auch unter Windows korrekt angezeigt. Ein Beispiel für eine solche Schrift ist die „PT Sans“ von Fontsquirrel. Aber auch hier sollte für den IE7 und IE8 der filter-Fix für große Schriftgrößen angewendet werden.
FIX für IE7 und IE8
Eine Lösung wäre es, ClearType für eingebundene Schriften im IE7 und IE8 zu deaktivieren. Das ist möglich, indem man einen proprietären IE–Filter verwendet, der eigentlich keinen weiteren Effekt hat:
h1, p {
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src=IE.png,sizingMethod=crop);
zoom: 1;
}
Bei obigen CSS werden die Eigenschaften filter und zoom nur vom IE interpretiert. Der Filter sorgt dafür, dass ClearType im IE7 und IE8 deaktiviert wird (ClearType funktioniert nicht auf gefilterten Elementen). Für den IE8 laden wir hier noch ein 1×1 Pixel großes transparentes PNG, da der Filter im IE8 nicht nur präsent, sondern auch aktiv sein muss. Außerdem scheint es im IE8 ein weiteres Problem zu geben: Ohne das Hintergrundbild wird die Schrift häufig nicht korrekt angezeigt.
Die zoom–Eigenschaft sorgt im IE7 dafür, dass das Element hasLayout hat. Filter können im IE7 nur auf Elemente mit Layout angewendet werden. Im IE8 gibt es das Problem mit hasLayout nicht mehr, da die Eigenschaft glücklicherweise gestrichen wurde.
Auf den Internet Explorer 6 hat dieser Filter keine Wirkung.
Erscheinen nur die Überschriften ausgefranst, sollte der Filter auch nur für diese angewendet werden.
Um ClearType zu deaktivieren, gibt es aber auch eine weitere Methode: Man kann die Schriftstärke im CSS als Zahl deklarieren, anstatt wie sonst üblich mit normal, bold oder anderem:
h1, p {
font-weight: 400;
}
Mögliche Einstellungen sind, je nach eingebundener Schriftart:
100 = -
200 = thin
300 = light
400 = regular / CSS: normal
500 = medium
600 = -
700 = bold / CSS: bold
800 = black
900 = heavy
Diese Methode führt aber nicht bei allen Schriften zum gewünschten Ergebnis.
ClearType erkennen
Als Alternative könnte man auch vorab prüfen, ob ClearType aktiviert ist und entsprechende Schriften zur Verfügung stellen oder auf eigene Schriften verzichten.
Die Methode ist nicht ganz einfach, wird aber von Zoltan “Du Lac” Hawryluk sehr gut beschrieben. Er stellt mit TypeHelper.js auch gleich ein entsprechendes Script zur Verfügung.
Die Zukunft mit DirectWrite
In Zukunft könnte sich dieses Problem lösen da Microsoft mit dem IE9 und auch Firefox mit der Version 3.7 unter Windows 7 auf DirectWrite für die Schriftdarstellung setzt.
DirectWrite lässt sich im Firefox auch per CSS deaktivieren, indem man den Text leicht rotiert:
h1, p {
-moz-transform: rotate(0.0001deg);
}
Was noch zu beachten wäre
Bei eingebundenen Schriften sollte nicht versucht werden Schnitte zu erzwingen, die nicht als realer Schnitt vorliegen. Also zum Beispiel kein font-weight: bold; anwenden, wenn kein fetter Schnitt eingebunden ist.
TrueType Schriften werden besser gerendert als OpenType Schriften.
Testen, testen und wieder testen
Letztendlich bleibt einem nichts anderes übrig, als die verwendeten Schriften und unterschiedlichen Methoden in allen Browsern zu testen. Eine sehr gute Hilfe, um Schriften schnell zu testen ist FontFriend.
Es besteht immer die Möglichkeit, dass die Schrift trotzdem nicht korrekt angezeigt wird.
Abwärtskompatibilität
Beim Einsatz von webfonts ist es wichtig sicherzustellen, dass die Seite auch in älteren Browsern noch lesbar ist. Dazu sollten entsprechende font–stacks im CSS definiert werden. Dabei ist darauf zu achten, dass die angegebenen Alternativ-Schriften von der Schriftgröße und –laufweite zu den gewählten webfonts passen:
h1 {
font-familie: "Museo", Verdana, Arial, sans-serif;
}
Schriftgrößen über die x-Höhe aufeinander abstimmen
Eine Hilfreiche CSS–Eigenschaft, die allerdings bisher nur von Firefox unterstützt wird, ist font-size-adjust. Damit lässt sich ein Formfaktor definieren, um die x-Höhe unterschiedlicher Schriftarten anzupassen. Als Wert gibt man den Aspektwert (Verhältnis zwischen der Höhe der Großbuchstaben und der x-Höhe einer Schrift) der Hauptschrift an. Fehlt diese, nimmt der Browser die nächste Schrift, skaliert sie aber so das der x-Wert der neuen Schrift gleich der Hauptschrift ist:
h1 {
font-family:Verdana, Arial, sans-serif;
font-size:12px;
font-size-adjust:0.58;
}
Laut W3C sollten, bei genau aufeinander abgestimmten Schriften umgebende span-Tags die selbe Höhe haben. Dies kann man sich zunutze machen, um Schriften aufeinander abzustimmen.
span {
border: 1px solid #f00;
}
span.adjust {
border: 1px solid #f00;
font-size-adjust: 0.5;
}
<span>a</span> <span class="adjust">a</span>
Man stellt also zwei Glyphen der unterschiedlichen Schriften nebeneinander und versieht sie mit span-Tags. Mit den span-Tags zeichnet man jeweils einen Kasten um die Glyphe und stimmt diese dann aufeinander ab.