{"id":234,"date":"2012-02-14T14:02:33","date_gmt":"2012-02-14T13:02:33","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/immagini-responsive-quasi-funzionato-cosa-ci-serve\/"},"modified":"2012-02-14T14:02:33","modified_gmt":"2012-02-14T13:02:33","slug":"immagini-responsive-quasi-funzionato-cosa-ci-serve","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/immagini-responsive-quasi-funzionato-cosa-ci-serve\/","title":{"rendered":"Immagini responsive: perch\u00e9 hanno quasi funzionato e cosa ci serve"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2012\/02\/n44a1.jpg\" border=\"0\" width=\"217\" height=\"151\" align=\"left\" \/>\u00c8 nostro compito, in qualit\u00e0 di designer e developer, scegliere anche il pi\u00f9 apparentemente semplice task e cercare dei modi per migliorarlo . Quando Ethan Marcotte ha coniato l&#8217;espressione \u201c<a href=\"http:\/\/www.alistapart.com\/articles\/responsive-web-design\/\">responsive web design,<\/a>\u201d, ha detto che un sito web responsive \u00e8 composto da tre elementi: una griglia flessibile (flexible grid), delle immagini e dei media flessibili e le media query. Facendo cos\u00ec, ha aperto un mondo di nuove ed eccitanti componenti con cui ossessionarci. Io ho scelto le immagini flessibili.<\/p>\n<p>\u00c8 piuttosto semplice dare uno stile alle immagini per far s\u00ec che si ridimensionino fino alla dimensione dell&#8217;elemento padre aggiungendo <code>img {mag-width: 100%;}<\/code> al foglio di stile. Per usarlo in maniera efficace, tuttavia, l&#8217;immagine deve essere sufficientemente larga per ridimensionarsi a qualunque dimensione possiamo ragionevolmente aspettarci sul pi\u00f9 grande display possibile. Questo implica una gran quantit\u00e0 di overhead. Nel caso migliore \u00e8 semplicemente uno spreco. Nel caso peggiore, il mobile browser si mette le mani in tasca e si mette in un angolo, di cattivo umore, praticamente non rendendo la pagina. Un pugno di immagini stampate a vivo progettate per un display da 13&#8243; potrebbe mettere in ginocchio un dispositivo mobile su una connessione Edge.<\/p>\n<p>Sfortunatamente, non possiamo testare la larghezza di banda in nessun modo affidabile, non adesso perlomeno. Fare dei test implicherebbe probabilmente l&#8217;introduzione di un significativo download da sottoporre a misurazione, che \u00e8 molto simile a dar fuoco a qualcosa per capire esattamente quanto sia infiammabile. Quello che <strong>possiamo<\/strong> determinare con un buon grado di affidabilit\u00e0 \u00e8 la dimensione dello schermo del device e sebbene non possiamo necessariamente usare la dimensione dello schermo per fare assunzioni riguardanti la larghezza di banda, si collega direttamente a quello che stiamo cercando di ottenere: sebbene la dimensione della finestra del browser possa cambiare, non avremo mai bisogno di immagini pi\u00f9 grandi dello schermo dell&#8217;utente.<\/p>\n<p>Mentre stavamo lavorando al nuovo sito del <a href=\"http:\/\/www.bostonglobe.com\">Boston Globe<\/a>, abbiamo inventato una tecnica per attenuare la dimensione delle richieste per gli utenti che hanno una larghezza di banda limitata. Prima di descriverla, devo avvisarvi: non ha funzionato. Ma era tutto programmato.<\/p>\n<div class=\"paragrafo\">\n<h2>Come funzionavano le immagini responsive<\/h2>\n<p><a href=\"https:\/\/github.com\/scottjehl\/Responsive-Images\">Scott Jehl<\/a> ha creato in maniera brillante la tecnica delle \u201cimmagini responsive\u201d di <a href=\"http:\/\/filamentgroup.com\/\">Filament Group<\/a>. Siamo partiti dall&#8217;ipotesi che la tecnica dovrebbe garantire il risultato per i device mobili. Con un approccio mobile-first, se una qualunque delle parti del processo fallisce, l&#8217;utente dovrebbe essere ancora in grado di ricevere un&#8217;immagine rappresentativa, seppur pi\u00f9 piccola, ed evitare le richieste inutilmente grandi su un device che potrebbe avere una larghezza di banda limitata. Il progressive enhancement vince.<\/p>\n<p>Ci sono tre componenti chiave per lo script delle nostre immagini responsive: il markup, il JavaScript ed una regola di redirect server-side.<\/p>\n<p>Probabilmente non vi sorprender\u00e0 sapere che abbiamo cominciato con un tag immagine:<\/p>\n<pre><code>&lt;img src=\"mobile-size.gif\"&gt;<\/code><\/pre>\n<p>Con questo come base, stiamo garantendo che il default \u00e8 un&#8217;immagine della dimensione adatta al mobile. Mettiamo il percorso per l&#8217;immagine pi\u00f9 grande in un attributo data per accedervi facilmente con JS:<\/p>\n<pre><code>&lt;img src=\"images\/mobile-size.jpg\" data-fullsrc=\"images\/desktop-size.jpg\"&gt;<\/code><\/pre>\n<p>Adesso che entrambe le sorgenti delle immagini sono nel nostro markup, abbiamo bisogno di un modo per caricare in maniera condizionata la sorgente appropriata. Per farlo abbiamo bisogno di conoscere la dimensione dello schermo dell&#8217;utente. Fortunatamente, c&#8217;\u00e8 un modo relativamente semplice per determinare la dimensione dello schermo attraverso JavaScript usando una <a href=\"https:\/\/developer.mozilla.org\/en\/DOM\/window.screen.width\">property<\/a> nell&#8217;oggetto <code>window<\/code> nel browser: <code>window.screen.width<\/code>, sebbene anche questa <a href=\"http:\/\/tripleodeon.com\/2011\/12\/first-understand-your-screen\/\">non sia totalmente affidabile<\/a>.<\/p>\n<p>Qui incappiamo in una grande sfida: dobbiamo comunicare questa dimensione al server in tempo per rinviare la richiesta per l&#8217;originale <code>src<\/code> dell&#8217;immagine, se necessario. Il server ha bisogno di sapere la dimensione dello schermo del client prima che le nostre immagini vengano visualizzate.<\/p>\n<p>Alla fine abbiamo deciso di impostare la dimensione dello schermo in un cookie. Un cookie impostato nella head di un documento risulta pronto in tempo per il parsing del body del documento ed include le richieste delle immagini.<\/p>\n<p>Presumo che stiate rabbrividendo all&#8217;idea di una funzionalit\u00e0 dipendente da un cookie e lo capisco. Alcune delle nostre prime iterazioni includevano i tag <code>&lt;noscript<\/code> e <code>document.write<\/code>. Ho ancora gli incubi sui tag <code>base<\/code> inclusi dinamicamente. Quelli erano tempi duri e le avevamo provate tutte.<\/p>\n<p>Il nostro secondo task JavaScript era ben pi\u00f9 semplice: se lo schermo ha una dimensione superiore a quella specificata, scambiamo l&#8217;originale <code>src<\/code> di <code>img<\/code> con il percorso contenuto nell&#8217;attributo <code>data-fullsrc<\/code> e visualizziamo l&#8217;immagine pi\u00f9 grande al posto di quella pi\u00f9 piccola.<\/p>\n<p>Dal momento che la dimensione dello schermo \u00e8 adesso disponibile sul server, giocherelliamo con una soluzione che ridimensiona automaticamente l&#8217;immagine originale per adattarla allo schermo. Abbiamo deciso di non adottare questa soluzione per svariati motivi:<\/p>\n<ul>\n<li>Volevamo tenere al minimo assoluto la dipendenza server-side ed implementare solo qualcosa che potesse essere facilmente ricreato in vari  ambienti server.<\/li>\n<li>Piuttosto che ridimensionare semplicemente un&#8217;immagine esistente, abbiamo pensato che fosse pi\u00f9 importante avere la flessibilit\u00e0 di ritagliare e fare zoom sull&#8217;immagine pi\u00f9 grande in maniera da renderla ottimizzata completamente per il display su uno schermo pi\u00f9 piccolo.<\/li>\n<li>Tutte le soluzioni back-end che abbiamo sperimentato implicavano il rimpicciolimento di una grande immagine fino a che questa raggiungeva la dimensione dello schermo, cosa che ci ha fatto venire i brividi. Se la larghezza dello schermo veniva riportata in modo errato o se lo script di front-end avesse fallito, avremmo corso il rischio di sovraccaricare gli utenti con un download enorme ed inutile.<\/li>\n<\/ul>\n<p>La parte di scambio del <code>src<\/code> con JavaScript fa la parte del leone del lavoro, ma i dispositivi con schermi pi\u00f9 grandi fanno ancora richieste ridondanti, prima per l&#8217;immagine mobile, poi l&#8217;immagine a dimensione intera. Questo risulta in un effetto visivo piuttosto stridente: l&#8217;immagine pi\u00f9 piccola potrebbe essere visibile prima che quella pi\u00f9 grande prenda il suo posto. Dal momento che il <code>src<\/code> originale \u00e8 caricato quando il browser fa il parsing del tag <code>img<\/code>, non possiamo evitare quella richiesta lato client. Quello che possiamo fare \u00e8 mitigare queste richieste lato server.<\/p>\n<p>Abbiamo scritto alcune semplici regole rewrite di Apache per intercettare le richieste di immagini e controllare il cookie che avevamo impostato in precedenza. Se si verificano le condizioni del punto di rottura che avevamo specificato, avremmo ridiretto la richiesta per l&#8217;immagine di dimensione per il mobile ad una spacer gif 1&#215;1. Questo mantiene bassa la dimensione delle richieste ridondanti, specialmente una volta che sono state messe in cache dal browser e che viene impedito alle immagini la cui dimensione \u00e8 adatta al mobile di mostrarsi prima di scambiarla con l&#8217;immagine a dimensione intera. Dal momento che non vogliamo applicare questa logica ad ogni immagine in tutto il sito, abbiamo poi introdotto una seconda regola che ci permette di contrassegnare le immagini responsive: la logica di cui sopra si manifesta solo se il nome del file dell&#8217;immagine continere \u201c.r\u201d.<\/p>\n<pre><code>&lt;img src=\"images\/mobile-size.r.jpg\" data-fullsrc=\"images\/desktop-size.jpg\"&gt;<\/code><\/pre>\n<p>Grazie al nostro approccio mobile-first, avevamo una nostra piccola tecnica preparata piuttosto alla meglio. Se una qualunque delle parti dell&#8217;equazione fallisce, nessun utente viene penalizzato dal proprio contesto. Un fallimento lato client, se i cookie o il JavaScript non sono disponibili, risulter\u00e0 ad esempio in un&#8217;immagine pi\u00f9 piccola ma perfettamente rappresentativa. Un fallimento lato server implicherebbe una richiesta di un&#8217;immagine pi\u00f9 piccola prima dell&#8217;immagine a dimensione intera, ma in un contesto in cui possiamo almeno assumere una banda maggiore. Nessuno rimarr\u00e0 senza immagini indipendentemente dal proprio dispositivo, browser e caratteristiche.<\/p>\n<p>Questa \u00e8 davvero una casualit\u00e0, dal momento che entro un mese circa dal lancio di BostonGlobe.com l&#8217;approccio con le immagini responsive \u00e8 fallito.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Cosa non ha funzionato<\/h2>\n<p>Molti dei browser pi\u00f9 nuovi hanno implementato una feature di \u201cimage prefetching\u201d che permette alle immagini di essere caricate prima del parsing del body del documento. Nonostante questo metodo di caricamento sia pi\u00f9 rapido, questo va contro il nostro obiettivo. Per i nostri scopi, questa caratteristica invalida anche tutti i nostri metodi per comunicare la dimensione dello schermo al server prima che le immagini siano caricate e spezza il nostro meccanismo di redirect lato server. Potete verificarlo proprio adesso su BostonGlobe.com: senza quel redirect vedrete per un breve momento l&#8217;immagine della dimensione del mobile prima che venga caricata l&#8217;immagine a dimensione intera, ma potrebbe volerci una vista acuta e un po&#8217; di refresh di alcune pagine. Fortunatamente, questo overhead aggiuntivo si verifica solo nei desktop browser, dove la larghezza di banda \u00e8 solitamente un pensiero minore.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Quindi, adesso che si fa?<\/h2>\n<p>Un po&#8217; di tempo dopo il lancio del sito del Boston Globe, abbiamo continuato a ripetere il nostro approccio. Jason Grigsby ha fatto un incredibile lavoro documentando i dettagli di quelle prove e tribolazioni in una <a href=\"http:\/\/www.cloudfour.com\/responsive-imgs\/\">serie<\/a> di <a href=\"http:\/\/www.cloudfour.com\/responsive-imgs-part-2\/\">blog<\/a> <a href=\"http:\/\/www.cloudfour.com\/responsive-imgs-part-3-future-of-the-img-tag\/\">post<\/a>.<\/p>\n<p>Questo ci porta al giorno d&#8217;oggi, con alcune delle menti migliori del web che cercano qualcosa, qualunque cosa, che funzioni. Alcuni pensano che sia un problema irrisolvibile al momento e stanno piazzando le loro scommesse sullo user agent detection come soluzione temporanea. Sebbene questa sia una strada perfettamente percorribile nel breve periodo, io sostengo che sia insostenibile andando avanti: con il range in continua espansione di telefoni e tablet in circolazione, non possiamo sperare di mantenere una lista ragionevole di browser e dispositivi per molto tempo.<\/p>\n<p>Credo che la soluzione definitiva non dovrebbe dipendere da script o da CSS, e sicuramente su nulla che abbia a che fare con UA detection, cookie, script personalizzati nel front end o qualunque altra bravata server-side. Il nostro scopo \u00e8 quello di rappresentare e mandare il contenuto in maniera appropriata e per questo motivo credo che andrebbe risolto nel markup.<\/p>\n<p>Tuttavia, il tag <code>img<\/code> non \u00e8 adatto a questo scopo. \u00c8 efficace nel comunicare le divertenti stranezze dei gatti di casa, ma non \u00e8 adatto alla logica complessa. Fa una sola cosa e la fa bene: prende una singola sorgente di immagine e la mette sullo schermo. Se dovessimo modificare questo comportamento a livello del browser, non saremmo mai in grado di garantire che i nostri cambiamenti non introducano problemi nei browser pi\u00f9 vecchi. Per esperienza, sappiamo anche che <code>img<\/code> non lascia molto spazio (ammesso che ne lasci) per utilizzare dei polyfill per questo nuovo comportamento.<\/p>\n<p>Quello di cui abbiamo bisogno \u00e8 un nuovo pattern di markup, uno che ci permetta di specificare pi\u00f9 file sorgente, ma che specifichi ancora il markup universalmente riconosciuto come \u201ccontenuto di fallback\u201d per i browser che non riconoscono il nuovo tag. Questo dovrebbe risultarvi familiare visto che un tale pattern esiste gi\u00e0: i tag <code>video<\/code> e <code>audio<\/code>.<\/p>\n<p>Sappiamo che un tag <code>video<\/code> contiene dei riferimenti a sorgenti multiple e che possiamo specificare un contenuto di fallback all&#8217;interno del tag che sia visibile solo nei browser che non supportano <code>video<\/code> nativamente, solitamente si tratta di un video basato su Flash. Quello che potreste non sapere \u00e8 che c&#8217;\u00e8 gi\u00e0 un modo per usare le media query per determinare quale sorgente video utilizzare, sebbene il supporto da parte dei browser sia piuttosto irregolare.<\/p>\n<pre><code><br \/>&lt;video&gt;<br \/>        &lt;source src=\"high-res.webm\" media=\"min-width:800px\" \/&gt;<br \/>        &lt;source src=\"low-res.webm\" \/&gt;<br \/>        &lt;img src=\"poster.jpg\" \/&gt;<br \/>&lt;\/video&gt;<br \/><\/code><\/pre>\n<p>Da qui, non ci vuole troppa immaginazione per vedere come possiamo usare un pattern come questo.<\/p>\n<pre><code><br \/>&lt;picture&gt;<br \/>        &lt;source src=\"high-res.jpg\" media=\"min-width: 800px\" \/&gt;<br \/>        &lt;source src=\"mobile.jpg\" \/&gt;<br \/>        &lt;!-- Fallback content: --&gt;<br \/>        &lt;img src=\"mobile.jpg\" \/&gt;<br \/><br \/>&lt;\/picture&gt;<br \/><\/code><\/pre>\n<p>Potremmo avere un numero illimitato di opzioni usando le source media query: le immagini ad alta risoluzione per i display ad alta risoluzione superiori ad una certa dimensione, ad esempio. Potremmo determinare in maniera affidabile la velocit\u00e0 di connessione, un giorno potremmo addirittura essere in grado di aggiungere <code>media=\"connection-speed: edge\"<\/code> o <code>media=\"min-speed: 200kbps\"<\/code> ai nostri elementi sorgente. Se questi elementi sorgente sono implementati come da specifica HTML5, verr\u00e0 mandata una sola richiesta per quelli che combaciano con la nostra media query. Quello che otteniamo \u00e8 una singola richiesta su misura, con una flessibilit\u00e0 condizionale limitata solo da una lista di media query in continua espansione.<\/p>\n<p>Una volta che abbiamo stabilito che il markup \u00e8 la nostra base, potremmo essere in grado di utilizzare dei polyfill per il comportamento atteso nei browser che ancora non lo supportano. Se da una parte \u00e8 probabile che i polyfill implichino ancora pi\u00f9 di una richiesta, cominciare con un pattern di fallback testato e provato ci permette di applicare i polyfill a nostra discrezione.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Gi\u00e0 che ci siamo, vorrei un pony<\/h2>\n<p>Per come stanno le cose in questo momento, un certo numero di sviluppatori, me compreso, stanno dialogando con WHATWG e con vari team dei browser riguardo i dettagli di questo nuovo elemento. Un gruppo frustrato di sviluppatori che pretende un nuovo elemento non \u00e8 sicuramente niente di nuovo. Non siamo i primi e sono sicuro che non saremo gli ultimi. Infatti non siamo nemmeno i primi a raggiungere la stessa identica conclusione sull&#8217;invio delle immagini: dopo un po&#8217; di brainstorming abbiamo appreso che una soluzione molto simile alla nostra \u00e8 stata postata nella mailing list pubblica del W3C nel <a href=\"http:\/\/lists.w3.org\/Archives\/Public\/public-html\/2007Jul\/0121.html\">Luglio del 2007<\/a>, simile perfino nella semantica. Questo argomento \u00e8 stato sollevato pi\u00f9 volte nelle liste di discussione del WHATWG e del W3C ed \u00e8 morto silenziosamente ogni volta, ma mai durante un cambiamento cos\u00ec radicale nel contesto del browsing come quello che stiamo vivendo da circa un anno a questa parte e mai in un contesto cos\u00ec esaltante come il responsive web design.<\/p>\n<p>Sebbene non possiamo garantire che un elemento <code>picture<\/code> o qualcosa di simile, semantica a parte, vedr\u00e0 mai la luce del giorno, abbiamo riconosciuto che c&#8217;\u00e8 bisogno di un tale pattern di markup al momento e che un tale approccio ha un enorme potenziale nel futuro. Mi piacerebbe sapere cosa ne pensate voi.<\/p>\n<p>Illustrazioni: {carlok}<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Con un approccio mobile-first responsive design, se una qualunque parte si rompe, i vostri utenti potranno ancora ricevere un&#8217;immagine rappresentativa ed evitare un&#8217;inutilmente grande richiesta su un device che potrebbe avere una banda limitata. Tuttavia con l&#8217;implementazione da parte di molti dei browser pi\u00f9 recenti di una feature di prefetch delle immagini che permette alle immagini di essere prese prima di fare il parsing del body del documento, molti tra i pi\u00f9 illuminati web developer stanno abbandonando le immagini responsive in favore dello user agent detection, almeno come soluzione temporanea. Per noi standardisti, l&#8217;UA detection ci lascia un cattivo sapore in bocca. Soprattutto, l&#8217;UA detection diventer\u00e0 ben presto insostenibile con il crescere continuo del numero di dispositivi, esattamente come avvenne con il browser detection negli anni bui precedenti agli standard web. Quello di cui abbiamo veramente bisogno, sostiene Mat Marquis, \u00e8 un nuovo elemento di markup che funzioni nel modo in cui funziona l&#8217;elemento video di HTML5. Sembra folle? Cos\u00ec tanto che potrebbe funzionare!<\/p>\n","protected":false},"author":818,"featured_media":7000643,"comment_status":"open","ping_status":"open","template":"","categories":[279,272,59,274],"tags":[],"coauthors":[352],"class_list":["post-234","article","type-article","status-publish","has-post-thumbnail","hentry","category-interaction-design","category-layout-and-grids","category-numero-44-14-febbraio-2012","category-responsive-design"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/234","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=234"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000643"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=234"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}