Innerer Textschatten mit CSS

107

Ich spiele gerade mit CSS3 herum und versuche, einen solchen Texteffekt zu erzielen (den schwarzen, verschwommenen inneren Schatten):

Ich kann jedoch keine Möglichkeit finden, Textschatten im Text zu erstellen . Ich frage mich, ob es noch möglich ist, weil das Box-Shadow-Element in der Lage ist, Schatten im Inneren wie folgt zu rendern:

box-shadow: inset 0px -5px 10px 0px rgba(0, 0, 0, 0.5);

Irgendwelche Ideen?

Ericteubert
quelle
3
Keine Antwort darauf, wenn Sie nicht bereit sind, optische Täuschungen zu machen ...
Aaria Carter-Weir

Antworten:

105

Hier ist ein kleiner Trick, den ich mit den Pseudoelementen :beforeund entdeckt habe :after:

.depth {
    color: black;
    position: relative;
}
.depth:before, .depth:after {
    content: attr(title);
    color: rgba(255,255,255,.1);
    position: absolute;
}
.depth:before { top: 1px; left: 1px }
.depth:after  { top: 2px; left: 2px }

Das title-Attribut muss mit dem Inhalt übereinstimmen. Demo: http://dabblet.com/gist/1609945

Webdesigner
quelle
1
Nett! Kreativ :) Immer noch nicht so Photoshop-artig, wie ich es gerne hätte. Sie können die oberen / linken Werte auf jeweils 5 Pixel einstellen, um einen inneren Schattenversatz von 5 Pixel zu erzielen. Dann tritt der Buchstabe am anderen Ende aus - was für 1 Pixel und 2 Pixel gut aussieht, für höhere Werte jedoch seltsam.
Ericteubert
1
Ja, es sieht nur gut aus mit einem leichten Hauch von Weiß auf der Unterseite. Mehr als 2px zerstören den Look.
Web_Designer
1
Genial! Sie können dies auch verwenden, um weißen Text zu erstellen, indem Sie die Deckkraft auf 0,9 erhöhen, oder um abgeschrägte Kanten zu erstellen, indem Sie die Deckkraft bei 0,1 halten und die Farben umkehren. (+1)
JohnB
Tolle Lösung. Scheitert jedoch in Kombination mit zB Textverläufen (schade. Vermutlich müssen wir einige Jahre auf CSS4 warten, um großartige Texteffekte zu erzielen.
Michael Trouw
Das ist cool in Chrome. Ich habe Probleme, ein alternatives Fallback für FF zu erstellen, das ohne JS und eine Namespace-Klasse nicht für Chrome gilt. Irgendwelche Gedanken. PS Funktioniert wunderbar auf einem Ledereffekt bg, sieht aus wie ein Markenstempel.
Will Hancock
43

Sie sollten in der Lage sein, dies mit dem Textschatten zu tun, ähm, denken Sie so:

.inner_text_shadow
{
    text-shadow: 1px 1px white, -1px -1px #444;
}

Hier ist ein Beispiel: http://jsfiddle.net/ekDNq/

RobertPitt
quelle
8
Hum, ja, irgendwie. Der visuelle Effekt ist bei diesen Parametern ähnlich, aber es ist immer noch ein Schatten hinter der Schriftart. Nicht im Inneren. In meinem Beispiel verwische ich sogar den eingefügten Schatten und das würde den Effekt hier zerstören. Also ... bisher beste Lösung, aber immer noch nur ein visueller Illusionshack;)
Ericteubert
2
Beachten Sie, dass Sie dadurch die Schrift fetter machen. Bei kleinen und mittleren Schriftarten möchten Sie dies möglicherweise nicht.
Jonatan Littke
20

Hier ist mein bester Versuch:

    .inner_shadow {
    color:transparent;
    background-color:white;
    text-shadow: 0 0 20px rgba(198,28,39,0.8), 0 0 0 black;
    font-family:'ProclamateHeavy';  // Or whatever floats your boat
    font-size:150px;
    }
   
    <span class="inner_shadow">Inner Shadow</span>
   

Das Problem ist, wie man den Schatten schneidet, der an den Rändern blutet !!! Ich habe es im Webkit mit background-clip: text versucht, aber das Webkit rendert den Schatten über dem Hintergrund, sodass es nicht funktioniert.

Erstellen einer Textmaske mit CSS?

Ohne eine obere Maskenebene ist es unmöglich, einen echten inneren Schatten auf Text zu erzeugen.

Vielleicht sollte jemand dem W3C empfehlen, einen Hintergrundclip hinzuzufügen : umgekehrten Text , der eine Maske durch den Hintergrund schneidet, anstatt den Hintergrund so zu schneiden, dass er in den Text passt.

Entweder das oder den Textschatten als Teil des Hintergrunds rendern und mit Hintergrund-Clip: Text ausschneiden.

Ich habe versucht, ein identisches Textelement absolut darüber zu positionieren, aber das Problem ist der Hintergrundclip: Text schneidet den Hintergrund so ab, dass er in den Text passt, aber wir brauchen das Gegenteil davon.

Ich habe versucht, einen Strich zu verwenden: 20px weiß; sowohl auf diesem als auch auf dem darüber liegenden Element, aber der Textstrich geht sowohl rein als auch raus.

Alternative Methoden

Da es derzeit keine Möglichkeit gibt, eine invertierte Textmaske in CSS zu erstellen, können Sie sich an SVG oder Canvas wenden und ein Textersatzbild mit den drei Ebenen erstellen, um den Effekt zu erzielen.

Da SVG eine Teilmenge von XML ist, kann SVG-Text weiterhin ausgewählt und durchsucht werden, und der Effekt kann mit weniger Code als Canvas erzeugt werden.

Es wäre schwieriger, dies mit Canvas zu erreichen, da es keinen Dom mit Ebenen wie SVG gibt.

Sie können die SVG entweder serverseitig oder als Javascript-Textersetzungsmethode im Browser erstellen.

Weiterführende Literatur:

SVG versus Canvas:

http://dev.opera.com/articles/view/svg-or-canvas-choosing-between-the-two/

Ausschneiden und Maskieren mit SVG-Text:

http://www.w3.org/TR/SVG/text.html#TextElement

kendo451
quelle
2
Ich habe eine ausführlichere Erklärung zu Ihrem besten Versuch mit einem Beispiel veröffentlicht. Hör zu!
Alba Mendez
1
Beispiel dafür bis zum Äußersten genommen .
Alba Mendez
In Ihrem Beispiel gibt es einen äußeren Schatten
AlexKh
12

Genauere Erklärung des CSS in der Antwort von kendo451 .

Es gibt noch einen anderen Weg, um eine ausgefallene innere Schattenillusion zu erhalten,
die ich in drei einfachen Schritten erklären werde. Angenommen, wir haben diesen HTML-Code:

<h1>Get this</h1>

und dieses CSS:

h1 {
  color: black;
  background-color: #cc8100;
}

Es ist ein guter Slogan

Schritt 1

Beginnen wir damit, den Text transparent zu machen:

h1 {
  color: transparent;
  background-color: #cc8100;
}

Es ist eine Kiste

Schritt 2

Nun schneiden wir diesen Hintergrund auf die Form des Textes zu:

h1 {
  color: transparent;
  background-color: #cc8100;
  background-clip: text;
}

Der Hintergrund ist der Text!

Schritt 3

Nun wird die Magie: wir werden ein verschwommenes setzen text-shadow, die sein wird , vor dem Hintergrund , so dass der Eindruck einer inneren Schatten zu geben!

h1 {
  color: transparent;
  background-color: #cc8100;
  background-clip: text;
  text-shadow: 0px 2px 5px #f9c800;
}

Wir haben es!  Yay!

Siehe das Endergebnis .

Nachteile?

  • Funktioniert nur in Webkit ( background-clipkann nicht sein text).
  • Mehrere Schatten? Denk nicht mal nach.
  • Sie erhalten auch ein äußeres Leuchten.
Alba Mendez
quelle
"Mehrere Schatten? Denk nicht mal nach." Was ist mit text-shadow: 1px 1px 1px #000, 3px 3px 5px blue;?
Morpheus
@Morpheus Einer der Nachteile dieser Methode ist, dass Sie nicht mehrere Schatten auf den Text anwenden können.
Alba Mendez
Die Größe und Helligkeit dieses Beispiels erschweren das Anzeigen anderer. Könnten Sie diese vielleicht in Codefragmente verschieben? Vielen Dank!
Josh Habdas
12

Ein elegantes Beispiel, ohne dass ein positionierter Wrapper oder doppelter Inhalt im Markup erforderlich ist:

:root {
  background: #f2f2f2;
}
h1 {
  background-color: #565656;
  font: bold 48px 'Futura';
  color: transparent;
  text-shadow: 0px 2px 3px rgba(255, 255, 255, 0.8);
  -webkit-background-clip: text;
  -moz-background-clip: text;
  background-clip: text;
}
<center>
  <h1>Text With Inner Shadow</h1>
</center>

Sieht auch auf dunklem Hintergrund gut aus:

:root {
  --gunmetal-gray: #2a3439;
  background: var(--gunmetal-gray);
}

h1[itemprop="headline"] {
  font-family: 'Futura';
  font-size: 48px;
  padding-bottom: 0.35rem;
  font-variant-caps: all-small-caps;
  background-color: var(--gunmetal-gray);
  color: transparent;
  text-shadow: 0px 2px 3px rgba(255, 255, 255, 0.1);
  -webkit-background-clip: text;
  -moz-background-clip: text;
  background-clip: text;
  filter: brightness(3);
}
<center>
  <h1 itemprop="headline">Text With Inner Shadow</h1>
</center>

UND ME LINK UND ME2 LINK

Zombyii
quelle
Einfach und erfordert keine Anpassungen am Markup. Gute Arbeit!
Josh Habdas
10

Sie können dies irgendwie tun. Leider gibt es keine Möglichkeit, einen Einschub für Textschatten zu verwenden, aber Sie können ihn mit Farbe und Position fälschen. Nehmen Sie die Unschärfe ganz nach unten und ordnen Sie den Schatten oben rechts an. So etwas könnte den Trick machen:

background-color:#D7CFBA;
color:#38373D;
font-weight:bold;
text-shadow:1px 1px 0 #FFFFFF;

... aber Sie müssen wirklich sehr, sehr vorsichtig sein, welche Farben Sie verwenden, sonst sieht es nicht gut aus. Es ist im Wesentlichen eine optische Täuschung und funktioniert daher nicht in jedem Kontext. Bei kleineren Schriftgrößen sieht es auch nicht besonders gut aus. Beachten Sie dies auch.

Hollsk
quelle
Nicht wirklich das, wonach ich suche. Die Wirkung Ihres Vorschlags ist interessant, aber weit entfernt von dem Beispiel, das ich veröffentlicht habe.
Ericteubert
Dann gibt es in diesem Fall keine Antwort, nicht mit CSS3. Entschuldigung, ich konnte nicht helfen.
Hollsk
Eingefügte Schatten sind background-clipwie in dieser Antwort gezeigt möglich .
Josh Habdas
10

Es sind keine mehreren Schatten oder ähnliches erforderlich. Sie müssen lediglich Ihren Schatten auf der negativen y-Achse versetzen.

Für dunklen Text auf hellem Hintergrund:

text-shadow: 0px -1px 0px rgba(0, 0, 0, .75);

Wenn Sie einen dunklen Hintergrund haben, können Sie einfach die Farbe und die y-Position umkehren:

text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.75);

Spielen Sie mit den RGBA-Werten, der Deckkraft und der Unschärfe, um den richtigen Effekt zu erzielen. Es hängt stark davon ab, welche Farbschrift und welchen Hintergrund Sie haben. Je schwerer die Schrift, desto besser.

Dylan
quelle
3
Immer noch nur eine optische Täuschung, kein wirklicher innerer Schatten.
Ericteubert
25
... sind nicht alle Schatten eine optische Täuschung?
Charlie Schliesser
du bist mürrisch @eteubert ... wirklich gemein
Jamie Hutber
7

Probieren Sie dieses kleine Juwel einer Variation:

text-shadow:0 1px 1px rgba(255, 255, 255, 0.5);

Normalerweise nehme ich "es gibt keine Antwort" als Herausforderung

Mike
quelle
1
Dies erzeugt einen weißen Umriss am unteren Rand der Schrift, aber ich suchte nach einem schwarzen, verschwommenen inneren Schatten .
Ericteubert
1
Dies funktionierte am besten für mich, insbesondere beim Abschatten kleinerer Texte. Ich empfehle, die RGB-Werte bei Bedarf ein wenig zu ändern, damit sie mit Ihrer Schriftfarbe richtig aussehen.
Cory Schires
6

Ich habe viele der vorgeschlagenen Lösungen gesehen, aber keine war genau das, was ich mir erhofft hatte.

Hier ist mein bester Hack, bei dem die Farbe transparent ist, der Hintergrund und der obere Textschatten dieselbe Farbe mit unterschiedlichen Opazitäten haben und die Maske simulieren. Der zweite Textschatten ist eine dunklere, gesättigtere Version der Farbe, die Sie verwenden eigentlich wollen (ziemlich einfach mit HSLA zu tun).

Geben Sie hier die Bildbeschreibung ein

(Übrigens, Text und Styling basierend auf dem OP eines Dupe-Threads )

Esjay
quelle
6

Ich hatte einige Fälle, in denen ich innere Schatten auf Text brauchte, und Folgendes hat für mich gut funktioniert:

.inner {
    color: rgba(252, 195, 67, 0.8);
    font-size: 48px;
    text-shadow: 1px 2px 3px #fff, 0 0 0 #000;
}

Dadurch wird die Deckkraft des Texts auf 80% festgelegt und anschließend zwei Schatten erstellt:

  • Der erste ist ein weißer Schatten (vorausgesetzt, der Text befindet sich auf einem weißen Hintergrund), der 1 Pixel von links und 2 Pixel von oben versetzt ist und 3 Pixel unscharf ist.
  • Der zweite ist ein schwarzer Schatten, der durch den Text mit einer Deckkraft von 80% sichtbar ist, jedoch nicht durch den ersten Schatten. Dies bedeutet, dass er nur in den Textbuchstaben sichtbar ist, wenn der erste Schatten verschoben ist (1 Pixel von links und 2 Pixel von oben). Um die Unschärfe dieses sichtbaren Schattens zu ändern, ändern Sie den Unschärfeparameter für den Schatten der ersten Ebene.

Vorsichtsmaßnahmen

  • Dies funktioniert nur, wenn die gewünschte Farbe des Textes erreicht werden kann, ohne dass die Deckkraft 100% betragen muss.
  • Dies funktioniert nur, wenn die Hintergrundfarbe durchgehend ist (daher funktioniert dies nicht für das spezifische Beispiel des Fragestellers, in dem sich der Text auf einem strukturierten Hintergrund befindet).
Nick Coons
quelle
4

Anscheinend hat jeder eine Antwort auf diese Frage. Ich mag die Lösung von @Web_Designer. Aber es muss nicht so komplex sein und Sie können immer noch den verschwommenen inneren Schatten erhalten, den Sie suchen.

http://dabblet.com/gist/3877605

.depth {
    display: block;
    padding: 50px;
    color: black;
    font: bold 7em Arial, sans-serif;
    position: relative;
 }

.depth:before {
    content: attr(title);
    color: transparent;
    position: absolute;
    text-shadow: 2px 2px 4px rgba(255,255,255,0.3);
}
Nussknacker
quelle
3

Aufbauend auf der :before :afterTechnik von web_designer kommt hier etwas näher an Ihren Look heran:

Stellen Sie Ihren Text zunächst auf die Farbe des inneren Schattens ein (im Fall des OP schwarz).

Verwenden Sie jetzt eine: after pseudo-Klasse, um ein transparentes Duplikat des Originaltextes zu erstellen, das direkt darüber platziert wird. Weisen Sie ihm einen regulären Textschatten ohne Versatz zu. Weisen Sie dem Schatten die ursprüngliche Textfarbe zu und passen Sie das Alpha nach Bedarf an.

http://dabblet.com/gist/2499892

Sie erhalten keine vollständige Kontrolle über die Ausbreitung usw. des Schattens wie in PS, aber für kleinere Unschärfewerte ist dies durchaus passabel. Der Schatten überschreitet die Grenzen des Textes. Wenn Sie also in einer Umgebung mit einem kontrastreichen Hintergrund-Vordergrund arbeiten, ist dies offensichtlich. Bei Gegenständen mit geringerem Kontrast, insbesondere bei Gegenständen mit demselben Farbton, ist dies nicht allzu auffällig. Zum Beispiel konnte ich mit dieser Technik sehr gut aussehenden geätzten Text in Metallhintergründen erstellen.

Harkyman
quelle
3

Hier ist eine großartige Lösung für TRUE-Textschatten mithilfe der CSS3-Eigenschaft für Hintergrundclips:

.insetText {
    background-color: #666666;
    -webkit-background-clip: text;
    -moz-background-clip: text;
    background-clip: text;
    color: transparent;
    text-shadow: rgba(255,255,255,0.5) 0px 3px 3px;
}
Aaron
quelle
Dieser Link scheint jetzt unterbrochen zu sein.
Nick White
Sieht im Webkit gut aus, ist aber für Firefox 18 immer noch ein No-Go.
Gmeben
Dies mag begrenzte Unterstützung haben, aber ich liebe dieses, da es wirklich eingesetzt ist.
Julian K
2

Folgendes habe ich mir ausgedacht, nachdem ich mir einige der Ideen hier angesehen habe. Die Hauptidee ist, dass die Farbe des Textes mit beiden Schatten verschmilzt. Beachten Sie, dass dies auf einem grauen Hintergrund verwendet wird (andernfalls wird das Weiß nicht gut angezeigt).

.inset {
    color: rgba(0,0,0, 0.6);
    text-shadow: 1px 1px 1px #fff, 0 0 1px rgba(0,0,0,0.6);
}
Nick White
quelle
1

Versuchen Sie dieses Beispiel für eingefügten Textschatten. Hier ist der HTML-Code

<h1 class="inset-text-shadow">Inset text shadow trick</h1>

und das CSS

body {
    background: #f8f8f8;
}
h1 {
    font-family: Helvetica, Arial, sans-serif;
    font-weight: bold;
    font-size: 6em;
    line-height: 1em;
}
.inset-text-shadow {
    /* Shadows are visible under slightly transparent text color */
    color: rgba(0,0,0,0.6);
    text-shadow: 2px 8px 6px rgba(0,0,0,0.2), 0px -5px 35px rgba(255,255,255,0.3);

}

Demo on Jsfiddle

Prakash Upadhyay
quelle
0
text-shadow: 4px 4px 2px rgba(150, 150, 150, 1);

für Kastenschatten:

-webkit-box-shadow: 7px 7px 5px rgba(50, 50, 50, 0.75);
-moz-box-shadow:    7px 7px 5px rgba(50, 50, 50, 0.75);
box-shadow:         7px 7px 5px rgba(50, 50, 50, 0.75);

Sie können Online-Text und Box-Schatten sehen: Online-Text und Box-Schatten

Für mehr Beispiele können Sie zu dieser Adresse gehen: mehr Beispielcode freeclup

MAG TOR
quelle
0

Es gibt einen viel einfacheren Weg, dies zu erreichen

.inner{color: red; text-shadow: 0 -1px 0 #666;} // #666 is the color of the inner shadow

Voilà

Warface
quelle
0

Für normal großen Text auf kleinen Schaltflächen

Ich habe festgestellt, dass die anderen Ideen auf dieser Seite ihre Wirksamkeit verlieren, wenn sie auf kleinen Schaltflächen mit kleiner Textbeschriftung verwendet werden. Diese Antwort erweitert die Antwort von RobertPitt .

Hier ist die kleine Änderung:

text-shadow: 1px 1px transparent, -1px -1px black;

Hinweis:

Ich habe diese Seite benutzt, um die Farbtöne zu verfeinern.

Cssyphus
quelle
-1

Ich benutze es von dieser Seite, auch es sieht gut aus. Schau es dir an Innerer Schatten

vkGunasekaran
quelle
1
Die Person, die dies abgelehnt hat, kann sagen, wie dies für eine Ablehnung in Frage kommt. Wenn diese Antwort von der Frage abweicht? oder du denkst, ich bin ein Spammer. Wenn du erklären kannst, kann ich meine Antwort hier aktualisieren
vkGunasekaran
+1 Gleiche Antwort wie Web_Designer, aber besser erklärt. Vielleicht hat es dem Downvoter nicht gefallen, dass Ihre Antwort im Grunde die gleiche war wie eine früher veröffentlichte Antwort. Aber los geht's. Ich habe es nur für dich entschädigt :)
Jules Colle
2
Nur herabgestimmt. Dies ist nicht nur ein Duplikat, es erklärt auch nicht das Problem oder gibt keine Ausschnitte, es ist nur ein Link. Es zeigt meiner Meinung nach minimalen Aufwand des Autors. IMHO und FTR.
Alba Mendez