Come creare Magic, descrizioni animate con CSS

I tooltip sono un ottimo modo per migliorare l'interfaccia utente quando gli utenti hanno bisogno di un contesto extra per quell'icona di fantasia, o quando vogliono un po 'di sicurezza per fare clic su un pulsante, o magari una didascalia di Easter Egg per accompagnare un'immagine. Facciamo alcuni tooltip animati, proprio ora, con nient'altro che HTML e CSS.

dimostrazione

Ecco a cosa stiamo lavorando:

Prima di immergerci nel calderone, diamo uno sguardo a cosa stiamo effettivamente preparando. L'obiettivo principale è avere un modo semplice per aggiungere un suggerimento, quindi lo faremo aggiungendo una custom tooltip attributo:

testo o icona visibile, ecc.

Una nota su accessibilità e capacità 

Se stai cercando tooltip compatibili con 508 o hai bisogno di tooltip più intelligenti con rilevamento delle collisioni del contenitore e / o supporto per contenuti HTML rispetto a testo normale, ci sono molte soluzioni che usano script di terze parti per risolvere quei bisogni per te. 

"JavaScript è fondamentale per creare componenti interattivi completamente accessibili." - Sara Soueidan, Costruire un tooltip di aiuto completamente accessibile ... è più difficile di quanto pensassi

Questo tutorial non affronta specificamente le esigenze di accessibilità. Conosci i tuoi utenti e di cosa hanno bisogno, quindi assicurati di considerare anche le loro esigenze in questo senso.

Impostiamo alcune aspettative

  • Non è richiesto JavaScript
  • Utilizzeremo i selettori di attributo (non i nomi di classe), con la corrispondenza del modello incorporato CSS
  • Aggiungi agli elementi DOM esistenti (non sono necessari nuovi elementi nel markup *)
  • Esempi di codice sono libera-prefix (aggiungi i prefissi dei fornitori per i browser di destinazione, se necessario)
  • Presume il passaggio del mouse / al passaggio del mouse per attivare i suggerimenti
  • Solo descrizioni di testo in chiaro (HTML, immagini, ecc. Non sono supportate)
  • Animazioni sottili durante l'invocazione di suggerimenti

Tutto apposto! Facciamo Rock questa barca!

Oh, aspetta. Abbiamo un asterisco da affrontare per primo, sul "non aver bisogno di alcun ricarico extra". Questa è la magia, dopo tutto. I nostri tooltip no veramente bisogno di qualsiasi elemento DOM extra dato che sono completamente realizzati pseudo-elementi (il ::prima e ::dopo cose) che possiamo controllare tramite CSS.

Se stai già utilizzando gli pseudo-elementi di un elemento di un altro set di stili e vuoi un suggerimento su quell'elemento, potresti dover ristrutturare un poco po.

Non c'è nessuna festa come un party tooltip!

Aspettare. Gremlins! Ancora un avvertimento: Posizionamento CSS. Affinché i tooltip funzionino correttamente, il loro elemento genitore (la cosa a cui stiamo allegando il tooltip) deve essere

  • posizione: relativa, o
  • posizione: assoluta, o
  • posizione: fissa

Fondamentalmente, qualsiasi cosa diversa da posizione: statica - questa è la modalità di posizione predefinita assegnata a quasi tutti gli elementi dal browser. I tooltip sono posizionati in modo assoluto e quindi hanno bisogno di conoscere i limiti in cui la loro assolutezza ha un significato. La direttiva di posizione predefinita statico non dichiara i propri limiti e non darà ai nostri tooltips un contesto contro cui fare push, quindi i tooltip useranno l'elemento parentale più vicino che ha un limite dichiarato.

Avrai bisogno di decidere quale direttiva di posizione funziona meglio con il modo in cui stai usando i tooltip. Questo tutorial presume posizione: relativa per l'elemento genitore. Se l'interfaccia utente si basa su un elemento posizionato in modo assoluto, potrebbe essere necessario eseguire alcune ristrutturazioni (extra markup) per distribuire un suggerimento su quell'elemento.

Entriamo e vediamo cosa succede.

Selettori di attributi; Un rapido aggiornamento

La maggior parte delle regole CSS sono scritte con nomi di classi in mente, come .questa cosa, ma i CSS hanno una manciata di tipi di selettori. I nostri tooltip magici useranno selettori di attributi: questa è la notazione della parentesi quadra: 

[foo] background: rgba (0, 0, 0, 0.8); colore: #fff; 

Quando il browser incontra qualcosa del genere:

Controlla!

saprà che ha bisogno di applicare il [Pippo] regole perché quello il tag ha un attributo chiamato foo. In questo caso, lo span stesso avrebbe uno sfondo nero traslucido con testo bianco. 

Gli elementi HTML hanno vari attributi incorporati, ma possiamo anche crearne uno nostro. Piace foo, o tooltip. Di default, HTML non sa cosa significano, ma con i CSS possiamo dire a HTML cosa significa.

Perché selettori di attributi?

Utilizzeremo i selettori di attributo principalmente per una separazione delle preoccupazioni. L'uso di attributi su nomi di classe non ci consente di ottenere punti bonus nelle guerre di specificità; le classi e gli attributi hanno la stessa specificità. Tuttavia, utilizzando gli attributi possiamo mantenere il nostro contenuto con il contenuto in quanto gli attributi HTML possono avere valori, mentre i nomi di classe no.

Considera il nome della classe .tooltip contro l'attributo [Tooltip] in questo codice di esempio. Il nome della classe è uno dei valori per l'attributo [classe] mentre l'attributo tooltip ha un valore, che è il testo che vogliamo mostrare.

lorem ipsum lorem ipsum

Ora entra nell'alchimia del tooltip

I nostri tooltip utilizzeranno due attributi diversi:

  • tooltip: questo contiene il contenuto del tooltip (una stringa di testo semplice)
  • flusso: opzionale; questo ci permette di controllare come esporre il suggerimento. Esistono molti posizionamenti che potremmo supportare, ma copriremo quattro posizionamenti comuni:
    in alto, a sinistra, a destra, in basso.

Ora, impostiamo il lavoro di base per tutti i tooltip. Le regole dei passaggi 1-5 si applicano a tutti i suggerimenti, indipendentemente da cosa flusso noi li diamo. I passaggi 6-7 hanno distinzioni tra i vari flusso valori.

1. Relatività

Questo è per l'elemento genitore del tooltip. Assegniamo una direttiva di posizione in modo che il posizionamento assoluto delle parti del tooltip (il ::prima e ::dopo pseudo-elementi) sono posizionati nel contesto di questo elemento padre e non nel contesto dell'elemento di pagina grande o di un nonno o di qualche altro elemento esterno sull'albero DOM.

[tooltip] position: relativo; 

2. Pseudo-elemento Prime Time

È tempo di innescare gli pseudo-elementi. Qui imposteremo proprietà comuni a entrambi ::prima e ::dopo pezzi. Il soddisfare la proprietà è ciò che effettivamente fa funzionare uno pseudo-elemento, ma ci arriveremo presto.

[tooltip] :: before, [tooltip] :: after line-height: 1; selezione utente: nessuna; pointer-events: none; posizione: assoluta; display: nessuno; opacità: 0; / * opinioni * / trasformazione del testo: nessuna; font-size: .9em; 

3. Il Dink

Non so perché "Dink" abbia senso, l'ho sempre chiamato così. Questa è la piccola parte a triangolo che dà i loro suggerimenti fumetto sentire puntando la cosa che lo ha invocato. Notiamo che stiamo usando trasparente per il colore del bordo; aggiungiamo il colore in un secondo momento, poiché il modo in cui lo aggiungiamo dipende dai suggerimenti flusso.

[tooltip] :: before content: "; z-index: 1001; border: 5px solid transparent;

Non è un refuso che il soddisfare:"; dichiarazione ha una stringa vuota per un valore. Non vogliamo nulla, ma abbiamo bisogno che la proprietà per lo pseudo-elemento esista.

Per creare un triangolo stiamo definendo un bordo solido con un certo spessore su una scatola vuota (nessun contenuto) senza larghezza e senza altezza e dando solo un lato del riquadro a un colore di bordo. Per maggiori dettagli consulta il seguente tutorial:

4. Bolle!

Ecco la carne della cosa. Notare il contenuto: attr (tooltip) parte dicendo: "Questo pseudo-elemento dovrebbe usare il valore di tooltip attributo come suo contenuto. "Questo è il motivo per cui l'uso di attributi su nomi di classi è così grande!

[tooltip] :: after content: attr (tooltip); /* Magia! * / z-index: 1000; / * la maggior parte del resto è opinione * / font-family: Helvetica, sans-serif; allineamento del testo: centro; / * Consenti al contenuto di impostare la dimensione dei tooltip, ma questo inoltre impedirà loro di essere odiosi * / min-width: 3em; larghezza massima: 21em; white-space: nowrap; overflow: nascosto; overflow del testo: ellissi; / * design visibile delle bolle del tooltip * / padding: 1ch 1.5ch; border-radius: .3ch; box-shadow: 0 1em 2em -.5em rgba (0, 0, 0, 0,35); sfondo: # 333; colore: #fff; 

Notare il z-index valori sia per il dink che per la bolla. Questi sono valori arbitrari, ma tieni presente che a z-index il valore è relativo. Significato: un valore z-index di 1001 all'interno di un elemento con uno z-index di 3 significa solo che l'elemento 1001 sarà l'elemento più in alto dentro quello z-index: 3 contenitore. 

La bolla z-index dovrebbe essere almeno un gradino più in basso rispetto al tino z-index. Se è uguale o superiore al Dink, si può finire con un effetto di colorazione incoerente sul Dink se i tuoi tooltip impiegano un box-ombra.

Per una visione più dettagliata della proprietà z-index, dai un'occhiata al seguente tutorial:

5. Azione di interazione

I nostri tooltip vengono attivati ​​passando il mouse sopra l'elemento con il tooltip ... Quasi.

[tooltip]: hover :: before, [tooltip]: hover :: after display: block; 

Se guardi indietro al nostro blocco di stile nel passaggio 2, dovresti vedere che abbiamo usato opacità: 0; insieme a display: nessuno; per le nostre parti tooltip. Lo abbiamo fatto in modo da poter utilizzare gli effetti di animazione CSS quando i tooltip mostrano e nascondono. 

Il display la proprietà non può essere animata, ma opacità può! Ci occuperemo delle animazioni per ultime. Se non ti interessa i tooltip animati, cancella semplicemente il opacità: 0; dichiarazione dal passaggio 2 e ignorare l'animazione nel passaggio 7.

L'ultima cosa di cui avremo bisogno si applica ancora a tutti i tooltip è un modo per sopprimere un suggerimento se non ha contenuto. Se stai compilando tooltip con qualche sorta di sistema dinamico (Vue.js, Angular, o React, PHP, ecc.) Non vogliamo bolle sciocche!

/ * non mostra descrizioni comandi vuote * / [tooltip = "] :: before, [tooltip ="] :: after display: none! important; 

6. Controllo del flusso

Questo passaggio può diventare piuttosto complicato poiché utilizzeremo alcuni selettori non molto comuni per aiutare i nostri tooltip a gestire i loro posizionamenti in base alle loro flusso valori (o la mancanza di ciò).

"Strane cose sono in corso al Circle-K." - Ted Theodore Logan

Prima di saltare agli stili, diamo un'occhiata ad alcuni modelli di selettori che useremo.

[tooltip]: not ([flow]) :: before, [tooltip] [flow ^ = "up"] :: before / * ... properties: values ​​... * / 

Questo sta dicendo al browser: "Per tutti gli elementi con a tooltip attributo sia non avere un flusso attributo o ha un flusso con un valore che inizia con 'su': applica questi stili al suo ::prima pseudo-elemento.”

Qui stiamo usando un pattern in modo che questi possano essere estesi ad altri flussi senza dover ripetere così tanti CSS. Questo modello flusso ^ = "up" sta usando il ^ = (inizia con) matcher. Questo consente agli stili di applicare anche a in alto a destra e in alto a sinistra dovresti voler aggiungere quei controlli di flusso. Non li copriremo qui, ma puoi vederli in uso sulla mia demo tooltip originale su CodePen.

Ecco i blocchi CSS per tutti e quattro i flussi coperti da questo tutorial.

Su (predefinito):

/ * SOLO il :: before * / [tooltip]: not ([flow]) :: before, [tooltip] [flow ^ = "up"] :: before bottom: 100%; border-bottom-width: 0; border-top-color: # 333;  / * SOLO il :: after * / [tooltip]: not ([flow]) :: after, [tooltip] [flow ^ = "up"] :: after bottom: calc (100% + 5px);  / * Both :: before & :: after * / [tooltip]: not ([flow]) :: before, [tooltip]: not ([flow]) :: after, [tooltip] [flow ^ = "su "] :: before, [tooltip] [flow ^ =" up "] :: after left: 50%; transform: translate (-50%, -.5em);  

Giù:

[tooltip] [flow ^ = "down"] :: before top: 100%; border-top-width: 0; border-bottom-color: # 333;  [tooltip] [flow ^ = "down"] :: after top: calc (100% + 5px);  [tooltip] [flow ^ = "down"] :: before, [tooltip] [flow ^ = "down"] :: after left: 50%; transform: translate (-50%, .5em); 

Sinistra:

[tooltip] [flow ^ = "left"] :: before top: 50%; border-right-width: 0; border-left-color: # 333; a sinistra: calc (0em - 5px); transform: translate (-. 5em, -50%);  [tooltip] [flow ^ = "left"] :: after top: 50%; a destra: calc (100% + 5px); transform: translate (-. 5em, -50%); 

Destra:

[tooltip] [flow ^ = "right"] :: before top: 50%; border-left-width: 0; border-right-color: # 333; a destra: calc (0em - 5px); transform: translate (.5em, -50%);  [tooltip] [flow ^ = "right"] :: after top: 50%; a sinistra: calc (100% + 5px); transform: translate (.5em, -50%); 

7. Animare tutte le cose

Le animazioni sono fantastiche. Le animazioni possono:

  • aiutare gli utenti a sentirsi a proprio agio
  • aiuta gli utenti con la consapevolezza spaziale della tua interfaccia utente
  • richiamare l'attenzione su cose che devono essere viste
  • ammorbidire gli elementi di un'interfaccia utente che altrimenti sarebbe un effetto di interruzione on / off binario

I nostri tooltips rientrano in quest'ultima descrizione. Piuttosto che far esplodere una bolla di testo e scoppiare in un lampo, facciamoli più morbido.

@keyframes

Ne avremo bisogno due @keyframe animazioni. I suggerimenti su / giù useranno il tooltip-vert keyframe e i tooltips sinistro / destro useranno il tooltip-HORZ fotogramma chiave. Nota in entrambi questi fotogrammi chiave definiamo solo lo stato finale desiderato dei tooltip. Non abbiamo bisogno di sapere dove vengono a partire dal (i tooltip stessi hanno quell'informazione di stile). Vogliamo solo controllare dove vanno a.

@keyframes tooltips-vert to opacity: .9; transform: translate (-50%, 0);  @keyframes tooltips-horz to opacity: .9; transform: translate (0, -50%); 

Ora, abbiamo bisogno di applicare questi keyframe alle descrizioni dei comandi quando un utente si posiziona sugli elementi di attivazione (gli elementi con [Tooltip] attributi). Dal momento che stiamo impiegando vari flussi per controllare il modo in cui i tooltip mostreranno, dobbiamo identificare queste possibilità negli stili.

Usa: passa il mouse per passare il controllo alle animazioni

[tooltip]: not ([flow]): hover :: before, [tooltip]: not ([flow]): hover :: after, [tooltip] [flow ^ = "up"]: hover :: before, [ tooltip] [flow ^ = "up"]: hover :: after, [tooltip] [flow ^ = "down"]: hover :: before, [tooltip] [flow ^ = "down"]: hover :: after  animazione: tooltips-vert 300ms in uscita in avanti;  [tooltip] [flow ^ = "left"]: hover :: before, [tooltip] [flow ^ = "left"]: hover :: after, [tooltip] [flow ^ = "right"]: hover :: prima, [tooltip] [flow ^ = "right"]: hover :: after animation: tooltips-horz 300ms eas-out forward; 

Ricorda che non possiamo animare il display proprietà, ma possiamo dare un effetto di dissolvenza manipolando il tooltip opacità. Stiamo anche animando la proprietà di trasformazione che dà ai suggerimenti un movimento sottile come se volassero dentro per indicare i loro elementi di attivazione.

Notare il in avanti parola chiave nella dichiarazione di animazione. Questo dice all'animazione di non resettare una volta completato, ma di procedere in avanti e rimanere alla fine.

Conclusione

Lavoro fantastico! Abbiamo parlato molto in questo tutorial e ora abbiamo una raccolta accurata di tooltip da mostrare per il nostro duro lavoro:

Abbiamo solo scalfito la superficie di ciò che può essere fatto con i tooltips CSS. Divertiti a giocare con loro e continua a sperimentare e ad elaborare le tue ricette!

Altri tutorial sull'interfaccia utente CSS

  • Suggerimento rapido: caselle di controllo CSS3 e pulsanti di opzione facili
  • Portare le forme CSS al livello successivo
  • Risoluzione dei problemi con CSS Grid e Flexbox: l'interfaccia utente della scheda
  • Inizia con l'animazione Web