Aggiungere tratti al testo web

I font sul web sono essenzialmente grafica vettoriale. Questo è il motivo per cui puoi visualizzarli a 12px o 120px e rimangono nitidi e con bordi relativamente netti. Vettoriale significa che la loro forma è determinata da punti e dalla matematica per descrivere la forma, piuttosto che da dati di pixel reali. Poiché sono vettoriali, avrebbe senso se potessimo fare cose che altri programmi vettoriali (per esempio Adobe Illustrator) possono fare con il testo vettoriale, come disegnare un tratto intorno ai singoli caratteri. Bene, possiamo farlo! Esempio:

h1 { /* Prefix required. Even Firefox only supports the -webkit- prefix */ -webkit-text-stroke-width: 1px; -webkit-text-stroke-color: black;}

O stenografia:

h1 { -webkit-text-stroke: 1px black;}

Potreste pensare “Fico, ma se solo alcuni browser lo supportano, se imposto il colore del mio testo a white e il mio sfondo è white, il tratto lo fa sembrare figo nei browser che lo supportano ma scompare completamente nei browser che non lo supportano!”

Una possibilità è questa:

h1 { color: black; -webkit-text-fill-color: white; /* Will override color (regardless of order) */ -webkit-text-stroke-width: 1px; -webkit-text-stroke-color: black;}

Mostra qui con @font-face font Anime Ace 2 di Nate Piekos:

Propriamente accarezzato!
Fallback al colore solido. Mostrato qui in Firefox

Un’altra possibilità si applica solo quando è supportato:

@supports (-webkit-text-stroke: 1px black) { h1 { -webkit-text-stroke: 1px black; -webkit-text-fill-color: white; }}

Supporto

Questi dati di supporto del browser sono di Caniuse, che ha più dettagli. Un numero indica che il browser supporta la funzione a partire da quella versione.

Desktop

Chrome Firefox IE Edge Safari
4* 49* No 15* 3.1*

Mobile / Tablet

Android Chrome Android Firefox Android iOS Safari
89* 86* 2.1* 4.0-4.1*

Simulazione

Possiamo andare un po’ oltre non basandoci interamente sul proprietario WebKit. Possiamo usare la proprietà text-shadow (supportata anche in Firefox, Opera e IE 10) e simulare un tratto. Useremo quattro ombre, ognuna di 1px di nero senza diffusione, una in alto a destra, una in alto a sinistra, una in basso a sinistra e una in basso a destra. Rimuoveremo il -webkit-text-fill-color proprietario di WebKit in favore di color dato che ora siamo compatibili con tutti i browser. L’unica eccezione sarebbe IE9 e giù, che naturalmente si possono usare fogli di stile specifici per IE per tenerne conto.

h1 { color: white; text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000;}

Questo è un tratto che usa solo text-shadow. Abbastanza vicino ad essere buono come un vero tratto. Il problema principale è che si può ottenere solo 1px di tratto in questo modo. Un po’ di più, e vedrete degli spazi vuoti. Qualsiasi altro con il tratto di testo WebKit e ci sono anche problemi, quindi è una specie di cavallo di battaglia.

Combinazione

Utilizzando sia un tratto che un’ombra può essere un grande effetto. Buttiamo su un tratto WebKit, il tratto tutto testo-ombra, così come un tratto testo-ombra più profondo.

h1 { -webkit-text-stroke: 1px black; color: white; text-shadow: 3px 3px 0 #000, -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000;}
Si sta bene

Demo

Vedi la penna
Stroked Text with Alternatives di CSS-Tricks (@css-tricks)
su CodePen.

Allineamento

Se avete familiarità con Adobe Illustrator, forse sapete che potete allineare un tratto all’interno di una forma, all’esterno o centrato. Questa opzione appare così nella palette:

Da sinistra a destra: centro, interno, esterno

Per ragioni a me sconosciute, anche il testo in Illustrator può essere impostato solo sull’allineamento centrale del tratto. Una volta che si espande il testo in percorsi vettoriali regolari, però, tutte e tre le opzioni diventano disponibili. Promemoria da Sam Frysteen: aggiungi un nuovo tratto nel pannello Aspetto e spostalo sotto il tuo testo (in pratica imita l’allineamento esterno del tratto).

Dall’alto in basso: interno, centrato, esterno.

Solo l’allineamento esterno del testo mi sembra buono. È un peccato, sia per i CSS che per Illustrator, che il default immutabile sia centrato. La soluzione è solo quella di non impazzire troppo con lo spessore del bordo del tratto e le cose dovrebbero andare bene. Nota: la soluzione text-shadow-only non ha questo problema, ma non è nemmeno in grado di disegnare più di 1px.

Se usi uno pseudo elemento, puoi disegnare lo stesso testo dietro il testo originale e simulare un tratto esterno.
Abbiamo un intero articolo su questo problema di allineamento: Tratto di testo: Stuck In The Middle With You. Una piccola buona notizia, la proprietà paint-order permette essenzialmente di avere tratti esterni impostati, una volta che più browser lo supportano.

Cosa non possiamo fare

Ci sono altre cose che i programmi di grafica vettoriale possono fare con il testo. È possibile schiacciare le lettere orizzontalmente / allungarle verticalmente. Questo tipo di trattamento del testo è quasi universalmente disapprovato, quindi non è una grande perdita il fatto di non poterlo fare. È anche possibile impostare il tipo su una linea irregolare (come intorno a un cerchio). Sarebbe certamente bello poterlo fare con il testo web. Forse potremmo impostare il testo per seguire il percorso del bordo del suo elemento genitore.

p.circular { width: 200px; height: 200px; border-radius: 100px; /* NOT REAL */ text-align: border-path;}

In Illustrator, possiamo anche dire ad un tratto come gestire gli angoli acuti: arrotondati, smussati, o mitrati. Questi possono avere effetti piacevoli, non sono possibili sul web. Tuttavia, la gestione degli angoli da parte di WebKit è abbastanza carina come impostazione predefinita (qualunque essa sia), e probabilmente più carina di qualsiasi opzione in Illustrator.

Fantasie

Per la cronaca, è possibile utilizzare qualsiasi tipo di valore di colore per il colore del tratto (hex, rgba, hsla, parola chiave). Questo significa tratti trasparenti se li vuoi, che in effetti “impilano” nel senso che se i tratti si sovrappongono l’un l’altro (comune) saranno più scuri.

Per quanto riguarda l’animazione del keyframe, il colore del tratto si animerà ma la larghezza del tratto no (strano).

/* Only the color will change, not the width */@keyframes colorchange { 0% { -webkit-text-stroke: 10px red; } 100% { -webkit-text-stroke: 20px green; }}

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *