Es gibt ein paar Möglichkeiten, um Knockout-Text (Text, der ausgeschnitten erscheint, sodass man einen Hintergrund dahinter sehen kann) im Web zu erstellen. Es gibt eine ziemlich neue Methode, die eine recht gute Browserunterstützung hat und sehr interessant ist. Aber lass uns das gesamte Feld abdecken.
Einfach mit Photoshop
Wie bei allem anderen kann man es einfach mit einer flachen Grafik faken. Manchmal lohnt es sich, das Offensichtliche zu behandeln. Die Nachteile sind, dass es nicht dynamisch/schwer zu ändern ist. Man kann den Text nicht kopieren und einfügen. Bilder können groß in der Dateigröße sein, besonders wenn man um höhere Auflösung kämpft. Etc. etc. Aber man kann es machen und es wird überall funktionieren

-webkit-background-clip: text;
Dies ist eine nicht standardisierte Eigenschaft, aber sie wurde erfunden, um genau das zu tun. Das Schöne ist, dass man sie mit -webkit-text-fill-color: transparent; kombinieren kann, so dass man den Text nur in einem Browser "versteckt", der das Clipping beherrscht. Divya Manian hat dies vor einigen Jahren dokumentiert.
.clip-text-maybe {
/* if we can clip, do it */
-webkit-text-fill-color: transparent;
-webkit-background-clip: text;
/* what will show through the text
~ or ~
what will be the background of that element */
background: whatever;
/* fallback text color
~ or ~
the actual color of text, so it better work on the background */
color: red;
}
Dies ist echter Webtext, mit dem kommen alle Zugänglichkeit, Suchbarkeit, leichte Änderbarkeit und alles dazugehörige.
Hier sind einige lustige Beispiele für diese Methode, von Jintos
Siehe den Stift -webkit-background-clip:text CSS effect von Jintos (@Jintos) auf CodePen.
Wie jeder andere Hintergrund kann man seine Position fixieren, wenn das wünschenswert ist. Hier ist eine Demo davon von Richard Hayes
Siehe den Stift Webkit Clip with Fixed Background von Richard (@strawstack) auf CodePen.
SVG <pattern> Füllung
SVG kann auch echten Text haben, durch sein <text> Element. SVG-Text kann mit allem gefüllt werden, einschließlich eines Musters. Und ein Muster kann ein Bild verwenden. Also… Knockout-Text!
Ein Beispiel dafür wäre
<svg>
<pattern id="pattern" patternUnits="userSpaceOnUse" width="750" height="800">
<image width="750" height="800" xlink:href="image.jpg"></image>
</pattern>
<text x="0" y="80" class="headline" style="fill:url(#pattern);">background-clip: text | Polyfill</text>
</svg>
Das könnte man direkt in HTML überall verwenden. Hier ist ein Beispiel dafür von C.Y. Park
Siehe den Stift SVG Text Clip with Gradient & GIF von C.Y. Park (@cypark) auf CodePen.
Lea Verou hat diese Technik auch dokumentiert.
CSS mit SVG polyfillen
Tim Pietrusky hat einen Polyfill für -webkit-background-clip erstellt, der die SVG-Methode als Fallback verwendet. Die CSS-Version ist sicherlich einfacher und schneller zu schreiben als die SVG-Version, daher scheint dies ein guter Weg zu sein, um trotzdem eine bessere Browserunterstützung zu erhalten.
Siehe den Stift -webkit-background-clip: text Polyfill von Tim Pietrusky (@TimPietrusky) auf CodePen.
mix-blend-mode: screen;
Das ist die neue Methode, die ich vorher nicht kannte! CSS-Blending ist ziemlich neu. Es erlaubt Ihnen, Elemente über anderen Elementen zu überlagern, wie Sie Stile in Photoshop schichten würden (z. B. "screen", "multiply", "lighten" usw.)
Richtig gemacht, kann man ein Bild direkt über Text überlagern, ohne den "echten" Hintergrund zu beeinträchtigen. Ich habe Giana das zuerst auf CodePen machen sehen
Siehe den Stift CSS Gradient Text in Firefox von Giana (@giana) auf CodePen.
Es funktioniert so
- Machen Sie den Text schwarz.
- Bedecken Sie den gesamten Text mit dem neuen Text-Hintergrund und
mix-blend-mode: screen; - Bedecken Sie das dann mit einer neuen Kopie desselben Textes (in Weiß) und demselben Hintergrund wie die Seite und
mix-blend-mode: multiply;
Das lässt nur den Text mit dem "Knockout"-Hintergrund sichtbar. Wenn Sie pointer-events verwenden, können Sie den Text auch klickbar und auswählbar lassen, obwohl es schwer ist, zu sehen, was Sie tun.
Der Vorteil ist, dass dies eine reine CSS-Methode ist, die sowohl in Firefox als auch nicht nur in -webkit-Sachen funktioniert.
Nur so am Rande, es gibt eine noch bessere Möglichkeit, dies mit Photoshop zu tun. Stellen Sie sicher, dass die Textebene unter dem Bild liegt, dann halten Sie Alt gedrückt und klicken Sie zwischen die beiden Ebenen.
Dann können Sie den Text später ändern, und die Maske bleibt immer auf dem neuesten Stand.
https://helpx.adobe.com/photoshop/using/revealing-layers-clipping-masks.html
Danke dafür, Andrew,
Leider, wenn es keinen zugänglichen Text ausgibt, könnte dies Unternehmen in Schwierigkeiten bringen und, was noch wichtiger ist, potenzielle Benutzer verärgern, die keine Möglichkeit haben, auf den Inhalt zuzugreifen, wenn er als Bild dargestellt wird.
Es ist trotzdem ein cooler Link, definitiv der beste Weg, um um eine Grafik oder eine visuelle Anzeige, die keinen Textkörper enthält, auszustanzen.
Lewis, das tut die erste vorgeschlagene Methode mit Photoshop auch nicht. Wenn Sie ein Bild statt Text erstellen wollen, können Sie genauso gut eine Schnittmaske erstellen, wie von Andrew vorgeschlagen.
Lewis, ja. Wie Matth sagte: Ich schlage nur einen Workflow vor, um die schlechteste Lösung etwas weniger schmerzhaft zu machen.
In diesem Sinne, wenn Sie die Photoshop-Route gehen, werden Sie wahrscheinlich viele visuell komplexe PNG-Dateien speichern. Denken Sie daran, sie zu komprimieren, alle! http://pngmini.com ist so ziemlich der Goldstandard.
Ich glaube nicht, dass Andrew impliziert hat, dass seine Methode besser ist als die Verwendung von CSS. Er sagt nur, dass, wenn man Photoshop verwenden muss, seine vorgeschlagene Methode besser ist als das Beispiel im Artikel, weil sie nicht destruktiv ist.
Gibt es eine Möglichkeit, die umgekehrte Wirkung mit CSS zu erzielen?
Umgekehrte Wirkung? Meinst du einen Foto-Hintergrund mit weißem Text darauf?
Andrew, ein schnelles Mockup ist besser als Worte: https://cloudup.com/ctQdOssOX6h
Die Bedingung: Der Text sollte zugänglich, flexibel und nicht an den
contenteines Pseudo-Elements gebunden bleiben.Scott,
Ich bin mir immer noch nicht sicher, ob ich den Unterschied sehe.
Ich gehe davon aus, dass die Idee ist, dass man die blaue Box mit dem ausgeschnittenen Text über ein Bild legen möchte. Wenn das der Fall ist, sieht es visuell genau wie alle Beispiele dort aus: Volltonfarbiger Hintergrund, Bild auf die Grenzen des Textes beschnitten.
Das gesagt – wenn man wirklich möchte, dass der Text transparent ist und keine Schnittmaske (und ich bin mir nicht sicher, wie sich das in der realen Welt unterscheiden würde), dann könnte man es vielleicht mit SVG versuchen. Ich weiß nicht wie, das ist nur lautes Denken.
Andrew, danke für deine Antwort. Obwohl der Effekt ähnlich wie bei den ursprünglichen Beispielen erscheinen mag, ist das, was ich erreichen möchte, ziemlich anders.
Wenn man sich das erste Beispiel genauer ansieht, muss dem ausgeschnittenen Text (
clip-text_one) eine Hintergrundfarbe zugewiesen werden, und diese muss mit der Hintergrundfarbe des übergeordneten Elements (body) übereinstimmen, um den Effekt zu erzielen. Richtig?Ich habe den ursprünglichen Pen gegabelt, bei dem ich dem
bodyein Hintergrundbild zugewiesen und den ausgeschnittenen Text absichtlich lila gefärbt habe, damit er sichtbar ist. Ich lade Sie ein, zu versuchen, den Text so auszustanzen, dass er den übergeordnetenbodyoffenbart.http://codepen.io/anon/pen/WQGGdx?editors=110
Ah, ich verstehe.
Ich *denke*, was Sie fragen, ist vielleicht nicht möglich. Sie müssen es vielleicht faken und die Funktionsweise akzeptieren (vorausgesetzt, es sieht gleich aus) in Beispiel eins.
Wenn Sie die Komplexität nicht mögen, könnten Sie vielleicht einen Sass-Mixin erstellen, um alles für Sie zu erledigen?
Es ist nicht nötig, den Text zu duplizieren, wenn man die Blend-Mode-Methode verwendet.
Wenn Sie den Text auf einem weißen Hintergrund wünschen
mix-blend-mode: lightenWenn Sie den Text auf einem schwarzen Hintergrund wünschen
mix-blend-mode: darkenArbeitet in diesem Pen.
Ein schwarzer oder weißer Hintergrund vereinfacht die Dinge erheblich. Es gibt einen Kommentar im CSS des Pens, der dies berührt, aber durch das Entfernen des Pseudo-Element-Textes statt des HTML-Textes. Der duplizierte Text ist eine hässliche Lösung für einen farbigen Hintergrund. Ich liebe, wie prägnant Ihre Version ist.
Beachten Sie, dass
-webkit-text-fill-colorfür die erste Technik nicht notwendig ist, dacolorausreichen würde.Ich vermute, das wurde gemacht, weil, wenn man einen umrandeten Text mit
-webkit-text-strokemit einer transparenten Füllung rendern möchte, man in Browsern, die es nicht unterstützen, nichts sehen würde.Daher würde man stattdessen
-webkit-text-fill-colorverwenden und für andere Browser aufcolorzurückfallen – was *weniger* Priorität hat und dies zu vielen Kopfschmerzen führen kann, wenn-webkit-text-fill-colornicht für seinen beabsichtigten Zweck verwendet wird (man kann!importantmitcolorverwenden und es hätte keine Wirkung!).Am Ende kann in Browsern, die
@supportsunterstützen,-webkit-text-fill-color(und das schließt Safari 9+ ein) ganz weggelassen werden.Ich bin mir nicht sicher, ob ich das hier verstehe. Wenn man den Text nicht auf transparent setzt, sieht man den Knockout nicht. Man könnte
colorverwenden, um das zu tun, aber dann ist der Fallback unsichtbarer Text (schlecht).Mit SVG kann man clipPath und Farbverläufe verwenden und sogar verrückt werden und das Ding animieren! http://codepen.io/dennisgaebel/pen/xGMYJY
Hallo allerseits!
„-webkit-background-clip: text;“-Technik…
Ich verstehe nicht, wie es funktioniert und ob es funktioniert: http://i.imgur.com/O4Ueykl.png
Mein Browser – Firefox 43.0a2.
Eine ähnliche Anzeige in Firefox 41.0 und Rekonq.
Der einzige Browser, in dem dies funktioniert, ist Chrome
Firefox erkennt die meisten
-webkit-Präfixe nicht an, und das ist ziemlich logisch, da sein Präfix-mozist.Haroen,
Sie schlagen also vor, der Eigenschaft "background-clip" das Präfix "-moz" hinzuzufügen?
Die Eigenschaft "background-clip" funktioniert in Firefox ohne Präfixe einwandfrei. Aber das Endergebnis liefert nicht...
Vor einiger Zeit habe ich einen Pen erstellt, der den Knockout-Effekt mit einer animierten Leinwand als Hintergrund nachbildet: http://codepen.io/noxoc/pen/tvArf
Ziemlich einfaches Beispiel, deshalb ist es wahrscheinlich unbemerkt geblieben. Ich werde es vielleicht mit einem interessanteren Beispiel neu erstellen. ;)