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?


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


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/


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


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.

"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


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.


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.


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


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 )


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



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


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.


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

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

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


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


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à


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.


-1

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.