Aktualisiert im April 2014 mit moderneren Informationen.
WebKit unterstützt die coole CSS3-Eigenschaft background-clip, mit der Sie einige ziemlich nette Dinge tun können. Das erste Mal, als wir uns damit beschäftigten, war die Idee des iPhone Slide-to-unlock, bei der wir einen Gradienten animierten, der durch den Hintergrund des Textes lief. Dann haben wir uns damit für die Idee der transparenten Ränder beschäftigt.
Schauen wir uns an, wie wir damit ein Bild nur durch die Buchstaben des Textes sichtbar machen können. Eine weitere coole Sache, deren Fähigkeit von Druckdesignern wir nicht mehr beneiden müssen.

Die Grundidee
h1 {
color: white; /* Fallback: assume this color ON TOP of image */
background: url(images/fire.jpg) no-repeat;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
Das ist alles, was dazu gehört. Setzen Sie ein Hintergrundbild auf das Element, schneiden Sie es aus und setzen Sie die Textfüllfarbe auf transparent.
Das Problem
Wie ich sicher bin, ist jedem schmerzlich bewusst, dass dies nicht in allen Browsern funktioniert. Die aktuelle Unterstützung beschränkt sich auf WebKit. Was passiert also als Fallback? Wie Sie im obigen Code sehen können, deklarieren Sie auch einen color-Wert. Dieser Wert wird in Browsern, die ihn unterstützen, durch -webkit-text-fill-color überschrieben, so dass wir damit klarkommen. In Browsern, die -webkit-background-clip: text nicht unterstützen, sehen wir das Hintergrundbild vollständig, sodass wir Text über diesem Hintergrundbild sehen. Wenn Sie also nicht weiterlesen, setzen Sie einen Farbwert, der auf diesem Hintergrundbild gut sichtbar ist.
Also, wir bekommen das hin

Nicht das absolute Ende der Welt, zumindest haben wir den Text einigermaßen lesbar gemacht. Aber das ist noch ein weiter Weg von dem, was wir uns vorstellen und was WebKit-Benutzer erleben werden. Grundsätzlich gilt: Dieser Fallback ist schlecht, machen wir es besser.
Ein besserer Fallback
Das ultimative Werkzeug für bessere Fallbacks ist Modernizr. Fügen Sie einfach die (recht kleine) JavaScript-Datei auf Ihre Seite ein, und sie fügt dem html-Tag Ihrer Seite Klassen hinzu, die anzeigen, wozu der aktuelle Browser in der Lage ist. Sie bietet auch eine API zum Testen von Funktionen in JavaScript, aber die werden wir heute nicht brauchen.
Leider hat Modernizr keinen direkten Test für background-clip. Ich habe einen der Entwickler, Paul Irish, gefragt, der mir diesen schnellen Weg gezeigt hat, diesen Test hinzuzufügen. Der ganze Teil
<script src="modernizr-1.6.min.js"></script>
<script>
Modernizr.addTest('backgroundclip',function() {
var div = document.createElement('div');
if ('backgroundClip' in div.style)
return true;
'Webkit Moz O ms Khtml'.replace(/([A-Za-z]*)/g,function(val) {
if (val+'BackgroundClip' in div.style) return true;
});
});
</script>
Jetzt wissen wir, ob der aktuelle Browser background-clip unterstützt oder nicht. Wenn ja, hat das html-Tag eine Klasse backgroundclip, wenn nicht, hat es eine Klasse no-backgroundclip.
Jetzt wenden wir das Hintergrundbild nur an, wenn wir sicher sind, dass der Browser background-clip unterstützt.
.backgroundclip h1 {
background: url(images/west.jpg) -100px -40px no-repeat;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
h1 {
color: orangered;
}
Badda Bing, jetzt ist der Fallback eine gerade durchgezogene Volltonfarbe anstelle eines unordentlich aussehenden Bild-Ausschnitts.

Aber… es gibt kein perfektes System dafür.
Es gibt ein Problem mit Android (bis einschließlich 4.2), wo es -webkit-background-clip tatsächlich nicht unterstützt – obwohl jeder Test zurückgibt, dass es das tut. Die Eigenschaft und jeder Wert, den sie haben mag, einschließlich text. Selbst Modernizr's testAllProps() kann es nicht erfassen. Aber -webkit-text-fill-color funktioniert, sodass Sie im Grunde ein Bild ohne Text erhalten. Ziemlich schlecht.
Wenn Sie dies unbedingt verwenden müssen, müssen Sie möglicherweise UA-Tests für Android durchführen
var NastyBrowserSniffing = {
ua: navigator.userAgent.toLowerCase(),
init: function() {
var isAndroid = NastyBrowserSniffing.ua.indexOf("android") > -1;
if (isAndroid) {
$("html").addClass("android");
}
}
};
NastyBrowserSniffing.init();
Dann den Effekt rückgängig machen, wenn es Android ist
html.android .gradient-text {
color: white;
background: none;
-webkit-text-fill-color: white;
-webkit-background-clip: border-box;
}
.gradient-text {
background: -webkit-linear-gradient(gray, black);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
Verwandt
Stephen Morley beschreibt wie man es für IE mit Filtern macht.
Genial! Hat Firefox also noch keine Chance?
Safari ist bei mir unter Windows abgestürzt?? Bin mir nicht sicher, ob es ein Skriptproblem ist oder Safari unter Windows??
Jedes Mal, wenn ich eine Demo auf dieser Seite öffne, scheint Chromium nicht mehr zu reagieren und der Tab stürzt ab. Es muss etwas sein, das auf jeder Seite hinzugefügt wird, aber es ruiniert meinen Browser.
Es ist ein ziemlich cooler Trick, den ich vor einiger Zeit getestet habe: http://valuedstandards.com/static/test/clip.html
Beachten Sie jedoch, dass WebKit wahrscheinlich die Unterstützung für etwas anderes/besseres wie die Verwendung eines Wertes für die
color-Eigenschaft ganz aufheben wird.Wird FF4 das unterstützen?
Derzeit unterstützt die neueste FF4-Beta (b7) dies nicht. Vielleicht (hoffentlich) in Zukunft.
Das ist wirklich fantastisch.
Nur eine Sache: Wird diese Ersetzungsmethode nicht etwa 9-10 Mal ausgeführt, weil sie auch für das Leerzeichen zwischen jedem Vendor-Präfix ausgeführt wird? Wäre es besser, das + anstelle des * zu verwenden?
'Webkit Moz O ms Khtml'.replace(/([A-Za-z]+)/gAuf diese Weise wird der Callback nur ausgeführt, wenn etwas erfasst wurde. Ein Leerzeichen entspricht false und wird daher nie in diesen Fällen ausgeführt. (Aber eher nebensächlich, ja).
Sehr coole Demo.
Oh, ich glaube, Sebastiaan hat Recht. Vielleicht so etwas?
Noch prägnanter
'Webkit Moz O ms Khtml'.replace(/\w+/g, ...callback...)Ich glaube nicht, dass die zweite "return true"-Anweisung das beabsichtigte Ziel erreicht, da sie einfach aus der anonymen Funktion zurückkehrt, die an replace() übergeben wird. Wie wäre es mit der Verwendung einer returnValue-Variable, die innerhalb des Closures gesetzt und dann am Ende zurückgegeben wird?
Scheint, als ob es auch in FF4 beta7 kaputt ist. Fallback funktioniert nicht :-/
Ich liebe es einfach, Ihre Seite zu besuchen, Mann. Ich bin ein CSS-Federgewicht, daher sprengt mich Neues wie CSS3, manchmal ist es so überwältigend, dass es mir zu viel erscheint, um es zu begreifen. Es ist so großartig zu finden, dass es solche Seiten gibt, die uns durch den Prozess helfen. Prost!
Netter Trick.
Leider erhält man unter Android den Hintergrund auf dem gesamten div und überhaupt keinen Text.
Tolle Arbeit, Chris! Ich mag deine Experimente sehr.
Dies ist einer dieser Effekte, bei denen meine erste Reaktion ist: Warum sich die Mühe machen? Es funktioniert nur in wenigen Browsern, und welchen Wert bringt es? Die beste Lösung hier wäre, ein tatsächliches Bild zu erstellen und CSS nicht dafür zu verwenden, damit es überall funktioniert.
Bill,
Obwohl Ihr Punkt gültig ist, würde ich argumentieren, dass Chris lediglich einen Proof of Concept präsentiert. Würden Sie dies jemals auf einer Live-Website einsetzen? Vielleicht ja, vielleicht nein. Wichtiger ist, dass Chris einen experimentellen CSS3-Ansatz vorstellt und vor allem einen anmutigen Fallback zeigt.
Ausgezeichnete Arbeit, Chris. Ich bin froh, dass Sie sich die Mühe gemacht haben:) Kleine Schritte in Richtung eines schöneren Webs!
Sie lassen oft -o- Präfixe weg, was dazu führt, dass Modernizr Unterstützung erkennt und den Fallback nicht liefert, sondern die Darstellung fehlerhaft ist, wie hier.
Trotzdem wie immer ein tolles Tutorial.
Dies sieht unter Chrome (unter XP) beim Drehen sehr ruckelig aus, horizontal aber in Ordnung. Ein -webkit-transform-Problem?
Das ist wirklich cool zu sehen, was jetzt mit CSS möglich ist, aber ich würde wirklich Photoshop verwenden, um an dieser Art von Effekt zu arbeiten
Das Problem bei diesem Test ist, dass er auf die Eigenschaft background-clip prüft, nicht auf den spezifischen Wert (text). background-clip wird von allen modernen Browsern unterstützt (sogar IE9), aber der "text"-Wert ist eine nicht standardmäßige Webkit-Erweiterung. Im Wesentlichen würde der "bessere Fallback" nur in alten Browsern angewendet, die background-clip gar nicht unterstützen, und würde bei modernen Browsern, die keine Webkit sind, fehlschlagen, da diese nur die Standardwerte dafür unterstützen.
Sie könnten nur auf den Wert "text" prüfen, indem Sie versuchen, ihn auf die unterstützte Version der background-clip-Eigenschaft anzuwenden und sehen, ob der Browser ihn akzeptiert, indem Sie ihn danach abfragen (in einem try...catch-Konstrukt, da einige IEs Fehler bei nicht unterstützten Werten werfen). Habe es noch nicht ausprobiert, aber das funktioniert normalerweise zum Testen der Unterstützung von CSS-Werten.
Es ist wirklich gut. Wenn es in allen Browsern funktioniert, muss man nicht in Photoshop arbeiten, um diese Art von Maskierungseffekten zu erstellen.
-vara
Das wird gut zu verwenden sein, ich frage mich nur nach der Unterstützung für andere Browser als Webkit.
Dies funktioniert (offensichtlich) auch für Gradientenhintergründe (wie Chris in diesem Beitrag zeigt).
Wenn Sie jedoch jetzt text-shadow anwenden, wird der Hintergrund nicht angezeigt, da der Schatten offenbar eine solide "Ebene" unter dem gesamten Text ist.
Eine Methode, sowohl Gradiententext als auch Textschatten zu haben, wird von Jeffrey Way in diesem Artikel auf nettuts beschrieben, was die Replikation von Inhalten in Ihrem Stylesheet beinhaltet, was für mich ein großes No-Go ist.
Webkit sollte entweder eine text-shadow-clip-Eigenschaft erstellen (ja, sicher) oder uns einfach erlauben, etwas wie ein Bild oder einen Gradienten für Textfarbeneigenschaften festzulegen, anstatt nur für Hintergrundeigenschaften.
Hahahaha.. es ist erstaunlich. Funktioniert in Chrome 7.0 (aber der "rotierte Text" ist es nicht, beim Mouseover wird er gerade/nicht gedreht), funktioniert nicht in FF (nur Farbe, kein Bild) und schlecht in Opera 10 (wie ein div mit Bildhintergrund). Aber guter Versuch :D
Brillant, wirklich schöne Verwendung von CSS mit Text. LT
Ich hatte gehofft, dass beim Verwenden eines sich bewegenden Divs (Scrollen) und Ändern des Hintergrundbildes in ein halbtransparentes PNG dies es mir ermöglichen würde, das Bild zu sehen, über das das Div gescrollt wird.
Leider funktioniert es nicht.
Weiß jemand, wie man Text aus einem Div mit einer Volltonfarbe "ausstanzt"? Das Setzen des Textes auf transparent funktioniert nicht.
Keine Firefox-Nutzung für diese Tricks? Funktioniert super in Safari, danke fürs Teilen!
Die Demo stürzt meinen Safari jedes Mal ab, wenn ich versuche, die Demo anzusehen. Vielleicht ist dieses lustig aussehende Feature nicht perfekt
großartig
funktioniert das auch unter IE?
Toller Beitrag! Schöner Trick! Ich mag ihn!
Es hat auch den Safari auf meinem W7 abgestürzt ...
man könnte auch ein Photoshop-Bild erstellen, wenn man etwas nach CS2 hat und eine Schnittmaske erstellen
Ich habe versucht, diese Eigenschaft auf inline-svg für Mozilla und Opera zu emulieren
http://www.myadzel.ru/tests/html/text-background/
Sortiert. Ist passiert.
Hallo, mir gefällt die Idee des Modernizr-Tweaks, obwohl er bei mir in FF 27.0.1 nicht funktionierte, da er in diesem Browser backgroundclip anzeigt.
Was ist mit der Verwendung von
@media(-webkit-min-device-pixel-ratio:0){.textbg{background:url(bg.jpg)}}
.textbg{-webkit-background-clip:text;-webkit-text-fill-color:transparent;-webkit-text-stroke:1px black}
?
Sie, mein Herr, sind FANTASTISCH.
Was wurde hier aktualisiert? Bei mir wendet es die backgroundclip-Klasse für alle Nicht-Browser von Chrome bis ie7 an. Haben Sie es nach dem Update/mit einem neueren Modernizr getestet?