Borda da fonte CSS?

491

Com todo o novo material de borda CSS3 em andamento ( -webkit, ...) agora é possível adicionar uma borda à sua fonte? (Como a borda branca sólida ao redor do logotipo azul do Twitter). Caso contrário, existem hacks não muito feios que conseguirão isso em CSS / XHTML ou ainda preciso iniciar o Photoshop?

Lars Tackmann
fonte

Respostas:

1004

Existe uma propriedade CSS experimental chamada curso de texto , suportada em alguns navegadores por trás de um prefixo -webkit .

h1 {
    -webkit-text-stroke: 2px black; /* width and color */

    font-family: sans; color: yellow;
}
<h1>Hello World</h1>

Outro truque possível seria usar quatro sombras, um pixel cada em todas as direções, usando a propriedade text-shadow:

h1 {
    /* 1 pixel black shadow to left, top, right and bottom */
    text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black;

    font-family: sans; color: yellow;
}
<h1>Hello World</h1>

Mas ficaria borrado por mais de 1 pixel de espessura.

Narcélio Filho
fonte
4
Isso funcionou para mim pefrectly, eu adicionado apenas 1px "blur": text-shadow: -1px 0 1px preto, 0 1px 1px preto, 1px 0 1px preto, 0 -1px 1px preto
Jakub M.
84
ótimo se você só precisa de uma borda de 1px. Mas fica feio ao usar 2px ou mais.
Jules Colle
2
Nota: existe um erro no navegador Andriod ( code.google.com/p/android/issues/detail?id=7531 ), se você definir o "desfoque" como 0px, nenhum contorno será exibido.
Mark Rhodes
1
btw, você pode encontrar esse código em W3C página ponta CSS w3.org/Style/Examples/007/text-shadow.en.html (em DRAWING LETTERS AS OUTLINESparte)
luiges90
Descobri isso funciona melhor em um fundo cor e resposta da @ pixelass funciona melhor com um background image
SemanticZen
151

ATUALIZAR

Aqui está um SCSS mixin para gerar o acidente vascular cerebral: http://codepen.io/pixelass/pen/gbGZYL

/// Stroke font-character
/// @param  {Integer} $stroke - Stroke width
/// @param  {Color}   $color  - Stroke color
/// @return {List}            - text-shadow list
@function stroke($stroke, $color) {
  $shadow: ();
  $from: $stroke*-1;
  @for $i from $from through $stroke {
   @for $j from $from through $stroke {
      $shadow: append($shadow, $i*1px $j*1px 0 $color, comma);
    }
  }
  @return $shadow;
}
/// Stroke font-character
/// @param  {Integer} $stroke - Stroke width
/// @param  {Color}   $color  - Stroke color
/// @return {Style}           - text-shadow
@mixin stroke($stroke, $color) {
  text-shadow: stroke($stroke, $color);
}

insira a descrição da imagem aqui

SIM pergunta antiga .. com respostas aceitas (e boas) ..

MAS ... Caso alguém precise disso e odeie digitar código ...

ESTA é uma borda preta de 2px com suporte ao CrossBrowser (não o IE). Eu precisava disso para fontes @fontface, por isso precisava ser mais limpa do que as respostas vistas anteriormente ... fontes difusas "(desenhadas à mão ou semelhantes). Subpixels (0,5px) podem ser adicionados, mas não preciso.

Código longo para apenas a borda ??? ...SIM!!!

text-shadow: 1px 1px 0 #000,
    -1px 1px 0 #000,
    1px -1px 0 #000,
    -1px -1px 0 #000,
    0px 1px 0 #000,
    0px -1px 0 #000,
    -1px 0px 0 #000,
    1px 0px 0 #000,
    2px 2px 0 #000,
    -2px 2px 0 #000,
    2px -2px 0 #000,
    -2px -2px 0 #000,
    0px 2px 0 #000,
    0px -2px 0 #000,
    -2px 0px 0 #000,
    2px 0px 0 #000,
    1px 2px 0 #000,
    -1px 2px 0 #000,
    1px -2px 0 #000,
    -1px -2px 0 #000,
    2px 1px 0 #000,
    -2px 1px 0 #000,
    2px -1px 0 #000,
    -2px -1px 0 #000;

fonte
atualizou o código devido a uma duplicata de 0 2px 0 # 000 e seus elementos - / +. O desfoque (0 antes de # 000) pode ser removido, mas eu o mantenho mesmo que seja 0. Devo observar também que é recomendável ter uma versão CSS reduzida ou compactada do seu código nos sites de produção e manter uma versão descompacta comentada para edição. O código acima é um bom exemplo do motivo pelo qual um código CSS deve ser minificado, mas precisa ser separado linha por linha para edição.
Eu brinquei com a propriedade '-webkit-text-stroke' (principalmente para tornar as fontes mais agradáveis ​​nas janelas UGLY UGLY). No entanto, isso tornou os tempos de carregamento muito longos e até travou meu site (mac Chrome 16). Então eu o removi mais rápido do que a página poderia carregar. Eu acho que isso é destinado apenas para linhas únicas de fontes. (Eu estava usando-o para 'body')
1
Você já fez algum benchmarking de desempenho com isso? Encontrei sombra de texto para atolar a página ao rolar, por exemplo
Chris Bosco
1
Encontrei este melhores trabalhos sobre um fundo da imagem e @ resposta de Narcélio Filho funciona melhor com um fundo cor
SemanticZen
1
o codepen original "desapareceu", então criei um novo com o código original deste post e também fiz uma comparação das outras soluções mencionadas aqui codepen.io/Grienauer/pen/GRRdRJr
Grienauer
51

Talvez você possa emular um traço de texto usando o css text-shadow(ou -webkit-text-shadow/ -moz-text-shadow) e um desfoque muito baixo:

#element
{
  text-shadow: 0 0 2px #000; /* horizontal-offset vertical-offset 'blur' colour */
  -moz-text-shadow: 0 0 2px #000;
  -webkit-text-shadow: 0 0 2px #000;
}

Porém, embora isso esteja mais disponível do que a -webkit-text-strokepropriedade, duvido que esteja disponível para a maioria dos usuários, mas isso pode não ser um problema (degradação normal e tudo isso).

David diz para restabelecer Monica
fonte
3
Deve-se notar que é possível omitir totalmente o terceiro argumento para não haver desfoque.
François Feugeas
23

Para elaborar mais algumas respostas que mencionaram -webkit-text-stroke, eis o código para fazê-lo funcionar:

div {
  -webkit-text-fill-color: black;
  -webkit-text-stroke-color: red;
  -webkit-text-stroke-width: 2.00px; 
}

Um artigo detalhado sobre o uso de traçado de texto está aqui e uma lista de navegadores que oferecem suporte a traçado de texto está aqui .

Ugtemlhrshrwzf
fonte
11

Aqui está o que estou usando:

.text_with_1px_border
{
    text-shadow: 
        -1px -1px 0px #000,
         0px -1px 0px #000,
         1px -1px 0px #000,
        -1px  0px 0px #000,
         1px  0px 0px #000,
        -1px  1px 0px #000,
         0px  1px 0px #000,
         1px  1px 0px #000;
}

.text_with_2px_border
{
    text-shadow: 
        /* first layer at 1px */
        -1px -1px 0px #000,
         0px -1px 0px #000,
         1px -1px 0px #000,
        -1px  0px 0px #000,
         1px  0px 0px #000,
        -1px  1px 0px #000,
         0px  1px 0px #000,
         1px  1px 0px #000,
        /* second layer at 2px */
        -2px -2px 0px #000,
        -1px -2px 0px #000,
         0px -2px 0px #000,
         1px -2px 0px #000,
         2px -2px 0px #000,
         2px -1px 0px #000,
         2px  0px 0px #000,
         2px  1px 0px #000,
         2px  2px 0px #000,
         1px  2px 0px #000,
         0px  2px 0px #000,
        -1px  2px 0px #000,
        -2px  2px 0px #000,
        -2px  1px 0px #000,
        -2px  0px 0px #000,
        -2px -1px 0px #000;
}
rAthus
fonte
2

Caractere de fonte do traçado com um mixin Menos

Aqui está um mixin MENOS para gerar o AVC: http://codepen.io/anon/pen/BNYGBy?editors=110

/// Stroke font-character
/// @param  {Integer} $stroke - Stroke width
/// @param  {Color}   $color  - Stroke color
/// @return {List}            - text-shadow list
.stroke(@stroke, @color) {
  @maxi: @stroke + 1;
  .i-loop (@i) when (@i > 0) {
    @maxj: @stroke + 1;
    .j-loop (@j) when (@j > 0) {
      text-shadow+: (@i - 1)*(1px)  (@j - 1)*(1px) 0 @color;
      text-shadow+: (@i - 1)*(1px)  (@j - 1)*(-1px) 0 @color;
      text-shadow+: (@i - 1)*(-1px)  (@j - 1)*(-1px) 0 @color;
      text-shadow+: (@i - 1)*(-1px)  (@j - 1)*(1px) 0 @color;
      .j-loop(@j - 1);
    }
    .j-loop (0) {}
    .j-loop(@maxj);
    .i-loop(@i - 1);
  }
  .i-loop (0) {}
  .i-loop(@maxi);
  text-shadow+: 0 0 0 @color;
}

(é baseado na resposta pixelass que usa SCSS)

Christian Toffolo
fonte
1
text-shadow:
    1px  1px 2px black,
    1px -1px 2px black,
   -1px  1px 2px black,
   -1px -1px 2px black;
user2987790
fonte
1

Eu criei uma comparação de todas as soluções mencionadas aqui para ter uma visão geral rápida:

<h1>with mixin</h1>
<h2>with text-shadow</h2>
<h3>with css text-stroke-width</h3>

https://codepen.io/Grienauer/pen/GRRdRJr

Grienauer
fonte
0

Uma vez tentei fazer os cantos arredondados e soltar sombras com o css3. Mais tarde, descobri que ainda é pouco suportado (Internet Explorer (s), é claro!)

Acabei tentando fazer isso em JS (canvas HTML com IE Canvas), mas isso afeta muito o desempenho (mesmo na minha máquina C2D). Em resumo, se você realmente precisa do efeito, considere as bibliotecas JS (a maioria delas deve ser capaz de executar no IE6), mas não faça isso devido a problemas de desempenho; se você ainda precisar de uma alternativa ... você pode usar o SFiR, PS e SFiR. CSS3 não está pronto hoje.

xandy
fonte
0

Desculpe o atraso, mas, falando sobre sombra de texto, achei que você também gostaria desse exemplo (eu o uso frequentemente quando preciso de boas sombras no texto):

                    text-shadow: -2px   -2px lightblue,
                                 -2px -1.5px lightblue,
                                 -2px   -1px lightblue,
                                 -2px -0.5px lightblue,
                                 -2px    0px lightblue,
                                 -2px  0.5px lightblue,
                                 -2px    1px lightblue,
                                 -2px  1.5px lightblue,
                                 -2px    2px lightblue,
                               -1.5px    2px lightblue,
                                 -1px    2px lightblue,
                               -0.5px    2px lightblue,
                                  0px    2px lightblue,
                                0.5px    2px lightblue,
                                  1px    2px lightblue,
                                1.5px    2px lightblue,
                                  2px    2px lightblue,
                                  2px  1.5px lightblue,
                                  2px    1px lightblue,
                                  2px  0.5px lightblue,
                                  2px    0px lightblue,
                                  2px -0.5px lightblue,
                                  2px   -1px lightblue,
                                  2px -1.5px lightblue,
                                  2px   -2px lightblue,
                                1.5px   -2px lightblue,
                                  1px   -2px lightblue,
                                0.5px   -2px lightblue,
                                  0px   -2px lightblue,
                               -0.5px   -2px lightblue,
                                 -1px   -2px lightblue,
                               -1.5px   -2px lightblue;
}
Alex Tudor
fonte