Ombreggiatura interna del testo con CSS


107

Attualmente sto giocando con CSS3 e sto cercando di ottenere un effetto di testo come questo (l'ombra interna sfocata nera):

Ma non riesco a trovare un modo per creare ombre di testo all'interno del testo. Mi chiedo se sia ancora possibile perché l'elemento box-shadow è in grado di rendere l'ombra all'interno in questo modo:

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

Qualche idea?


3
Nessuna risposta per questo se non sei preparato per alcune illusioni ottiche ...
Aaria Carter-Weir

Risposte:


105

Ecco un piccolo trucco che ho scoperto utilizzando la :beforee :afterpseudo-elementi:

.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 }

L'attributo del titolo deve essere lo stesso del contenuto. Demo: http://dabblet.com/gist/1609945


1
Bello! Creativo :) Ancora non come Photoshop come vorrei che fosse. Puoi impostare i valori in alto / a sinistra su 5px ciascuno per ottenere un offset dell'ombra interna di 5px, ma poi la lettera fuoriesce dall'altra parte, il che sembra ottimo per 1px e 2px ma strano per valori più alti.
ericteubert

1
Sì, sembra buono solo con un leggero accenno di bianco sul fondo. Qualsiasi più di 2px distrugge l'aspetto.
Web_Designer

1
Eccezionale! Puoi usarlo anche per fare il testo bianco aumentando l'opacità a .9, o creare bordi smussati mantenendo l'opacità a .1 e invertendo i colori. (+1)
JohnB

Ottima soluzione. Tuttavia, non riesce in combinazione con i gradienti di testo fe; (peccato. Immagino che dovremo aspettare CSS4 per alcuni anni circa per ottenere grandi effetti di testo.
Michael Trouw

È bello in Chrome, sto lottando per fare un fallback alternativo per FF, che non si applicherà a Chrome senza usare JS e una classe dello spazio dei nomi. Qualche idea. PS Funziona magnificamente su un bg effetto pelle, sembra un timbro di marca.
Will Hancock

43

Dovresti essere in grado di farlo usando l'ombra del testo, forse qualcosa del genere:

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

ecco un esempio: http://jsfiddle.net/ekDNq/


8
Hum, sì, più o meno. L'effetto visivo è simile con questi parametri, ma è ancora un'ombra dietro il carattere. Non dentro. Nel mio esempio ho persino sfocato l'ombra inserita e questo distruggerebbe l'effetto qui. Quindi ... la migliore soluzione ancora, ma ancora solo un trucco di illusione visiva;)
ericteubert

2
Nota che stai rendendo il carattere più grasso in questo modo. Per i caratteri di piccole e medie dimensioni, potrebbe non essere quello che vuoi.
Jonatan Littke

20

Ecco il mio miglior tentativo:

    .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>
   

Il problema è come ritagliare l'ombra che sanguina attorno ai bordi !!! Ho provato in webkit usando background-clip: text, ma webkit rende l'ombra sopra lo sfondo in modo che non funzioni.

Creare una maschera di testo con CSS?

Senza un livello maschera superiore è impossibile creare una vera ombra interna sul testo.

Forse qualcuno dovrebbe raccomandare al W3C di aggiungere un clip di sfondo: testo inverso , che taglierebbe una maschera attraverso lo sfondo invece di tagliare lo sfondo per adattarlo al testo.

O quello o renderizza l'ombra del testo come parte dello sfondo e ritagliala con background-clip: text.

Ho provato a posizionare assolutamente un elemento di testo identico sopra di esso, ma il problema è il clip di sfondo: il testo ritaglia lo sfondo per adattarlo al testo, ma abbiamo bisogno del contrario.

Ho provato a usare il tratto di testo: 20px bianco; sia su questo elemento che su quello sopra di esso, ma il tratto di testo va dentro e fuori.

Metodi alternativi

Poiché attualmente non è possibile creare una maschera di testo invertito in CSS, è possibile passare a SVG o Canvas e creare un'immagine di sostituzione del testo con i tre livelli per ottenere il proprio effetto.

Poiché SVG è un sottoinsieme di XML, il testo SVG sarebbe comunque selezionabile e ricercabile e l'effetto può essere prodotto con meno codice di Canvas.

Sarebbe più difficile ottenere questo risultato con Canvas perché non ha un dominio con livelli come SVG.

È possibile produrre SVG sul lato server o come metodo di sostituzione del testo javascript nel browser.

Ulteriori letture:

SVG contro Canvas:

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

Ritaglio e mascheratura con testo SVG:

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


2
Ho pubblicato una spiegazione più dettagliata del tuo miglior tentativo, con un esempio. Controlla!
Alba Mendez

1
Esempio di questo portato all'estremo .
Alba Mendez

C'è un'ombra esterna nel tuo esempio
AlexKh il

12

Spiegazione più precisa del CSS nella risposta di kendo451 .

C'è un altro modo per ottenere un'illusione dell'ombra interiore stravagante,
che spiegherò in tre semplici passaggi. Supponiamo di avere questo HTML:

<h1>Get this</h1>

e questo CSS:

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

È un buon slogan

Passo 1

Cominciamo rendendo il testo trasparente:

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

È una scatola

Passo 2

Ora, ritagliamo lo sfondo in base alla forma del testo:

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

Lo sfondo è il testo!

Passaggio 3

Ora, la magia: metteremo uno sfocato text-shadow, che sarà davanti allo sfondo , dando così l'impressione di un'ombra interiore!

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

Abbiamo capito!  Sìì!

Guarda il risultato finale .

Lati negativi?

  • Funziona solo in Webkit ( background-clipnon può essere text).
  • Ombre multiple? Non pensare nemmeno.
  • Ottieni anche un bagliore esterno.

"Ombre multiple? Non pensarci nemmeno." Di cosa text-shadow: 1px 1px 1px #000, 3px 3px 5px blue;?
Morpheus il

@ Morfeo Uno degli svantaggi di questo metodo è che non puoi applicare più ombre al testo.
Alba Mendez

Le dimensioni e la luminosità di questo esempio rendono difficile la visualizzazione degli altri. Potresti forse spostarli in frammenti di codice? Grazie!
Josh Habdas

12

Un esempio elegante senza la necessità di un wrapper posizionato o di contenuti duplicati nel markup:

: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>

Sembra buono anche su sfondi scuri:

: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>

AND ME LINK E ME2 LINK


Semplice e non richiede modifiche al markup. Ottimo lavoro!
Josh Habdas

10

Puoi farlo in un certo senso. Sfortunatamente non c'è modo di usare un riquadro sull'ombra del testo, ma puoi simularlo con il colore e la posizione. Prendi la sfocatura verso il basso e disponi l'ombra in alto a destra. Qualcosa di simile potrebbe fare il trucco:

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

... ma dovrai stare davvero molto attento ai colori che usi altrimenti sembrerà fuori posto. È essenzialmente un'illusione ottica, quindi non funzionerà in ogni contesto. Inoltre, non ha un bell'aspetto con caratteri di dimensioni inferiori, quindi tieni presente anche questo.


Non è proprio quello che sto cercando. L'effetto della tua proposta è interessante ma lontano dall'esempio che ho postato.
ericteubert

Allora in quel caso non c'è risposta, non con CSS3. Scusa non ho potuto aiutare.
hollsk

Le ombre all'interno sono possibili usando background-clipcome mostrato in questa risposta .
Josh Habdas

10

Non c'è bisogno di più ombre o qualcosa di simile, devi solo sfalsare l'ombra sull'asse y negativo.

Per testo scuro su sfondo chiaro:

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

Se hai uno sfondo scuro, puoi semplicemente invertire il colore e la posizione y:

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

Gioca con i valori rgba, l'opacità e la sfocatura per ottenere l'effetto giusto. Dipenderà molto dal colore del carattere e dello sfondo che hai, e più pesante è il carattere, meglio è.


3
Ancora solo un'illusione ottica, nessuna vera ombra interiore.
ericteubert

25
... non sono tutte le ombre un'illusione ottica?
Charlie Schliesser

sei scontroso @eteubert ... davvero cattivo
Jamie Hutber

7

Prova questo piccolo gioiello di una variazione:

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

Di solito prendo "non c'è risposta" come una sfida


1
Questo crea un contorno bianco nella parte inferiore del carattere ma stavo cercando un'ombra interna sfocata nera .
ericteubert

1
Questo ha funzionato meglio per me, specialmente quando ombreggiavo testo più piccolo. Suggerisco di modificare un po 'i valori RGB, se necessario, per farlo sembrare corretto con il colore del carattere.
Cory Schires

6

Ho visto molte delle soluzioni proposte, ma nessuna era esattamente quello che speravo.

Ecco il mio miglior trucco in questo , dove il colore è trasparente, lo sfondo e l'ombra del testo superiore sono dello stesso colore con diverse opacità, simulando la maschera, e la seconda ombra del testo è una versione più scura e più satura del colore che tu effettivamente desidera (abbastanza facile da fare con HSLA).

inserisci qui la descrizione dell'immagine

(btw, testo e stile basati sull'OP di un thread duplicato )


6

Ho avuto alcuni casi in cui avevo bisogno di ombre interne sul testo e quanto segue ha funzionato bene per me:

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

Questo imposta l'opacità del testo all'80%, quindi crea due ombre:

  • La prima è un'ombra bianca (supponendo che il testo sia su uno sfondo bianco) sfalsata di 1px da sinistra e 2px dall'alto, sfocata di 3px.
  • La seconda è un'ombra nera che è visibile attraverso l'80% di opacità del testo ma non attraverso la prima ombra, il che significa che è visibile all'interno delle lettere di testo solo dove la prima ombra è spostata (1px da sinistra e 2px dall'alto). Per cambiare la sfocatura di questa ombra visibile, modifica il parametro di sfocatura per l'ombra del primo livello.

Avvertenze

  • Questo funzionerà solo se il colore desiderato del testo può essere ottenuto senza che debba essere al 100% di opacità.
  • Funzionerà solo se il colore di sfondo è solido (quindi, non funzionerà per l'esempio specifico dell'interrogante in cui il testo si trova su uno sfondo con texture).



4

Sembra che tutti abbiano una risposta a questo. Mi piace la soluzione di @Web_Designer. Ma non è necessario che sia così complesso e puoi comunque ottenere l'ombra interna sfocata che stai cercando.

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);
}


3

Basandosi sulla :before :aftertecnica di web_designer, ecco qualcosa che si avvicina al tuo look:

Per prima cosa, rendi il tuo testo il colore dell'ombra interna (nero nel caso dell'OP).

Ora, usa una classe: after psuedo per creare un duplicato trasparente del testo originale, posizionato direttamente sopra di esso. Assegna un'ombreggiatura di testo regolare senza offset. Assegna il colore del testo originale all'ombra e regola l'alfa secondo necessità.

http://dabblet.com/gist/2499892

Non hai il controllo completo sulla diffusione, ecc. Dell'ombra come fai in PS, ma per valori di sfocatura più piccoli è abbastanza passabile. L'ombra supera i limiti del testo, quindi se stai lavorando in un ambiente con uno sfondo in primo piano ad alto contrasto, sarà ovvio. Per gli elementi con un contrasto inferiore, specialmente quelli con la stessa tonalità, non è troppo evidente. Ad esempio, sono stato in grado di creare un testo inciso dall'aspetto molto carino su sfondi metallici utilizzando questa tecnica.


3

Ecco un'ottima soluzione per l'ombreggiatura del testo inserto TRUE utilizzando la proprietà CSS3 della clip di sfondo:

.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;
}

Quel collegamento sembra essere interrotto ora.
Nick White

Sembra carino in webkit, ma ancora un no-go per Firefox 18.
gmeben

Questo potrebbe avere un supporto limitato, ma lo adoro perché è davvero inserito.
Julian K

2

Ecco cosa mi è venuto in mente dopo aver esaminato alcune delle idee qui. L'idea principale è che il colore del testo si fonde con entrambe le ombre e nota che questo viene utilizzato su uno sfondo grigio (altrimenti il ​​bianco non verrà visualizzato bene).

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

1

Prova questo esempio per l'ombreggiatura del testo inserito. Ecco l' HTML

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

e il 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


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

per box shadow:

-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);

puoi vedere il testo in linea e l'ombra del riquadro: testo in linea e l'ombra del riquadro

per altro esempio puoi andare a questo indirizzo: altro esempio codice freeclup


0

C'è un modo molto più semplice per ottenere questo risultato

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

Ecco


0

Per testo di dimensioni normali su pulsanti piccoli

Ho scoperto che le altre idee in questa pagina perdono la loro efficacia se utilizzate su piccoli pulsanti con caratteri di testo piccoli. Questa risposta si espande sulla risposta di RobertPitt .

Ecco il piccolo aggiustamento:

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

Nota:

Ho usato questo sito per rifinire le sfumature di colore.


-1

Lo sto usando da questo sito, inoltre sembra buono. Dai un'occhiata all'ombra interiore


1
La persona che ha votato negativamente, può dire come questo è idoneo per essere votato. Se questa risposta deviava dalla domanda? o pensi che sia uno spammer .. se puoi spiegare posso aggiornare la mia risposta qui
vkGunasekaran

+1 Stessa risposta di Web_Designer ma spiegata meglio. Forse al downvoter non piaceva il fatto che la tua risposta fosse fondamentalmente la stessa di una risposta pubblicata prima. Ma eccoti qui. Ti ho appena risarcito :)
Jules Colle

2
Ho appena downvoted. Non solo questo è un duplicato, ma non spiega il problema, né fornisce alcun frammento, è solo un collegamento. Mostra il minimo sforzo da parte dell'autore, a mio parere. IMHO e FTR.
Alba Mendez
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.