Bordo font CSS?


491

Con tutte le nuove cose sui bordi CSS3 in corso ( -webkit, ...) è ora possibile aggiungere un bordo al tuo carattere? (Come il bordo bianco solido attorno al logo Twitter blu). Altrimenti, ci sono hack non troppo brutti che lo faranno in CSS / XHTML o devo ancora avviare Photoshop?

Risposte:


1004

C'è una proprietà CSS sperimentale chiamata text-stroke , supportata su alcuni browser dietro un prefisso -webkit .

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

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

Un altro possibile trucco sarebbe usare quattro ombre, un pixel ciascuna in tutte le direzioni, usando la proprietà 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>

Ma sarebbe sfocato per più di 1 pixel di spessore.


4
questo ha funzionato per me in modo perfetto, ho aggiunto solo 1px "sfocatura": text-shadow: -1px 0 1px nero, 0 1px 1px nero, 1px 0 1px nero, 0 -1px 1px nero
Jakub M.

84
ottimo se hai bisogno solo di un bordo 1px. Ma diventa brutto quando si utilizza 2px o più.
Jules Colle,

2
Nota: c'è un bug con il browser Andriod ( code.google.com/p/android/issues/detail?id=7531 ), se imposti la "sfocatura" su 0px, allora non viene visualizzato alcun contorno.
Mark Rhodes,

1
tra l'altro, puoi trovare questo codice nella pagina dei suggerimenti CSS del W3C w3.org/Style/Examples/007/text-shadow.en.html (sotto DRAWING LETTERS AS OUTLINESparte)
luiges90,

Ho trovato che funziona meglio su uno sfondo colorato e la risposta di @ pixelass funziona meglio con uno sfondo di immagine
SemanticZen

151

AGGIORNARE

Ecco un mixin SCSS per generare il tratto: 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);
}

inserisci qui la descrizione dell'immagine

SÌ vecchia domanda .. con risposte accettate (e buone) ..

MA ... Nel caso qualcuno ne abbia mai bisogno e odia digitare il codice ...

QUESTO è un bordo nero di 2px con supporto CrossBrowser (non IE) Ne avevo bisogno per i caratteri @fontface, quindi doveva essere più pulito delle risposte viste in precedenza ... Prendo ogni lato pixel per assicurarsi che non ci siano (quasi) spazi vuoti per " caratteri "fuzzy" (disegnati a mano o simili). È possibile aggiungere subpixel (0,5 px) ma non ne ho bisogno.

Codice lungo solo per il confine ??? ...SÌ!!!

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;

aggiornato il codice a causa di un duplicato di 0 2px 0 # 000 ed è - / + elementi. La sfocatura (0 prima di # 000) potrebbe essere rimossa ma tendo a mantenerla anche se è 0. Devo anche notare che è consigliabile avere una versione CSS ridotta o compressa del codice sui siti di produzione e conservare una versione non compressa commentata per la modifica. Il codice sopra è un buon esempio del perché un codice CSS dovrebbe essere minimizzato ma deve essere separato riga per riga per la modifica.

Ho giocato con la proprietà '-webkit-text-stroke' (principalmente per rendere i caratteri più belli sulle finestre UGLY UGLY) Eppure questo ha reso i tempi di caricamento troppo lunghi e ha persino bloccato il mio sito (mac Chrome 16). Quindi l'ho rimosso più velocemente di quanto la pagina potesse persino caricare. Immagino che questo sia destinato solo a singole righe di caratteri. (Lo stavo usando per 'body')

1
Hai fatto qualche benchmarking delle prestazioni con questo? Ho trovato l'ombra di testo a impantanarsi nella pagina durante lo scorrimento, per esempio
Chris Bosco

1
Ho trovato che funziona meglio su uno sfondo di immagine e la risposta di @ Narcélio Filho funziona meglio con uno sfondo di colore
SemanticZen

1
il codice originale "è scomparso", quindi ne ho creato uno nuovo con il codice originale di questo post e ho anche fatto un confronto con le altre soluzioni menzionate qui codepen.io/Grienauer/pen/GRRdRJr
Grienauer

51

Potresti forse emulare un tratto di testo, usando il CSS text-shadow(o -webkit-text-shadow/ -moz-text-shadow) e una sfocatura molto bassa:

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

Ma mentre questo è più ampiamente disponibile rispetto alla -webkit-text-strokeproprietà, dubito che sia disponibile per la maggior parte dei tuoi utenti, ma potrebbe non essere un problema (degrado aggraziato, e tutto il resto).


3
Va notato che è possibile omettere totalmente il terzo argomento per non avere alcun effetto sfocato.
François Feugeas,

23

Per approfondire alcune risposte che hanno menzionato -webkit-text-stroke, ecco il codice per farlo funzionare:

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

Un articolo approfondito sull'utilizzo del tratto di testo è qui e un elenco di browser che supportano il tratto di testo è qui .



11

Ecco cosa sto 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;
}

2

Traccia carattere-carattere con un mixin meno

Ecco un mixin MENO per generare l'ictus: 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;
}

(si basa sulla risposta pixelass che utilizza invece SCSS)


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


0

Una volta ho provato a fare quegli angoli arrotondati e rilasciare ombre con css3. Più tardi, ho scoperto che è ancora scarsamente supportato (Internet Explorer (s), ovviamente!)

Ho finito per provare a farlo in JS (HTML canvas con IE Canvas), ma influisce molto sulle prestazioni (anche sulla mia macchina C2D). In breve, se hai davvero bisogno dell'effetto, considera le librerie JS (la maggior parte di esse dovrebbe essere in grado di funzionare su IE6) ma non esagerare a causa di problemi di prestazioni; se hai ancora bisogno di un'alternativa ... puoi usare SFiR, quindi PS e SFiR. CSS3 non è pronto oggi.


0

Scusa il ritardo, ma parlando di text-shadow, ho pensato che ti sarebbe piaciuto anche questo esempio (lo uso abbastanza spesso quando ho bisogno di buone ombre sul testo):

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