Sombra de texto interna com CSS

107

No momento, estou brincando com CSS3 e tentando obter um efeito de texto como este (a sombra interna preta borrada):

Mas não consigo encontrar uma maneira de criar sombras de texto dentro do texto. Eu me pergunto se isso ainda é possível porque o elemento de sombra de caixa é capaz de renderizar a sombra interna assim:

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

Alguma ideia?

Ericteubert
fonte
3
Não há resposta para isso se você não estiver preparado para algumas ilusões de ótica ...
Aaria Carter-Weir

Respostas:

105

Aqui vai um pequeno truque que eu descobri usando o :beforee :afterpseudo-elementos:

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

O atributo title deve ser igual ao conteúdo. Demo: http://dabblet.com/gist/1609945

Web designer
fonte
1
Agradável! Creative :) Ainda não tão Photoshop como eu gostaria que fosse. Você pode definir os valores superior / esquerdo para 5px cada para obter um deslocamento de sombra interna de 5px, mas a letra vaza na outra extremidade - o que parece ótimo para 1px e 2px, mas estranho para valores mais altos.
ericteubert
1
Sim, só fica bem com um leve toque de branco na parte inferior. Mais de 2px destrói o visual.
Web_Designer
1
Impressionante! Você pode usar isso para fazer texto em branco também aumentando a opacidade para 0,9, ou criar bordas chanfradas mantendo a opacidade em 0,1 e invertendo as cores. (+1)
JohnB
Ótima solução. No entanto, falha em combinação com gradientes de texto fe; (que pena. Acho que teremos que esperar pelo CSS4 por alguns anos ou mais para obter grandes efeitos de texto.
Michael Trouw
Isso é legal no Chrome, estou lutando para fazer um fallback alternativo para FF, que não se aplique ao Chrome sem usar JS e uma classe de namespace. Alguma ideia. PS Funciona lindamente em um BG de efeito leathr, parece um selo de marca.
Will Hancock
43

Você deve ser capaz de fazer isso usando a sombra de texto, erm algo assim:

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

aqui está um exemplo: http://jsfiddle.net/ekDNq/

RobertPitt
fonte
8
Hum, sim, mais ou menos. O efeito visual é semelhante com esses parâmetros, mas ainda é uma sombra atrás da fonte. Não dentro. No meu exemplo, eu até desfoquei a sombra inserida e isso destruiria o efeito aqui. Então ... melhor solução ainda, mas ainda apenas um hack de ilusão visual;)
ericteubert
2
Observe que você está tornando a fonte mais gorda ao fazer isso. Para fontes de tamanho pequeno e médio, isso pode não ser o que você deseja.
Jonatan Littke
20

Aqui está minha melhor tentativa:

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

O problema é como recortar a sombra que vaza nas bordas !!! Tentei no webkit usando background-clip: text, mas o webkit renderiza a sombra acima do fundo, então não funciona.

Fazendo uma máscara de texto com CSS?

Sem uma camada de máscara superior, é impossível fazer uma sombra interna verdadeira no texto.

Talvez alguém deva recomendar que o W3C adicione background-clip: reverse-text , que cortaria uma máscara através do fundo em vez de cortar o fundo para caber dentro do texto.

Faça isso ou renderize a sombra do texto como parte do fundo e recorte-a com background-clip: text.

Tentei posicionar absolutamente um elemento de texto idêntico acima dele, mas o problema é o background-clip: o texto corta o fundo para caber dentro do texto, mas precisamos do inverso disso.

Tentei usar o traço de texto: 20px branco; neste elemento e no acima dele, mas o traço de texto entra e sai.

Métodos Alternativos

Como atualmente não há como fazer uma máscara de texto invertido em CSS, você pode usar SVG ou Canvas e fazer uma imagem de substituição de texto com as três camadas para obter o efeito.

Como o SVG é um subconjunto do XML, o texto SVG ainda seria selecionável e pesquisável, e o efeito pode ser produzido com menos código do que o Canvas.

Seria mais difícil conseguir isso com o Canvas porque ele não tem um dom com camadas como o SVG.

Você pode produzir o SVG no lado do servidor ou como um método de substituição de texto javascript no navegador.

Leitura adicional:

SVG versus Canvas:

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

Recorte e máscara com texto SVG:

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

kendo451
fonte
2
Publiquei uma explicação mais detalhada sobre sua melhor tentativa, com um exemplo. Confira!
Alba Mendez
1
Exemplo disso levado ao extremo .
Alba Mendez
Há uma sombra externa em seu exemplo
AlexKh
12

Explicação mais precisa do CSS na resposta de kendo451 .

Há outra maneira de obter uma ilusão de sombra interna sofisticada,
que explicarei em três etapas simples. Digamos que temos este HTML:

<h1>Get this</h1>

e este CSS:

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

É um bom slogan

Passo 1

Vamos começar tornando o texto transparente:

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

É uma caixa

Passo 2

Agora, recortamos esse fundo para a forma do texto:

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

O fundo é o texto!

etapa 3

Agora, a mágica: vamos colocar um borrado text-shadow, que ficará na frente do fundo , dando assim a impressão de uma sombra interna!

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

Conseguimos!  Yay!

Veja o resultado final .

Desvantagens?

  • Só funciona no Webkit ( background-clipnão pode sertext ).
  • Várias sombras? Nem pense.
  • Você obtém um brilho externo também.
Alba Mendez
fonte
"Múltiplas sombras? Nem pense." Sobre o quê text-shadow: 1px 1px 1px #000, 3px 3px 5px blue;?
Morpheus
@Morpheus Uma das desvantagens desse método é que você não pode aplicar várias sombras ao texto.
Alba Mendez
O tamanho e o brilho deste exemplo estão dificultando a visualização de outras pessoas. Você poderia mover isso para trechos de código? Obrigado!
Josh Habdas
12

Um exemplo elegante sem a necessidade de um wrapper posicionado ou conteúdo duplicado na marcação:

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

Também fica bem em fundos escuros:

: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

Zombyii
fonte
Simples e não requer ajustes de marcação. Ótimo trabalho!
Josh Habdas
10

Você pode fazer isso. Infelizmente não há como usar uma inserção na sombra do texto, mas você pode fingir com cor e posição. Retire o desfoque e organize a sombra no canto superior direito. Algo assim pode resolver o problema:

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

... mas você precisa ter muito, muito cuidado com as cores que usa, caso contrário, ficará estranho. É essencialmente uma ilusão de ótica, então não funcionará em todos os contextos. Ele também não fica bem em tamanhos de fonte menores, portanto, esteja ciente disso.

Hollsk
fonte
Não é realmente o que estou procurando. O efeito da sua proposta é interessante, mas está longe do exemplo que postei.
ericteubert
Então, nesse caso, não há resposta, não com CSS3. Desculpe, não pude ajudar.
Hollsk
Sombras inseridas são possíveis usando background-clipcomo mostrado nesta resposta .
Josh Habdas
10

Não há necessidade de múltiplas sombras ou algo sofisticado assim, você apenas tem que deslocar sua sombra no eixo y negativo.

Para texto escuro em um fundo claro:

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

Se você tiver um fundo escuro, pode simplesmente inverter a cor e a posição y:

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

Brinque com os valores rgba, a opacidade e o desfoque para obter o efeito certo. Dependerá muito da cor da fonte e do fundo que você tem, e quanto mais pesada a fonte, melhor.

Dylan
fonte
3
Ainda apenas uma ilusão de ótica, nenhuma sombra interna real.
ericteubert
25
... não são todas as sombras uma ilusão de ótica?
Charlie Schliesser
você está mal-humorado @eteubert ... realmente significa
Jamie Hutber
7

Experimente esta pequena joia de variação:

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

Eu normalmente considero "não há resposta" como um desafio

Mike
fonte
1
Isso cria um contorno branco na parte inferior da fonte, mas eu estava procurando uma sombra interna preta borrada .
ericteubert
1
Isso funcionou melhor para mim, especialmente ao sombrear textos menores. Eu sugiro ajustar os valores RGB um pouco, se necessário, para obter a aparência certa com a cor da fonte.
Cory Schires
6

Eu vi muitas das soluções propostas, mas nenhuma foi exatamente o que eu esperava.

Aqui está meu melhor hack nisso , onde a cor é transparente, o fundo e a sombra do texto superior são da mesma cor com opacidades variadas, simulando a máscara, e a segunda sombra do texto é uma versão mais escura e mais saturada da cor que você realmente deseja (muito fácil de fazer com HSLA).

insira a descrição da imagem aqui

(aliás, texto e estilo com base no OP de um thread duplicado )

Esjay
fonte
6

Tive alguns casos em que precisei de sombras internas no texto, e o seguinte funcionou bem para mim:

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

Isso define a opacidade do texto para 80% e, em seguida, cria duas sombras:

  • A primeira é uma sombra branca (presumindo que o texto esteja em um fundo branco) deslocada 1px da esquerda e 2px do topo, desfocada 3px.
  • A segunda é uma sombra preta que é visível através do texto com 80% de opacidade, mas não através da primeira sombra, o que significa que ela é visível dentro das letras do texto apenas onde a primeira sombra é deslocada (1px da esquerda e 2px do topo). Para alterar o desfoque dessa sombra visível, modifique o parâmetro de desfoque para a sombra da primeira camada.

Ressalvas

  • Isso só funcionará se a cor desejada para o texto puder ser obtida sem que seja necessário ter 100% de opacidade.
  • Isso só funcionará se a cor de fundo for sólida (portanto, não funcionará para o exemplo específico do questionador em que o texto fica em um fundo texturizado).
Nick Coons
fonte
4

Parece que todo mundo tem uma resposta para essa. Gosto da solução do @Web_Designer. Mas não precisa ser tão complexo assim e você ainda pode obter a sombra interna embaçada que está procurando.

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);
}
quebra-nozes
fonte
3

Com base na :before :aftertécnica de web_designer, aqui está algo que se aproxima do seu visual:

Primeiro, faça seu texto da cor da sombra interna (preto no caso do OP).

Agora, use uma classe: after psuedo para criar uma duplicata transparente do texto original, colocada diretamente sobre ele. Atribua uma sombra de texto normal a ele sem deslocamento. Atribua a cor do texto original à sombra e ajuste o alfa conforme necessário.

http://dabblet.com/gist/2499892

Você não obtém controle total sobre a propagação, etc. da sombra como no PS, mas para valores de desfoque menores é bastante aceitável. A sombra ultrapassa os limites do texto, portanto, se você estiver trabalhando em um ambiente com um fundo-primeiro plano de alto contraste, isso será óbvio. Para itens de menor contraste, especialmente aqueles com o mesmo matiz, não é muito perceptível. Por exemplo, eu fui capaz de fazer um texto gravado de aparência muito agradável em fundos de metal usando esta técnica.

harkyman
fonte
3

Esta é uma ótima solução para TRUE inset text shadow usando a propriedade background-clip CSS3:

.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
fonte
Esse link parece estar quebrado agora.
Nick White
Parece bom no webkit, mas ainda não funciona para o Firefox 18.
gmeben
Isso pode ter suporte limitado, mas eu adoro este, pois é realmente inserido.
Julian K de
2

Aqui está o que eu vim depois de examinar algumas das ideias aqui. A ideia principal é que a cor do texto se misture com as duas sombras, e observe que isso está sendo usado em um fundo cinza (caso contrário, o branco não aparecerá bem).

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

Experimente este exemplo para sombra de texto inserido. Aqui está o HTML

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

e o 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
fonte
0
text-shadow: 4px 4px 2px rgba(150, 150, 150, 1);

para sombra da caixa:

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

você pode ver o texto online e a sombra da caixa: texto online e a sombra da caixa

para mais exemplos, você pode ir para este endereço: mais exemplos de código freeclup

MAG TOR
fonte
0

Há uma maneira muito mais simples de conseguir isso

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

Voilà

Warface
fonte
0

Para texto de tamanho normal em botões pequenos

Descobri que as outras ideias nesta página perdem a eficácia quando usadas em pequenos botões com letras de texto pequenas. Essa resposta amplia a resposta de RobertPitt .

Aqui está o pequeno ajuste:

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

Nota:

Usei este site para refinar os tons de cores.

cssifo
fonte
-1

Estou usando deste site, também parece bom. Dê uma olhada nisso Sombra interna

vkGunasekaran
fonte
1
A pessoa que votou contra isso pode dizer como isso é elegível para voto negativo. Se esta resposta se desviou da pergunta? ou você acha que sou um spammer ... se você puder explicar, posso atualizar minha resposta aqui
vkGunasekaran
+1 Mesma resposta que Web_Designer, mas melhor explicada. Talvez o downvoter não tenha gostado do fato de sua resposta ser basicamente a mesma que uma resposta postada anteriormente. Mas aqui está. Acabei de compensar para você :)
Jules Colle
2
Acabei de votar. Isso não é apenas uma duplicata, mas também não explica o problema, nem fornece trechos, é apenas um link. Mostra um esforço mínimo do autor, na minha opinião. IMHO e FTR.
Alba Mendez