CSS Font Border?

491

Con todas las nuevas cosas de borde CSS3 en curso ( -webkit, ...) ¿ahora es posible agregar un borde a su fuente? (Al igual que el borde blanco sólido alrededor del logotipo azul de Twitter). Si no, ¿hay algún truco no demasiado feo que logre esto en CSS / XHTML o todavía necesito iniciar Photoshop?

Lars Tackmann
fuente

Respuestas:

1004

Hay una propiedad CSS experimental llamada trazo de texto , compatible con algunos navegadores detrás de un prefijo -webkit .

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

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

Otro posible truco sería usar cuatro sombras, un píxel cada una en todas las direcciones, usando la propiedad 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>

Pero se volvería borroso por más de 1 píxel de grosor.

Narcélio Filho
fuente
44
esto funcionó para mí correctamente, agregué solo 1px "blur": text-shadow: -1px 0 1px black, 0 1px 1px black, 1px 0 1px black, 0 -1px 1px black
Jakub M.
84
genial si solo necesitas un borde de 1px. Pero se pone feo cuando se usan 2px o más.
Jules Colle
2
Nota: hay un error con el navegador Andriod ( code.google.com/p/android/issues/detail?id=7531 ), si configura el "desenfoque" en 0px, no aparece ningún contorno.
Mark Rhodes
1
por cierto, puedes encontrar este código en la página de sugerencias CSS del W3C w3.org/Style/Examples/007/text-shadow.en.html (debajo de la DRAWING LETTERS AS OUTLINESparte)
luiges90
He encontrado que esto funciona mejor en un fondo de color y la respuesta de @ pixelass funciona mejor con un fondo de imagen
SemanticZen
151

ACTUALIZAR

Aquí hay una combinación SCSS para generar el trazo: 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);
}

ingrese la descripción de la imagen aquí

SÍ vieja pregunta ... con respuestas aceptadas (y buenas) ...

PERO ... En caso de que alguien necesite esto y odie escribir código ...

ESTE es un borde negro de 2px con soporte para CrossBrowser (no IE). Necesitaba esto para las fuentes @fontface, por lo que necesitaba ser más limpio que las respuestas vistas anteriormente ... Aprovecho cada lado en píxeles para asegurarme de que no haya (casi) espacios en blanco " fuentes difusas "(handrawn o similar). Se podrían agregar subpíxeles (0.5px) pero no lo necesito.

¿Código largo solo para el borde? ...¡¡¡SI!!!

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;

fuente
actualizó el código debido a un duplicado de 0 2px 0 # 000 y sus elementos - / +. El desenfoque (0 antes del # 000) podría eliminarse, pero tiendo a mantenerlo incluso si es 0. También debo tener en cuenta que se recomienda tener una versión CSS minificada o comprimida de su código en los sitios de producción y mantener una versión sin comprimir comentada para edición. El código anterior es un buen ejemplo de por qué un código CSS debe minimizarse pero debe separarse línea por línea para su edición.
Jugué con la propiedad '-webkit-text-stroke' (principalmente para que las fuentes se vean mejor en ventanas UGLY UGLY) Sin embargo, esto hizo que los tiempos de carga fueran demasiado largos e incluso bloqueó mi sitio (mac Chrome 16). Así que lo eliminé más rápido de lo que la página podría cargar. Supongo que esto solo está destinado a líneas individuales de fuentes. (Lo estaba usando para 'cuerpo')
1
¿Has hecho alguna evaluación comparativa de rendimiento con esto? He encontrado sombras de texto que empantanan la página al desplazarme, por ejemplo
Chris Bosco
1
He encontrado que esto funciona mejor en un fondo de imagen y la respuesta de @ Narcélio Filho funciona mejor con un fondo de color
SemanticZen
1
el código original "desapareció", así que creé uno nuevo con el código original de esta publicación y también hice una comparación de las otras soluciones mencionadas aquí codepen.io/Grienauer/pen/GRRdRJr
Grienauer
51

Tal vez podría emular un trazo de texto, usando css text-shadow(o -webkit-text-shadow/ -moz-text-shadow) y un desenfoque muy bajo:

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

Pero aunque esto está más ampliamente disponible que la -webkit-text-strokepropiedad, dudo que esté disponible para la mayoría de sus usuarios, pero eso podría no ser un problema (degradación elegante y todo eso).

David dice reinstalar a Mónica
fuente
3
Cabe señalar que es posible omitir totalmente el tercer argumento para no tener ningún desenfoque.
François Feugeas
23

Para obtener más información sobre algunas respuestas que han mencionado -webkit-text-stroke, aquí está el código para que funcione:

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

Un artículo en profundidad sobre el uso de accidente cerebrovascular texto es aquí y una lista de los navegadores que el accidente cerebrovascular texto de apoyo es aquí .

Ugtemlhrshrwzf
fuente
11

Esto es lo que estoy 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
fuente
2

Trazo de fuente con un mixin menos

Aquí hay una MENOS mezcla para generar el accidente cerebrovascular: 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;
}

(se basa en la respuesta pixelass que en su lugar usa SCSS)

Christian Toffolo
fuente
1
text-shadow:
    1px  1px 2px black,
    1px -1px 2px black,
   -1px  1px 2px black,
   -1px -1px 2px black;
usuario2987790
fuente
1

Creé una comparación de todas las soluciones mencionadas aquí para tener una visión general 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
fuente
0

Una vez intenté hacer esas esquinas redondeadas y soltar sombras con css3. Más tarde, descubrí que todavía es poco compatible (¡Internet Explorer (s), por supuesto!)

Terminé tratando de hacer eso en JS (lienzo HTML con IE Canvas), pero afecta mucho el rendimiento (incluso en mi máquina C2D). En resumen, si realmente necesita el efecto, considere las bibliotecas JS (la mayoría de ellas deberían poder ejecutarse en IE6) pero no lo haga demasiado debido a problemas de rendimiento; si todavía necesita una alternativa ... podría usar SFiR, luego PS it y SFiR it. CSS3 no está listo hoy.

X y Y
fuente
0

Lo siento, llego tarde, pero hablando de text-shadow, pensé que también te gustaría este ejemplo (lo uso con bastante frecuencia cuando necesito buenas sombras en el 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
fuente