{"id":168,"date":"2011-06-15T11:17:28","date_gmt":"2011-06-15T09:17:28","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/immagini-fluide\/"},"modified":"2011-06-15T11:17:28","modified_gmt":"2011-06-15T09:17:28","slug":"immagini-fluide","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/immagini-fluide\/","title":{"rendered":"Immagini fluide"},"content":{"rendered":"<p><em>Siamo lieti di presentare un estratto dal Capitolo 3 di <a href=\"http:\/\/www.abookapart.com\/products\/responsive-web-design\">Responsive Web Design<\/a> di Ethan Marcotte (A Book Apart, 2011). Questo capitolo segue quello sulle griglie fluide (fluid grids) ed amplia il discorso ivi iniziato con le immagini fluide. -Ed.<\/em><\/p>\n<p>Le cose stanno andando bene finora: abbiamo un layout basato su una griglia che non sacrifica la complessit\u00e0 per la flessibilit\u00e0. Devo ammettere che la prima volta che ho scoperto come creare una <a href=\"http:\/\/www.alistapart.com\/articles\/fluidgrids\">griglia fluida<\/a> ero piuttosto orgoglioso di me stesso!<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-0.png\" border=\"0\" \/><\/p>\n<p>Fig 3.0: La nostra griglia flessibile \u00e8 finalmente finita. Non c&#8217;\u00e8 un valore espresso in pixel a perdita d&#8217;occhio e non abbiamo dovuto lesinare sull&#8217;estetica.<\/p>\n<\/div>\n<p>Tutto a un tratto per\u00f2, come spesso capita nel web design, giunge la disperazione. Al momento, la nostra pagina \u00e8 piena di parole e poco altro. In realt\u00e0, null&#8217;altro, non \u00e8 nient&#8217;altro che testo. Perch\u00e9 questo dovrebbe essere un problema? Beh, il testo si riposiziona senza sforzi all&#8217;interno di un contenitore flessibile ma, non so se l&#8217;avete notato, sembra che Internet abbia una o due di quelle cose chiamate \u201cimmagini\u201d sparse qua e l\u00e0, solo che noi non ne abbiamo incorporata nemmeno una nella nostra griglia flessibile.<\/p>\n<p>Quindi, cosa succede quando introduciamo delle immagini a larghezza fissa nel nostro design flessibile?<\/p>\n<div class=\"paragrafo\">\n<h2>Tornare indietro, indietro al markup, markup<\/h2>\n<p>Per trovare una risposta a questa domanda, facciamo un esperimento veloce: inseriamo un&#8217;immagine direttamente nel nostro modulo blog e vediamo come risponde il layout. La prima cosa che dobbiamo fare \u00e8 trovarle un posto all&#8217;interno del markup.<\/p>\n<p>Vi ricordate il nostro piccolo <code>blockquote<\/code>, comodamente infilato nell&#8217;articolo del blog? Bene, abbiamo fin troppo testo su questa dannata pagina, quindi lo rimpiazziamo con un&#8217;immagine inserita nel testo:<\/p>\n<pre><code> \n&lt;div class=\"figure\"&gt;\n  &lt;p&gt;\n    &lt;img src=\"robot.jpg\" alt=\"\" \/&gt; \n    &lt;b class=\"figcaption\"&gt;Lo, the robot walks&lt;\/b&gt;\n  &lt;\/p&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p>Nulla di che: un elemento <code>img<\/code> seguito da una breve caption descrittiva contenuta in un elemento <code>b<\/code>. In realt\u00e0, sto utilizzando i tag <code>figure<\/code>\/<code>figcaption<\/code> di HTML5 come nomi delle classi in questa snippet, per darle una solida base semantica.<\/p>\n<p>(I lettori pi\u00f9 attenti si saranno accorti che sto usando un elemento <code>b<\/code> come hook non semantico. Ora, alcuni web designer potrebbero utilizzare al suo posto uno <code>span<\/code>, ma io preferisco la concisione di tag quali <code>b<\/code> o <code>i<\/code> per il markup non semantico).<\/p>\n<p>Fatto il markup HTML, assegniamogli delle regole CSS di base:<\/p>\n<pre><code> \n.figure {\n  float: right;\n  margin-bottom: 0.5em;\n  margin-left: 2.53164557%;  \/* 12px \/ 474px *\/\n  width: 48.7341772%;  \/* 231px \/ 474px *\/\n}\n<\/code><\/pre>\n<div class=\"illustration left half\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-1.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.1: Un&#8217;immagine appropriatamente robotica di un robot, <a href=\"http:\/\/www.flickr.com\/photos\/uberculture\/1385828839\/\">per gentile concessione di Jeremy Noble<\/a>.<\/em><\/p>\n<\/div>\n<p>Stiamo qui realizzando un grazioso effetto inset per la nostra figura: sar\u00e0 spostata sulla destra e occuper\u00e0 circa la met\u00e0 della larghezza del nostro articolo o quattro colonne della nostra griglia flessibile. Markup: ok; stile: ok. Ovviamente, tutto questo HTML e CSS \u00e8 inutile se non c&#8217;\u00e8 un&#8217;immagine disponibile.<\/p>\n<p>Ora, dal momento che voglio un bene dell&#8217;anima a voi (e ai robot), non poteva andare bene una qualunque immagine. E infatti, dopo aver perlustrato il web per molti minuti, ho trovato un robo-ritratto splendidamente imponente (fig. 3.1). La cosa meravigliosa riguardo questa immagine (a parte il fatto che si tratta di un robot, ovviamente) sta nel suo essere enorme. L&#8217;ho leggermente ritagliata, ma non l&#8217;ho ridotta in dimensioni, lasciandola alla sua risoluzione originaria di 655&#215;655. Questa immagine \u00e8 molto pi\u00f9 grande di quello che sappiamo che potrebbe essere il suo contenitore flessibile, rendendola un caso perfetto per testare la robustezza e la flessibilit\u00e0 del nostro layout.<\/p>\n<p>Quindi, mettiamo la nostra immagine sovradimensionata sul server, ricarichiamo la pagina e&#8230;oh! Ehm&#8230; Questa \u00e8 la cosa pi\u00f9 brutta che si possa trovare su internet!<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-2.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.2: La nostra immagine gigante \u00e8 gigante: il nostro layout \u00e8 rotto.<\/em><\/p>\n<\/div>\n<p>In realt\u00e0, il risultato non ci stupisce pi\u00f9 di tanto. Il nostro layout non \u00e8 rotto <em>di per s\u00e9<\/em>: il nostro contenitore flessibile funziona bene e le proporzioni delle colonne della nostra griglia sono rimaste intatte. Ma dal momento che la nostra immagine \u00e8 molto pi\u00f9 grande del div <code>.figure<\/code> che la contiene, la parte in eccesso del contenuto esce dal suo contenitore ed \u00e8 visibile all&#8217;utente. Semplicemente, non ci sono vincoli applicati all&#8217;immagine che la mettano in grado di capire che si trova in un ambiente flessibile.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Immagini fluide<\/h2>\n<p>Cosa succederebbe se introducessimo tali vincoli? E se potessimo scrivere una regola che impedisca alle immagini di sforare la larghezza dei propri contenitori?<\/p>\n<p>Beh, ecco la buona notizia: \u00e8 una cosa molto semplice da fare:<\/p>\n<pre><code> \nimg {\n  max-width: 100%;\n}\n<\/code><\/pre>\n<p><a href=\"http:\/\/clagnut.com\/sandbox\/imagetest\/\">Scoperta per la prima volta dal web designer Richard Rutter<\/a>, questa regola ci fornisce immediatamente un vincolo molto comodo per qualsiasi immagine all&#8217;interno del nostro documento. Ora, il nostro elemento <code>img<\/code> verr\u00e0 visualizzato a qualunque dimensione voglia purch\u00e9 questa sia inferiore a quella del suo elemento contenitore. Ma se succede che l&#8217;elemento <code>img<\/code> sia pi\u00f9 grande del suo container, allora la direttiva <code>max-width: 100%<\/code> forzer\u00e0 la larghezza dell&#8217;immagine alla larghezza del suo contenitore. E, come potete vedere, la nostra immagine \u00e8 andata a posto.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-3.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.3: Semplicemente includendo <code>max-width: 100%<\/code>, abbiamo impedito alla nostra immagine di uscire dal suo contenitore flessibile. Nota a margine: adoro <code>max-width: 100%<\/code>.<\/em><\/p>\n<\/div>\n<p>Inoltre, i browser moderni si sono evoluti fino al punto da riuscire a ridimensionare automaticamente le immagini in maniera proporzionale: con il ridimensionamento del nostro contenitore flessibile l&#8217;immagine si allarga o si restringe preservando il rapporto altezza-larghezza.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-4.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.4: Non importa quanto diventi largo o stretto il contenitore flessibile: l&#8217;immagine si ridimensioner\u00e0 in proporzione. Magia? Chi pu\u00f2 dirlo!<\/em><\/p>\n<\/div>\n<p>Spero che non siate gi\u00e0 stanchi di tutte queste buone notizie perch\u00e9, guarda caso, la regola <code>max-width: 100%<\/code> si pu\u00f2 applicare anche alla maggior parte degli elementi di larghezza fissa, come i video o altri rich media. Infatti, possiamo rinforzare il nostro selettore affinch\u00e9 copra altri elementi \u201cmedia-ready\u201d, in questo modo:<\/p>\n<pre><code> \nimg,\nembed,\nobject,\nvideo {\n  max-width: 100%;\n}\n<\/code><\/pre>\n<p>Sia che si tratti di un grazioso video Flash, di un qualche altro embedded media o di una semplice <code>img<\/code>, i browsers si comportano in maniera imparziale, ridimensionando il contenuto proporzionalmente nel layout flessibile. Il tutto grazie al nostro piccolo vincolo max-width.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-5.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.5: Altri media vanno d&#8217;accordo con <code>max-width: 100%<\/code>, diventando anch&#8217;essi flessibili. Ho gi\u00e0 detto che adoro <code>max-width: 100%<\/code>?<\/em><\/p>\n<\/div>\n<p>E cos\u00ec abbiamo risolto il problema delle immagini flessibili e degli altri media che si ridimensionano, giusto? Una sola regola CSS e siamo a posto?<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Perch\u00e9 questo lavoro non \u00e8 mai facile<\/h2>\n<p>E&#8217; ora di iniziare il processo di guarigione: dobbiamo passare attraverso il dolore, le lacrime, la lacerazione delle vesti e parlare di alcune questioni specifiche dei vari browser riguardanti le immagini flessibili.<\/p>\n<h3>max-width in Internet Explorer<\/h3>\n<p>La dura e spietata verit\u00e0 \u00e8 che Internet Explorer 6 ed i suoi predecessori non supportano la propriet\u00e0 <code>max-width<\/code>. IE7 e successive? Oh, \u00e8 positivamente traboccante di supporto per <code>max-width<\/code>. Ma se siete costretti a supportare il (<em>ehm<\/em>) venerabile IE6 o predecessori, il nostro approccio ha bisogno di alcune rifiniture.<\/p>\n<p>Ora, ci sono molti modi documentati per far s\u00ec che <code>max-width<\/code> funzioni in IE6. La maggior parte di questi sono JavaScript-driven, solitamente basati su un filtro di espressioni proprietarie di Microsoft per valutare dinamicamente la larghezza di un elemento e per ridimensionarlo manualmente se eccede una certa soglia. Per un esempio di questi workaround decisamente non-standard, vi raccomando <a href=\"http:\/\/www.svendtofte.com\/code\/max_width_in_ie\/\">l&#8217;ormai classico blog post di Svend Tofte su questo argomento<\/a>.<\/p>\n<p>Io? Io tendo a preferire un approccio pi\u00f9 lo-fi e CSS-driven. Mi spiego: tutti i browser moderni comprendono il vincolo <code>max-width<\/code>.<\/p>\n<pre><code> \nimg,\nembed,\nobject,\nvideo {\n  max-width: 100%;\n}\n<\/code><\/pre>\n<p>Ma in un foglio di stile separato specifico per IE6, includo la seguente regola:<\/p>\n<pre><code> \nimg,\nembed,\nobject,\nvideo {\n width: 100%;\n}\n<\/code><\/pre>\n<p>Vedete la differenza? IE6 e precedenti comprendono la regola <code>width: 100%<\/code>, invece che <code>max-width: 100%<\/code>.<\/p>\n<p>Una parola di avvertimento: siate cauti qui, perch\u00e9 queste sono regole drasticamente differenti. Laddove <code>max-width: 100%<\/code> dice alle nostre immagini di non superare mai la larghezza dei loro contenitori, <code>width: 100%<\/code> forza le nostre immagini ad <em>avere sempre<\/em> la larghezza dei loro elementi contenitori.<\/p>\n<p>Nella maggior parte dei casi questo approccio funzioner\u00e0. Ad esempio, possiamo certamente assumere che la nostra immagine sovradimensionata <code>robot.jpg<\/code> sar\u00e0 sempre pi\u00f9 larga del suo elemento contenitore, pertanto la regola <code>width: 100%<\/code> funzioner\u00e0 benissimo.<\/p>\n<p>Ma per immagini pi\u00f9 piccole come le thumbnails o come la maggior parte dei video embedded, potrebbe non essere appropriato ingrandirle alla cieca con i CSS. Se questo \u00e8 il vostro caso, allora potrebbe essere giustificata un po&#8217; pi\u00f9 di specificit\u00e0 per IE:<\/p>\n<pre><code> \nimg.full,\nobject.full,\n.main img,\n.main object {\n  width: 100%;\n}\n<\/code><\/pre>\n<p>Se non volete che la regola <code>width: 100%<\/code> venga applicata a qualunque media di larghezza fissa presente nella vostra pagina, possiamo semplicemente scrivere una lista di selettori che abbia come obiettivo alcuni tipi di immagini o video (<code>img.full<\/code>), oppure alcune aree nel vostro documento dove sapete che dovrete gestire dei media sovradimensionati (<code>.main img<\/code>, <code>.main object<\/code>). Pensate a questo elenco come ad una whitelist: se le immagini o altri media appaiono su questa lista, allora saranno flessibili, altrimenti saranno di dimensioni fisse nel loro tedioso modo orientato al pixel.<\/p>\n<p>Quindi, se state ancora offrendo supporto alle versioni legacy di Internet Explorer, una regola <code>width: 100%<\/code> applicata con attenzione pu\u00f2 far funzionare le immagini flessibili magnificamente. Ecco, abbiamo risolto un bug, ma ce ne rimane un altro.<\/p>\n<p>E ragazzi, \u00e8 una cosa ancora pi\u00f9 bizzarra.<\/p>\n<h3>Paragrafo in cui diventa evidente che Windows ci odia<\/h3>\n<div class=\"illustration right half\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-6.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.6: Visualizzata qui in IE6, la nostra immagine del robot ha sviluppato degli antiestetici <a href=\"http:\/\/it.wikipedia.org\/wiki\/Artefatto_di_compressione\" title=\"pagina wikipedia\">artefatti<\/a>. Suppongo che a Windows non interessino granch\u00e9 le nostre immagini.<\/em><\/p>\n<\/div>\n<p>Se guardate il nostro modulo blog con certi browser basati su Windows, la nostra <code>robot.jpg<\/code> \u00e8 passata dall&#8217;apparire imponente all&#8217;apparire, beh, rotta. Ma questa non \u00e8 tanto una questione dipendente da un browser quanto piuttosto dalla piattaforma: Windows non ridimensiona molto bene le immagini. Infatti, quando vengono ridimensionate tramite CSS, in Windows le immagini sviluppano rapidamente degli artefatti, che influiscono drasticamente sulla loro qualit\u00e0. E non in maniera positiva.<\/p>\n<p>Per un rapido <a href=\"http:\/\/en.wikipedia.org\/wiki\/Test_case\" title=\"pagina wikipedia in inglese\">test case<\/a>, ho inserito un&#8217;immagine piena di testo in un contenitore flessibile e ho ridimensionato l&#8217;immagine con la soluzione <code>max-width: 100%<\/code>, mentre IE6 e precedenti utilizzeranno il workaround <code>width: 100%<\/code>. Ora, nella realt\u00e0 non mettereste mai cos\u00ec tanto testo in un&#8217;immagine, ma mi serviva un esempio che illustrasse perfettamente quanto possano andare male le cose in IE7 e precedenti. Come potete vedere, l&#8217;immagine appare, se mi passate il termine tecnico, proprio orribile.<\/p>\n<p>Ma prima di abbandonare la speranza di avere immagini scalabili e flessibili, vale la pena notare che questo bug non interessa tutti i browser basati su Windows. Infatti, ne sono interessati solo Internet Explorer 7 e precedenti, cos\u00ec come Firefox 2 e precedenti sempre su Windows. I browser pi\u00f9 moderni come Safari, Firefox 3+ e IE8+ non mostrano alcun problema con le immagini flessibili. Inoltre, il bug sembra essere stato sistemato in Windows 7. Ecco altre buone notizie!<\/p>\n<div class=\"illustration left half\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-7.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.7: In alcuni browser basati su Windows, l&#8217;immagine sviluppa presto troppi artefatti per poter essere leggibile.<\/em><\/p>\n<\/div>\n<p>Quindi, definito lo \u201cscope\u201d del problema, ci sar\u00e0 sicuramente una patch che possiamo applicare! Fortunatamente c&#8217;\u00e8, con l&#8217;eccezione di Firefox 2.<\/p>\n<p>Ora, questo vecchio brizzolato browser fu rilasciato nel 2006, quindi penso sia lecito ritenere che non stia esattamente intasando i log del traffico del vostro sito. In ogni caso, una patch per Firefox 2 richiede un browser sniffing veramente intricato che miri a specifiche versioni su specifiche piattaforme e, nel migliore dei casi, il browser-sniffing \u00e8 inaffidabile. Ma anche se volessimo fare questo tipo di scoperta, queste versioni pi\u00f9 vecchie di Firefox non hanno un interruttore che possa sistemare le nostre immagini rovinate.<\/p>\n<p>Tuttavia, Internet Explorer ha tale interruttore. (Perdonatemi, abbasso la cresta per il titolo della sezione successiva)<\/p>\n<h3>Ave AlphaImageLoader, eroe conquistatore<\/h3>\n<p>Avete mai provato a far funzionare i PNG trasparenti in IE6 e precedenti? Se s\u00ec, ci sono buone probabilit\u00e0 che abbiate incontrato <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms532969.aspx\"><code>AlphaImageLoader<\/code><\/a>, uno dei filtri CSS proprietari di Microsoft. Nel tempo sono state create delle robuste patch per colmare la mancanza di supporto di IE per l&#8217;alpha channel dei PNG (la libreria <a href=\"http:\/\/www.dillerdesign.com\/experiment\/DD_belatedPNG\/\">DD_belatedPNG<\/a> di Drew Diller \u00e8 al momento una delle mie preferite), ma storicamente, se avevate un PNG come background di un elemento, potevate mettere la regola seguente in un foglio di stile specifico per IE: (gli \u201ca capo\u201d sono segnati con \u00bb, <em>Ed.<\/em>)<\/p>\n<pre><code> \n.logo {\n  background: none;\n  filter: progid:DXImageTransform.Microsoft.AlphaImageLoader\u00bb\n  (src=\"\/path\/to\/logo.png\", sizingMethod=\"scale\");\n}\n<\/code><\/pre>\n<p>La patch <code>AlphaImageLoader<\/code> fa alcune cose. Innanzitutto, rimuove l&#8217;immagine di background dall&#8217;elemento, poi la inserisce nell&#8217;oggetto <code>AlphaImageLoader<\/code> che sta \u201ctra\u201d l&#8217;effettivo layer di background ed il contenuto dell&#8217;elemento. Ma la propriet\u00e0 <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/ms532920(VS.85).aspx\"><code>sizingMethod<\/code><\/a> \u00e8 la vera trovata: impone all&#8217;oggetto AlphaImageLoader di tagliare qualunque parte dell&#8217;immagine che fuoriesca dal suo container, di trattarla come un&#8217;immagine regolare, o ridimensionarla per farla stare all&#8217;interno del suo elemento contenitore.<\/p>\n<p>Vi sento sbadigliare: cosa pu\u00f2 mai avere a che fare uno specifico IE fix per PNG con la resa disastrata della nostra immagine?<\/p>\n<p>C&#8217;entra un bel po&#8217;, come vi vado a dimostrare. Ad un certo punto ho scoperto che applicare <code>AlphaImageLoader<\/code> ad un&#8217;immagine ne migliora drasticamente la resa in IE, portandolo al livello di, beh, qualunque altro browser sul pianeta. Inoltre, impostando la propriet\u00e0 <code>sizingMethod<\/code> a <code>scale<\/code>, possiamo usare il nostro oggetto <code>AlphaImageLoader<\/code> per creare l&#8217;illusione che l&#8217;immagine sia flessibile.<\/p>\n<p>Ecco quindi che improvviso un po&#8217; di JavaScript per automatizzare il processo: <a href=\"http:\/\/unstoppablerobotninja.com\/entry\/fluid-images\">scaricate lo script<\/a> ed includetelo semplicemente in ogni pagina che abbia delle immagini flessibili. Questo analizzer\u00e0 il vostro documento per creare una serie di oggetti <code>AlphaImageLoader<\/code> flessibili e di alta qualit\u00e0.<\/p>\n<p>E con tale fix applicato, la differenza nella resa delle nostre immagini \u00e8 notevole: nel nostro esempio siamo passati da un&#8217;immagine distorta in maniera impossibile ad una resa immacolata. E funziona perfettamente in un contesto flessibile!<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-8.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.8: La nostra immagine \u00e8 ora perfettamente leggibile e si ridimensiona magnificamente. Un pizzico di <code>AlphaImageLoader<\/code> e tutto passa!<\/em><\/p>\n<\/div>\n<p>(Occorre ricordare che molti filtri proprietari di Microsoft, ed in particolare <code>AlphaImageLoader<\/code>, aggiungono un overhead alla performance. Stoyan Stefanov copre in dettaglio le insidie nello <a href=\"http:\/\/www.yuiblog.com\/blog\/2008\/12\/08\/imageopt-5\/\">YUI blog<\/a>. Cosa significa questo? Assicuratevi di testare il fix su tutto il vostro sito, valutarne l&#8217;effetto sui vostri utenti e stabilire se vale la pena migliorare il rendering a scapito della performance.<\/p>\n<p>Con il fix <code>max-width: 100%<\/code> al suo posto (e supportato dalle nostre patch <code>width: 100%<\/code> e <code>AlphaImageLoader<\/code>), la nostra immagine inserita nel testo si ridimensiona molto bene su tutti i nostri target browser. Non importa la dimensione della finestra del browser, la nostra immagine si ridimensiona in maniera armonica con le proporzioni della nostra griglia flessibile.<\/p>\n<p>E le immagini che non sono nel nostro markup?<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Rendere flessibili le immagini \u201ctiled\u201d di background<\/h2>\n<p>Supponiamo che il nostro caro e stimato designer ci abbia mandato una revisione del mockup del nostro modulo blog. Notate qualche differenza?<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-9.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.9: La sidebar del nostro blog adesso sfoggia una grafica di background. Forte!<\/em><\/p>\n<\/div>\n<p>Fino ad ora, il contenuto del nostro blog aveva uno sfondo piuttosto modesto, quasi bianco. Ma adesso il design \u00e8 stato leggermente modificato, con l&#8217;aggiunta di un background a due colori per la blog entry, cos\u00ec da avere un maggiore contrasto tra la colonna di sinistra e quella di destra. Inoltre, c&#8217;\u00e8 un sottile livello di rumore aggiunto al background che d\u00e0 una ulteriore texture al nostro design:<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-10.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.10: Un dettaglio del nostro nuovo background.<\/em><\/p>\n<\/div>\n<p>Quindi, come facciamo ad aggiungere questa nuova immagine di background al nostro template?<\/p>\n<p>Nel lontano 2004, Dan Cederholm scrisse un <a href=\"http:\/\/www.alistapart.com\/articles\/fauxcolumns\/\">articolo geniale<\/a> che dimostrava come una immagine di background ripetuta verticalmente potesse essere usata per creare l&#8217;illusione di una \u201cfalsa colonna\u201d. La genialit\u00e0 di questa tecnica sta nella sua semplicit\u00e0: allineando verticalmente un&#8217;immagine di background a colori dietro al nostro contenuto, possiamo creare l&#8217;illusione di colonne di uguale altezza.<\/p>\n<p>Nella tecnica originale di Dan, l&#8217;immagine di background veniva semplicemente centrata in cima all&#8217;area del contenuto e poi ripetuta verticalmente, in questo modo:<\/p>\n<pre><code> \n.blog {\n  background: #F8F5F2 url(\"blog-bg.png\") repeat-y 50% 0;\n}\n<\/code><\/pre>\n<p>E questa tecnica funziona benissimo. Ma la tecnica di Dan presume che il vostro design sia a larghezza fissa, cos\u00ec da poter creare un&#8217;immagine che coincida con la larghezza del vostro design. Allora, di grazia, come dovremmo infilare un&#8217;immagine di sfondo che si ripeta su due colonne flessibili?<\/p>\n<p>Grazie ad alcune <a href=\"http:\/\/stopdesign.com\/archive\/2004\/09\/03\/liquid-bleach.html\">antesignane ricerche del designer Doug Bowman<\/a>, possiamo ancora applicare la tecnica delle false colonne. Serve giusto un po&#8217; di pianificazione extra cos\u00ec come una spruzzata della nostra formula preferita: <code>obiettivo \u00f7 contesto = risultato<\/code>.<\/p>\n<p>Per prima cosa, cominceremo con l&#8217;osservare il nostro mockup per trovare il punto di transizione nella nostra immagine di background: il pixel esatto in cui la nostra colonna passa dal bianco al grigio. E per come stanno le cose, questa transizione avviene al pixel 568.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-11.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.11: La nostra colonna bianca cambia in grigio al pixel 568. Questo \u00e8 il nostro punto di transizione.<\/em><\/p>\n<\/div>\n<p>Armati di questa informazione, possiamo adesso modificare l&#8217;approccio delle \u201cfalse colonne\u201d alla nostra griglia fluida. Per prima cosa, convertiamo il punto di transizione in un valore basato su una percentuale relativo alla larghezza del nostro modulo blog. E per fare questo rientra di nuovo in gioco la nostra formula <code>obiettivo \u00f7 contesto = risultato<\/code>. Abbiamo il nostro valore obiettivo, <code>568px<\/code> e la larghezza del design, il nostro contesto, \u00e8 900px. E se inseriamo questi due valori nella nostra robusta formula, otteniamo:<\/p>\n<pre><code>568 \u00f7 900 = 0.631111111111111<\/code><\/pre>\n<p>Esatto, un altro numero impossibilmente lungo, che, convertito in percentuale d\u00e0 <code>63.1111111111111%<\/code>.<\/p>\n<p>Tenete a mente questa percentuale per un attimo. Ora, apriamo il nostro editor di immagini preferito e creiamo un documento dalla grandezza esagerata, ad esempio, da 3000 pixel di larghezza. E dal momento che ripeteremo questa immagine verticalmente, la sua altezza sar\u00e0 di soli <code>160px<\/code>.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-12.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.12: Un canvas mostruosamente largo che (a breve) faremo diventare la nostra immagine di background.<\/em><\/p>\n<\/div>\n<p>Tra un attimo trasformeremo questo documento vuoto nella nostra immagine di background. Ma perch\u00e9 \u00e8 cos\u00ec largo? Beh, questa immagine deve essere pi\u00f9 larga di quanto possiamo ragionevolmente presumere che sar\u00e0 mai larga una finestra del browser. E a meno che stiate leggendo questo testo da un monitor del XXV secolo della dimensione di una parete fatto da&#8230; che so&#8230; ologrammi o qualcosa cos\u00ec, presumo che il vostro monitor non sia cos\u00ec largo.<\/p>\n<p>Per creare le colonne, dobbiamo applicare la percentuale del punto di transizione (<code>63.1111111111111%<\/code>) al nostro nuovo e pi\u00f9 ampio canvas. Cos\u00ec, se stiamo lavorando con una immagine larga <code>3000px<\/code> dovremo solo moltiplicare questa larghezza per la percentuale, in questo modo:<\/p>\n<pre><code>3000 x 0.631111111111111 = 1893.333333333333<\/code><\/pre>\n<p>Come risultato otteniamo <code>1893.333333333333<\/code>. E siccome Photoshop non gestisce nulla che non sia un pixel intero, lo arrotondiamo a 1893 pixel. Armati di questo numero, ricreiamo la texture nella nostra immagine vuoata, passando dal bianco al grigio al pixel 1893.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-13.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.13: Abbiamo applicato la percentuale alla nostra \u201coh cos\u00ec grande!\u201d immagine di background, creando le nostre colonne pronte per essere ripetute.<\/em><\/p>\n<\/div>\n<p>In che modo tutto ci\u00f2 ci \u00e8 d&#8217;aiuto? Beh, tutto quello che abbiamo appena fatto consiste nel ridimensionare proporzionalmente il nostro punto di transizione per arrivare fino a questo nuovo, e pi\u00f9 largo, canvas. Cos\u00ec possiamo prendere il nuovo valore del pixel ed usarlo per creare le nostre colonne: la colonna bianca sar\u00e0 larga <code>1893px<\/code>, mentre la colonna grigia riempir\u00e0 quello che resta.<\/p>\n<p>Adesso ci rimane solo una cosa da fare: inserire la nostra nuovissima immagine nel foglio di stile.<\/p>\n<pre><code> \n.blog {\n  background: #F8F5F2 url(\"blog-bg.png\") repeat-y 63.1111111111111% 0;  \n  \/* 568px \/ 900px *\/\n}\n<\/code><\/pre>\n<p>Cos\u00ec come nella tecnica originale di Dan, abbiamo posizionato di nuovo l&#8217;immagine al top del nostro blog e poi abbiamo impostato la ripetizione verticale verso il basso (<code>repeat-y<\/code>). Ma il valore di <code>background-position<\/code> riutilizza la percentuale del punto di transizione (<code>63.1111111111111% 0<\/code>), facendo rimanere le colonne al loro posto al ridimensionarsi del nostro design.<\/p>\n<p>E con ci\u00f2, abbiamo delle false colonne che funzionano benissimo in un layout fluido. Il tutto grazie all&#8217;approccio originale di Dan Cederholm, potenziato con un po&#8217; di \u201cpensiero proporzionale\u201d.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2011\/06\/3-14.png\" border=\"0\" \/><\/p>\n<p><em>Fig 3.14: Le nostre false colonne flessibili.<\/em><\/p>\n<\/div>\n<h3>Immagini di background totalmente flessibili?<\/h3>\n<p>Ovviamente le nostre false colonne non sono veramente flessibili: stiamo semplicemente utilizzando le percentuali per posizionare l&#8217;immagine di background in maniera da far sembrare che le colonne si ridimensioni con il loro contenitore. Le dimensioni dell&#8217;immagine non sono affatto cambiate.<\/p>\n<p>Ma cosa succede con un&#8217;immagine di background che in effetti deve proprio ridimensionarsi assieme al layout? Ad esempio, potreste aver messo un logo come background di un elemento <code>h1<\/code>, o utilizzato le sprites per creare dei rollovers per la navigazione del vostro sito. Possiamo ridimensionare le immagini che devono vivere nel background?<\/p>\n<p>In un certo senso. C&#8217;\u00e8 una propriet\u00e0 CSS3 chiamata <a href=\"http:\/\/www.w3.org\/TR\/css3-background\/#the-background-size\"><code>background-size<\/code><\/a> che potrebbe permetterci di creare delle immagini veramente flessibili, ma, l&#8217;avrete gi\u00e0 capito, il suo supporto da parte dei browser \u00e8 piuttosto immaturo.<\/p>\n<p>Nel frattempo, ci sono alcune soluzioni piuttosto ingegnose basate su JavaScript: ad esempio, <a href=\"http:\/\/srobbin.com\/jquery-plugins\/jquery-backstretch\/\"> il jQuery plugin Backstretch<\/a> di Scott Robbin simula immagini di background dell&#8217;elemento body ridimensionabili. E, come vedrete nel prossimo capitolo, le CSS3 media query potrebbero essere usate per applicare diverse immagini di background create ad hoc per differenti range di risoluzione. Quindi, sebbene il <code>background-size<\/code> non sia ancora utilizzabili, come si suol dire, il cielo \u00e8 il limite.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Imparate come rendere flessibili le immagini a larghezza fissa e come aggiungerle alle griglie fluide per creare un sito che risponda alla dimensione della viewport senza sacrificare l&#8217;estetica. Siamo lieti di presentarvi un estratto dal nuovo libro di Ethan (nonch\u00e9 il quarto titolo di A Book Apart): emResponsive Web Design\/em.<\/p>\n","protected":false},"author":818,"featured_media":7000617,"comment_status":"open","ping_status":"open","template":"","categories":[244,247,272,43,274],"tags":[],"coauthors":[299],"class_list":["post-168","article","type-article","status-publish","has-post-thumbnail","hentry","category-css","category-html","category-layout-and-grids","category-numero-29-15-giugno-2011","category-responsive-design"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/168","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=168"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000617"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=168"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}