{"id":122,"date":"2010-11-30T09:06:36","date_gmt":"2010-11-30T08:06:36","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/capire-le-css3-transitions\/"},"modified":"2010-11-30T09:06:36","modified_gmt":"2010-11-30T08:06:36","slug":"capire-le-css3-transitions","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/capire-le-css3-transitions\/","title":{"rendered":"Capire le CSS3 Transitions"},"content":{"rendered":"<p><em>E&#8217; con grande piacere che presentiamo un estratto dal Capitolo 2 di <cite><a href=\"http:\/\/books.alistapart.com\/\">CSS3 for Web Designers<\/a><\/cite> di Dan Cederholm (A Book Apart, 2010). \u2014Ed.<\/em><\/p>\n<p>Era il 1997 e sedevo nel mio appartamento fatiscente nella bellissima Allston nel Massachusetts: la tipica nottata a fissare del codice sorgente cercando di insegnare a me stesso l&#8217;HTML, al termine di una giornata passata ad impacchettare CD presso un&#8217;etichetta discografica locale per una paga misera (da qui l&#8217;appartamento fatiscente). Sono sicuro che potete identificarvi.<\/p>\n<p>Una nottata trionfale a dire il vero: alzai il pugno in segno di una dolce vittoria. Avevo appena creato del codice che faceva funzionare il mio primo effetto rollover di immagini in JavaScript. Ve li ricordate?<\/p>\n<p>Mi ricordo ancora lo stupore nel vedere un pulsante grafico creato da me in maniera approssimativa &#8220;scambiarsi&#8221; con un pulsante diverso quando ci si passava sopra con il mouse. All&#8217;epoca avevo a malapena un&#8217;idea riguardo a quello che stavo facendo, ma far s\u00ec che qualcosa effettivamente cambiasse sulla pagina in maniera dinamica&#8230; beh, era semplicemente magico!<\/p>\n<p>\u00c8 passata molta acqua sotto ai ponti negli ultimi dieci anni per quel che riguarda l&#8217;interazione e l&#8217;esperienza visuale sul web. Storicamente, tecnologie quali Flash e JavaScript hanno permesso di creare animazioni, movimenti ed effetti interattivi, ma recentemente, con i browser che hanno cominciato a supportare le transizioni e le trasformazioni di CSS, possiamo tranquillamente spostare alcune di quelle animazioni ed arricchimenti della experience nei nostri fogli di stile.<\/p>\n<p>Nel 1997 c&#8217;erano volute parecchie notti di grattacapi per il mio primo rollover in JavaScript, molte righe di codice che all&#8217;epoca mi sembravano come degli alieni e molte immagini. Oggi CSS3 rende possibili delle interazioni pi\u00f9 ricche e molto pi\u00f9 flessibili tramite semplici righe di codice che fortunatamente &#8220;degradano dolcemente&#8221; nei browser che non le supportano ancora.<\/p>\n<p>Possiamo iniziare ad usare le transizioni CSS3 gi\u00e0 adesso, a patto di prestare molta attenzione alla scelta delle situazioni nelle quali usarle. Sicuramente, non rimpiazzeranno tecnologie come Flash, JavaScript o SVG (specialmente senza un supporto pi\u00f9 vasto da parte dei browser), ma possono essere usate per spingere il livello della experience pi\u00f9 in alto. E, cosa ancora pi\u00f9 importante, sono relativamente semplici da implementare per i web designer che hanno gi\u00e0 una certa familiarit\u00e0 con i CSS: ci vogliono solo poche righe di codice.<\/p>\n<div class=\"paragrafo\">\n<h2>Una cosa insignificante che condiziona le sorti di una cosa assai pi\u00f9 importante<\/h2>\n<p>Inizialmente sviluppate solo dal team di WebKit per Safari, le CSS Transitions sono ora una Working Draft del W3C. Costituiscono un buon esempio di un&#8217;innovazione portata avanti da un browser che pu\u00f2 diventare un potenziale standard. Dico potenziale perch\u00e9 ad oggi \u00e8 soltanto una bozza. Comunque, Opera ha recentemente aggiunto il supporto per le CSS Transitions nella versione 10.5 e Firefox ha promesso di supportarle nella versione 4.0. In altre parole, mentre rimangono una draft e continuano ad evolversi, sono abbastanza stabili perch\u00e9 Opera e Firefox le considerino seriamente e le supportino. Pertanto, le CSS transitions non sono pi\u00f9 esperimenti proprietari solo di Safari.<\/p>\n<p>Vediamo come funzionano le transizioni.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Cosa sono le CSS Transitions?<\/h2>\n<p>Mi piace pensare alle CSS transitions come al <em>burro<\/em>: rendono morbidi i cambiamenti di valore nei vostri fogli di stile quando vengono fatte scattare da interazioni come il passaggio del mouse sopra ad un elemento, i click e il focus. A differenza del vero burro, per\u00f2, le transizioni non fanno ingrassare: si tratta solo di poche semplici regole da aggiungere al vostro foglio di stile per arricchire alcuni eventi nel vostro design.<\/p>\n<p>Il <a href=\"http:\/\/bkaprt.com\/css3\/3\/\">W3C spiega le CSS transitions<\/a> in maniera piuttosto semplice:<\/p>\n<blockquote>\n<p>Le CSS transitions fanno in modo che i cambiamenti di valore nel CSS risultino &#8220;morbidi&#8221; per la durata specificata. Questo ammorbidimento nel passaggio da un valore ad un altro crea un&#8217;animazione CSS quando viene attivato da un click del mouse, nel passaggio a uno stato focus o active o da un qualunque cambiamento dell&#8217;elemento (incluso un cambio nell&#8217;attributo classe dell&#8217;elemento).<\/p>\n<\/blockquote>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Un esempio semplice<\/h2>\n<p>Ecco un semplice esempio, nel quale aggiungo una transizione al colore di background di un link, che cambia quando vi si passa sopra con il mouse. Useremo una transition per rendere il cambiamento pi\u00f9 morbido, un effetto prima possibile solo con l&#8217;uso di Flash o JavaScript, ma ora attuabile con poche semplici righe di CSS.<\/p>\n<p>Il markup consiste in un semplice hyperlink, cos\u00ec:<\/p>\n<pre><code> \n&lt;a href=\"#\" class=\"foo\"&gt;Transition me!&lt;\/a&gt;\n<\/code><\/pre>\n<p>Di seguito, aggiungiamo una dichiarazione per lo stato normale del link con un po&#8217; di padding e un background color verde chiaro, seguito da un cambiamento di colore del background verso un verde pi\u00f9 scuro al passaggio sopra di esso:<\/p>\n<pre><code> \na.foo {\n  padding: 5px 10px;\n  background: #9c3;\n  }\na.foo:hover {\n  background: #690;\n  }\n<\/code><\/pre>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2010\/11\/fig1.jpg\" border=\"0\" alt=\"Esempio con link Normal e Hover\" \/><\/p>\n<p>Fig. 1: Lo stato del link: normale e <code>:hover<\/code><\/p>\n<\/div>\n<p>Ora, aggiungiamo una transizione al cambio di colore del background. Questo render\u00e0 pi\u00f9 lineare ed animata la differenza lungo un certo intervallo temporale.<\/p>\n<div class=\"illustration full left\">\n<object width=\"540\" height=\"328\" data=\"http:\/\/www.youtube.com\/v\/8v7ltfDGKTc?fs=1&amp;hl=en_US\" type=\"application\/x-shockwave-flash\"><param name=\"allowFullScreen\" value=\"true\" \/><param name=\"allowscriptaccess\" value=\"always\" \/><param name=\"src\" value=\"http:\/\/www.youtube.com\/v\/8v7ltfDGKTc?fs=1&amp;hl=en_US\" \/><param name=\"allowfullscreen\" value=\"true\" \/><\/object><\/p>\n<p>Fig. 2: Qui vediamo la transizione scorrevole del background dal verde chiaro al verde scuro.<\/p>\n<\/div>\n<p>Per il momento, useremo solo le propriet\u00e0 con i prefissi dei produttori che attualmente funzionano nei browser basati su WebKit (Safari e Chrome) cos\u00ec da rendere pi\u00f9 semplici le cose. Pi\u00f9 tardi aggiungeremo i prefissi dei produttori per Mozilla e Opera.<\/p>\n<pre><code> \na.foo {\n  padding: 5px 10px;\n  background: #9c3;\n  -webkit-transition-property: background;\n  -webkit-transition-duration: 0.3s;\n  -webkit-transition-timing-function: ease;\n  }\na.foo:hover {\n  background: #690;\n  }\n<\/code><\/pre>\n<p>Notate le tre parti di una transition nella dichiarazione:<\/p>\n<ul>\n<li><code>transition-property<\/code>: La propriet\u00e0 su cui deve agire la transition (in questo caso la propriet\u00e0 background)<\/li>\n<li><code>transition-duration<\/code>: La durata della transition (0.3 secondi)<\/li>\n<li><code>transition-timing-function<\/code>: Quanto deve essere veloce la transition nel tempo (ease)<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Funzioni di temporizzazione (ovvero, se solo avessi fatto attenzione alle lezioni di matematica)<\/h2>\n<p>Il valore della funzione di temporizzazione permette alla velocit\u00e0 della transizione di cambiare nel tempo definendo una delle sei possibilit\u00e0: <code>ease<\/code>, <code>linear<\/code>, <code>ease-in<\/code>, <code>ease-out<\/code>, <code>ease-in-out<\/code> e <code>cubic-bezier<\/code> (che vi permette di definire la vostra curva di temporizzazione).<\/p>\n<p>Se dormivate durante le lezioni di geometria al liceo come facevo io, non preoccupatevi. Vi suggerisco di provare semplicemente ciascun valore di queste funzioni di temporizzazione per capire quali siano le differenze tra loro.<\/p>\n<p>Per il nostro semplice esempio, la durata della transition \u00e8 cos\u00ec rapida (solo 0.3 secondi) che sarebbe difficile determinare le differenze tra le sei opzioni. Per animazioni pi\u00f9 lunghe, la funzione di temporizzazione che scegliete diventa un pezzo importante del puzzle, poich\u00e9 c&#8217;\u00e8 tempo per notare i cambiamenti di velocit\u00e0 sulla lunghezza dell&#8217;animazione.<\/p>\n<p>Se avete dei dubbi, <code>ease<\/code> (che tra l&#8217;altro \u00e8 anche il valore di default) o <code>linear<\/code> dovrebbero andare bene per transizioni brevi.<\/p>\n<p>Potremmo semplificare in maniera significativa la dichiarazione usando l&#8217;abbreviazione della propriet\u00e0 della transition:<\/p>\n<pre><code> \na.foo {\n  padding: 5px 10px;\n  background: #9c3;\n  -webkit-transition: background 0.3s ease;\n  }\na.foo:hover {\n  background: #690;\n  }\n<\/code><\/pre>\n<p>Ora abbiamo una regola molto pi\u00f9 compatta che porta allo stesso risultato.<\/p>\n<p>Tutto questo meraviglioso effetto di transizione funziona bene nei browser basati su WebKit, ma come si comporta negli altri?<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Il supporto nei browser<\/h2>\n<p>Come ho accennato prima, le transizioni sono state inizialmente sviluppate dal team WebKit e sono presenti in Safari e Chrome fin dalla versione 3.2, ma <a href=\"http:\/\/bkaprt.com\/css3\/4\/\">Opera le supporta nella versione 10.5<\/a> e <a href=\"http:\/\/bkaprt.com\/css3\/5\/\">il supporto \u00e8 stato promesso da Firefox a partire dalla versione 4.0<\/a>. Per via di questo supporto presente e futuro, \u00e8 importante aggiungere gli appropriati prefissi dei produttori cos\u00ec che le transitions funzioneranno in pi\u00f9 browser man mano che il supporto verr\u00e0 esteso.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Creare il transition stack completo<\/h2>\n<p>Ecco la dichiarazione rivista con l&#8217;aggiunta dei prefissi <code>-moz-<\/code> e <code>-o-<\/code> insieme alla effettiva propriet\u00e0 transition di CSS3. Mettiamo la propriet\u00e0 senza prefissi per ultima nello stack, per assicurarci che l&#8217;implementazione finale avr\u00e0 la meglio sulle altre man mano che la propriet\u00e0 cambier\u00e0 il suo stato da bozza a terminata.<\/p>\n<pre><code> \na.foo {\n  padding: 5px 10px;\n  background: #9c3;\n  -webkit-transition: background 0.3s ease;\n  -moz-transition: background 0.3s ease;\n  -o-transition: background 0.3s ease;\n  transition: background 0.3s ease;\n  }\na.foo:hover {\n  background: #690;\n  }\n<\/code><\/pre>\n<p>Con quello stack, faremo in modo che il cambiamento di colore del background sar\u00e0 morbido nelle attuali versioni di Safari, Chrome e Opera cos\u00ec come nelle future versioni di qualunque browser decida di supportarla.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Stati della transizione<\/h2>\n<p>Mi ricordo di aver provato una certa confusione quando cominciai a giocare con le CSS Transitions. Non avrebbe avuto pi\u00f9 senso mettere le propriet\u00e0 di transizione nella dichiarazione <code>:hover<\/code>, dal momento che quello d\u00e0 il via alla transition? La risposta \u00e8 che ci sono altri possibili stati di un elemento oltre a <code>:hover<\/code> ed \u00e8 probabile che vogliate che quella transition accada su ciascuno di quelli senza venir duplicata.<\/p>\n<p>Ad esempio, potreste volere la transizione anche sulle pseudo-classi <code>:focus<\/code> o <code>:active<\/code> del link. Invece di dover aggiungere lo stack della propriet\u00e0 di transition ad ognuna di queste dichiarazioni, le istruzioni di transizione sono attaccate allo stato normale e pertanto dichiarate una sola volta.<\/p>\n<p>L&#8217;esempio seguente aggiunge lo stesso cambio di background allo stato <code>:focus<\/code>. Questo abilita l&#8217;attivazione della transizione sia dal passaggio sopra sia dal focus sul link (ad esempio, tramite tastiera).<\/p>\n<pre><code> \na.foo {\n  padding: 5px 10px;\n  background: #9c3;\n  -webkit-transition: background 0.3s ease;\n  -moz-transition: background 0.3s ease;\n  -o-transition: background 0.3s ease;\n  transition: background 0.3s ease;\n  }\na.foo:hover,\na.foo:focus {\n  background: #690;\n  }\n<\/code><\/pre>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Propriet\u00e0 di transition multiple<\/h2>\n<p>Supponiamo di voler cambiare, assieme al colore di background, il colore del testo del link ed applicare anche a questo una transition. Possiamo farlo creando una stringa di transitions, separate da una virgola. Ciascuna pu\u00f2 avere durata variabile e diverse funzioni di temporizzazione (fig.3).<\/p>\n<div class=\"illustration full left\">\n<object width=\"538\" height=\"328\" data=\"http:\/\/www.youtube.com\/v\/YhFJH7ryUzQ?fs=1&amp;hl=en_US\" type=\"application\/x-shockwave-flash\"><param name=\"allowFullScreen\" value=\"true\" \/><param name=\"allowscriptaccess\" value=\"always\" \/><param name=\"src\" value=\"http:\/\/www.youtube.com\/v\/YhFJH7ryUzQ?fs=1&amp;hl=en_US\" \/><param name=\"allowfullscreen\" value=\"true\" \/><\/object><\/p>\n<p>Fig. 3: Gli stati normale e <code>:hover<\/code> del link.<\/p>\n<\/div>\n<pre><code> \na.foo {\n  padding: 5px 10px;\n  background: #9c3;\n  -webkit-transition: background .3s ease,\n    color 0.2s linear;\n  -moz-transition: background .3s ease,\n    color 0.2s linear;\n  -o-transition: background .3s ease, color 0.2s linear;\n  transition: background .3s ease, color 0.2s linear;\n  }\na.foo:hover,\na.foo:focus {\n  color: #030;\n  background: #690;\n  }\n<\/code><\/pre>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Applicare la transition a tutte le possibili propriet\u00e0<\/h2>\n<p>Un&#8217;alternativa alla creazione di un elenco di propriet\u00e0 multiple \u00e8 l&#8217;utilizzo del valore <code>all<\/code>, che avr\u00e0 l&#8217;effetto di applicare la transition a tutte le propriet\u00e0 disponibili.<\/p>\n<p>Inseriamo <code>all<\/code> all&#8217;interno del nostro semplice esempio invece di elencare il background ed il colore separatamente. Ora condividono la stessa durata e la stessa funzione di temporizzazione.<\/p>\n<pre><code> \na.foo {\n  padding: 5px 10px;\n  background: #9c3;\n  -webkit-transition: all 0.3s ease;\n  -moz-transition: all 0.3s ease;\n  -o-transition: all 0.3s ease;\n  transition: all  0.3s ease;\n  }\na.foo:hover,\na.foo:focus {\n  color: #030;\n  background: #690;\n  }\n<\/code><\/pre>\n<p>Si tratta di un modo conveniente per catturare tutti i cambiamenti che accadono sugli eventi <code>:hover<\/code>, <code>:focus<\/code>, o <code>:active<\/code> senza dover elencare ogni propriet\u00e0 a cui vorreste applicare una transition.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Quali propriet\u00e0 dei CSS possono avere delle transition?<\/h2>\n<p>Adesso che abbiamo applicato con successo le transizioni al background e al colore di un link, ci sono molte altre propriet\u00e0 CSS che possono avere delle transizioni, ivi incluse <code>width<\/code>, <code>opacity<\/code>, posizione e <code>font-size<\/code>. Una <a href=\"http:\/\/bkaprt.com\/css3\/6\">tabella di tutte le possibili propriet\u00e0<\/a> (e dei loro tipi) che possono avere delle transizioni \u00e8 messa a disposizione dal W3C.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Perch\u00e9 invece non si usa JavaScript?<\/h2>\n<p>Probabilmente vi starete chiedendo perch\u00e9, dal momento che non tutti i browser supportano le CSS transitions, non si usi una soluzione in JavaScript per gestire l&#8217;animazione. Da un po&#8217; di tempo i framework popolari come <a href=\"http:\/\/jquery.com\/\">jQuery<\/a>, <a href=\"http:\/\/www.prototypejs.org\/\">Prototype<\/a> e <a href=\"http:\/\/script.aculo.us\/\">script.aculo.us<\/a> rendono possibili le animazioni con JavaScript, con funzionamento cross-browser.<\/p>\n<p>Dipende tutto da quanto sono cruciali le transizioni nella experience. In questo piccolo libro sottolineo come potete adottare la semplicit\u00e0 e la flessibilit\u00e0 di CSS3 se scegliete le parti appropriate della user experience a cui applicarle: arricchendo le interazioni presenti sulla pagina. Abbastanza frequentemente, l&#8217;animazione di queste interazioni, quando \u00e8 gestita tramite le CSS Transition non \u00e8 parte integrante del brand, della leggibilit\u00e0 o del layout del sito. Pertanto, l&#8217;uso di poche semplici righe di CSS per attivare un&#8217;animazione semplice supportata nativamente dal browser (piuttosto che scegliere un framework JavaScript) \u00e8 una scelta intelligente. E una possibilit\u00e0 che sono felice di avere a disposizione.<\/p>\n<div class=\"paragrafo\">\n<h2>Siate intelligenti, non furbi<\/h2>\n<p>Come tutti i nuovi attrezzi luccicanti, \u00e8 importante utilizzare le transitions in <em>maniera appropriata<\/em>. Si pu\u00f2 perdere la testa aggiungendo le transizioni a qualsiasi cosa ci sia nella pagina, ottenendo il risultato di farla apparire come un mostro pulsante e fastidioso. E&#8217; importante decidere dove le transitions effettivamente arricchiscono l&#8217;esperienza utente e quando sono solo un rumore estraneo. Inoltre, \u00e8 cruciale assicurarsi che la velocit\u00e0 della transizione non rallenti un&#8217;azione che altrimenti sarebbe rapida ed immediata da parte dell&#8217;utente. Usatele con cura e con prudenza.<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Dai selettori avanzati al contenuto generato al ritorno trionfale dei web font e dai gradienti, alle ombre e ai bordi arrotondati fino alle animazioni vere e proprie, CSS3 \u00e8 un universo di possibilit\u00e0 creative. Nessuno pu\u00f2 guidarvi meglio tra queste galassie se non il famoso designer, autore e superstar dei CSS Dan Cederholm creatore dei noti SimpleBits e Dribbble. E&#8217; con grande piacere che vi presentiamo un estratto dal suo nuovo libro (nonch\u00e9 seconda pubblicazione di A Book Apart), citeCSS3 For Web Designers.\/cite <\/p>\n","protected":false},"author":818,"featured_media":7000599,"comment_status":"open","ping_status":"open","template":"","categories":[244,279,33],"tags":[],"coauthors":[314],"class_list":["post-122","article","type-article","status-publish","has-post-thumbnail","hentry","category-css","category-interaction-design","category-numero-19-30-novembre-2010"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/types\/article"}],"author":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/users\/818"}],"replies":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/comments?post=122"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000599"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=122"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}