{"id":255407,"date":"2022-12-31T09:25:00","date_gmt":"2022-12-31T06:25:00","guid":{"rendered":"https:\/\/inform.click\/rendere-performanti-i-siti-web-responsive\/"},"modified":"2022-12-31T09:25:00","modified_gmt":"2022-12-31T06:25:00","slug":"rendere-performanti-i-siti-web-responsive","status":"publish","type":"post","link":"https:\/\/inform.click\/it\/rendere-performanti-i-siti-web-responsive\/","title":{"rendered":"Rendere performanti i siti web responsive"},"content":{"rendered":"<p>\n  C'\u00e8 stato un tempo in cui potevi distinguere con sicurezza tra una pagina web desktop e una pagina web mobile. Tanto \u00e8 vero, infatti, che un intero settore \u00e8 cresciuto attorno al riutilizzo di siti desktop per dispositivi mobili.\n<\/p>\n<p>\n  Per un po' non eri nessuno se non avevi un sito mobile separato su un dominio separato. Poi le cose iniziarono a cambiare.\n<\/p>\n<p>\n  I display mobili sono migliorati oltre ogni riconoscimento. Cos\u00ec hanno fatto i browser mobili. I tablet hanno gettato un altro elemento nell'equazione. \u00c8 arrivato il 4G. I display Retina offrivano nuovi livelli di chiarezza per gli utenti finali.\n<\/p>\n<p>\n  Improvvisamente, il confine tra desktop e mobile sembrava sfocato.\n<\/p>\n<p>\n  Allo stesso tempo, c'era una crescente diversit\u00e0 nelle dimensioni e nella risoluzione dei display desktop.\n<\/p>\n<p>\n  E un mal di testa crescente per i web designer.\n<\/p>\n<p>\n  Sono finiti i giorni in cui dovevi soddisfare solo una manciata di dimensioni di viewport. Le cose si stavano complicando.\n<\/p>\n<p>\n  Fortunatamente, l'aiuto era a portata di mano sotto forma di query sui media e il concetto di responsive design.\n<\/p>\n<p>\n  Grazie alle media query, \u00e8 diventato possibile variare gli stili e il layout, persino il contenuto, a seconda della larghezza del viewport dell'utente e della risoluzione dello schermo. Naturalmente, le media query non sono affatto l'unico strumento nella borsa dei trucchi del responsive designer, ma \u00e8 giusto dire che costituiscono la base della tecnica.\n<\/p>\n<p>\n  Questa \u00e8 stata un'ottima notizia per i dispositivi mobili. Il design reattivo significava che potevi fornire in modo efficace diverse versioni dello stesso sito a dispositivi diversi. Il tutto senza sviluppare un sito mobile separato su un dominio diverso.\n<\/p>\n<h4>\n  E le prestazioni?<br \/>\n<\/h4>\n<p>\n  I proprietari dei siti stanno iniziando a rendersi conto che gli utenti finali si preoccupano delle prestazioni. I rivenditori, in particolare, stanno iniziando ad apprezzare il fatto che ridurre i millisecondi del tempo di caricamento pu\u00f2 tradursi in milioni in bilancio.\n<\/p>\n<p>\n  Fortunatamente, i siti reattivi offrono un chiaro vantaggio in termini di prestazioni rispetto ai loro cugini mobili dedicati: il reindirizzamento a un dominio mobile viene eliminato.\n<\/p>\n<p>\n  Tuttavia, nonostante ci\u00f2, il responsive design \u00e8 riuscito ad acquisire una certa reputazione per le scarse prestazioni.\n<\/p>\n<p>\n  Per certi versi, questo \u00e8 piuttosto ingiusto, ma vale la pena considerare le sfide prestazionali extra che il design reattivo pone agli incauti&#8230;\n<\/p>\n<h5>\n  immagini<br \/>\n<\/h5>\n<p>\n  I file immagine sono grandi. E poich\u00e9 sono grandi, sono spesso responsabili dei tempi di caricamento lenti. Sono quindi un buon punto di partenza per chiunque cerchi di ottimizzare le prestazioni di un sito.\n<\/p>\n<p>\n  Sfortunatamente, una delle prime soluzioni per fornire immagini in modo reattivo non era eccezionale per le prestazioni.\n<\/p>\n<p>\n  La tecnica \u00e8 meravigliosamente semplice. Basta usare max-width: 100% per assicurarsi che le immagini si ridimensionino in base alla larghezza dell'elemento contenitore:\n<\/p>\n<pre><code>img\n{\nmax-width: 100%;\n}<\/code><\/pre>\n<p>\n  Man mano che il contenitore si restringe per adattarsi a finestre pi\u00f9 piccole, tutte le immagini all'interno si ridurranno con esso. Facile!\n<\/p>\n<p>\n  Ma c'\u00e8 un problema. La dimensione dell'immagine potrebbe ridursi sullo schermo, ma la dimensione del file rimane la stessa. Questo \u00e8 tutt'altro che ideale dal punto di vista delle prestazioni. Potresti inviare un'immagine di 800 x 800 pixel lungo il filo, solo per essere visualizzata a 80 x 80 pixel: in altre parole, potresti trasmettere centinaia (o migliaia) di byte non necessari. Non solo il caricamento dell'immagine richieder\u00e0 molto tempo, ma tutti quei byte ridondanti potrebbero esaurire la preziosa quantit\u00e0 di dati dell'utente finale.\n<\/p>\n<p>\n  Tuttavia, questo non \u00e8 l'unico, e nemmeno il migliore, modo per fornire immagini reattive. Per prima cosa, un'immagine che funziona a 800 pixel di larghezza non funzioner\u00e0 necessariamente altrettanto bene a varie frazioni di quella dimensione.\n<\/p>\n<p>\n  Per risolvere questo problema, puoi utilizzare una media query per visualizzare diverse versioni dell'immagine a seconda delle dimensioni del viewport utilizzando una media query e display: nessuna.\n<\/p>\n<p>\n  <strong>CSS:<\/strong>\n<\/p>\n<pre><code>@media (min-width: 601px) {\n#croppedImage\n{\ndisplay:none;\n}\n}\n@media (max-width: 600px) {\n#largeImage\n{\ndisplay:none;\n}\n}<\/code><\/pre>\n<p>\n  <strong>codice HTML:<\/strong>\n<\/p>\n<pre><code>&lt;img id=\"largeImage\" width=\"400\" height=\"400\" alt=\"\" src=\"images\/largeImage.webp\" \/&gt;\n&lt;img id=\"croppedImage\" width=\"200\" height=\"200\" alt=\"\" src=\"images\/croppedImage.webp\" \/&gt;<\/code><\/pre>\n<p>\n  Ci\u00f2 consente di visualizzare diverse versioni di un'immagine, anzich\u00e9 solo la stessa immagine in dimensioni diverse. Tuttavia, non riduce il numero di byte. In effetti, la dimensione complessiva della pagina sar\u00e0 maggiore, poich\u00e9 verranno caricate tutte le immagini, indipendentemente dal fatto che siano visualizzate o meno.\n<\/p>\n<p>\n  Un'alternativa migliore, se pratica, \u00e8 usare immagini di sfondo al posto degli <code>&lt;img src=\"https:\/\/inform.click\/wp-content\/uploads\/2024\/11\/inform.click\" \/&gt;<\/code>elementi. Questo \u00e8 preferibile perch\u00e9 le immagini a cui si fa riferimento in CSS vengono caricate solo se vengono utilizzate (purch\u00e9 non siano URI di dati):\n<\/p>\n<pre><code>@media (min-width: 601px) {\n#largeImage\n{\nwidth:400px;\nheight:400px;\nbackground-image:url(\/images\/largeImage.webp);\n}\n#croppedImage\n{\ndisplay:none;\n}\n}\n \n@media (max-width: 600px) {\n#croppedImage\n{\nwidth:200px;\nheight:200px;\nbackground-image:url(\/images\/croppedImage.webp);\n}\n#largeImage\n{\ndisplay:none;\n}\n}<\/code><\/pre>\n<p>\n  Funziona bene: i visitatori scaricano solo le immagini di cui hanno bisogno, come e quando ne hanno bisogno. Il problema \u00e8 che \u00e8 disordinato, trattando efficacemente il contenuto come stile. In quanto tale, crea potenzialmente un problema di manutenibilit\u00e0 e potrebbe anche far s\u00ec che immagini importanti vengano ignorate dai motori di ricerca.\n<\/p>\n<p>\n  Invece, perch\u00e9 non utilizzare SVG (scalable vector graphics): un formato immagine che scala per sua stessa natura? Le immagini SVG hanno anche il vantaggio di essere facilmente stilizzate con i CSS (guarda <a href=\"http:\/\/tympanus.net\/codrops\/2014\/08\/19\/making-svgs-responsive-with-css\/\" target=\"_blank\" rel=\"noopener\">questo fantastico tutorial<\/a> su come rendere gli SVG reattivi con i CSS). Questo \u00e8 perfetto per icone e loghi, ma sfortunatamente non sarai in grado di utilizzare SVG per le foto: per questi dovrai ricorrere a formati raster, come JPEG.\n<\/p>\n<p>\n  Un'altra opzione \u00e8 utilizzare una delle numerose soluzioni JavaScript per fornire immagini reattive. Questo \u00e8 un modo popolare per farlo, ma aggiunge un altro livello di complessit\u00e0. Inoltre, poich\u00e9 JavaScript blocca la costruzione del DOM, qualsiasi soluzione che coinvolga JavaScript ha il potenziale per ostacolare il rendering. Quindi, mentre ci sono alcuni plugin molto intelligenti l\u00e0 fuori, semplicemente introducendo JavaScript nell'equazione, in una certa misura ti stai rassegnando al minore dei due mali.\n<\/p>\n<p>\n  Fino a poco tempo fa, queste erano le uniche opzioni.\n<\/p>\n<p>\n  Ora, tuttavia, gli elementi e <code>&lt;source \/&gt;<\/code>e gli attributi srcset e size stanno finalmente portando sul web immagini veramente reattive. La nuova specifica sta inoltre iniziando a ottenere il supporto del browser, con il pieno supporto in Chrome e Opera e il supporto per il cambio di risoluzione in Safari. Fino a quando gli altri browser non si mettono al passo, c'\u00e8 un eccellente <a href=\"https:\/\/scottjehl.github.io\/picturefill\/\" target=\"_blank\" rel=\"noopener\">polyfill<\/a> JavaScript .\n<\/p>\n<p>\n  In questo nuovo mondo coraggioso, puoi utilizzare srcset per impostare un elenco di immagini candidate tra cui il browser pu\u00f2 scegliere. \u00c8 quindi possibile utilizzare una media query nell'attributo sizes per dettare la dimensione a cui verr\u00e0 visualizzata l'immagine. Utilizzando l' elemento insieme alle media query all'interno di uno o pi\u00f9 elementi, puoi specificare un diverso intervallo di immagini per condizioni diverse (ad es. per finestre fino a una certa larghezza, usa l'immagine a, b o c, e per finestre pi\u00f9 grandi usa l'immagine x, y o z). Ci\u00f2 \u00e8 utile se devi fornire una versione ritagliata di un'immagine per gli utenti con schermi piccoli.\n<\/p>\n<p>\n  I dettagli precisi su come utilizzare la nuova sintassi esulano dallo scopo di questo articolo, ma puoi trovare un eccellente tutorial su <a href=\"http:\/\/alistapart.com\/article\/responsive-images-in-practice\" target=\"_blank\" rel=\"noopener\">alistapart<\/a>.\n<\/p>\n<p>\n  Forse l'unico svantaggio di questa nuova specifica \u00e8 che \u00e8 piuttosto prolisso, il che potrebbe significare HTML gonfio su pagine con molte immagini. Tuttavia, i vantaggi superano di gran lunga gli svantaggi.\n<\/p>\n<h5>\n  Caricamento di CSS di cui non hai (necessariamente) bisogno<br \/>\n<\/h5>\n<p>\n  Sebbene le media query ti permettano di applicare diverse regole CSS a seconda dei criteri che hai impostato, non c'\u00e8 scampo dal fatto che gli utenti finali dovranno scaricare tutto il CSS che potrebbe essere applicato. Questo \u00e8 vero anche se inserisci il tuo CSS in file separati e inserisci la tua media query nell'elemento\n<\/p>\n<link \/>.\n<p>\n  Ad esempio, verranno caricati entrambi i seguenti fogli di stile, indipendentemente dalla larghezza del viewport:\n<\/p>\n<link rel=\"stylesheet\" media=\"(max-width: 600px)\" href=\"css\/style1.css\" \/>\n<pre>\n<\/pre>\n<link rel=\"stylesheet\" media=\"(min-width: 601px)\" href=\"css\/style2.css\" \/>\n<p>\n  <code>Questo non \u00e8 un bug del browser. I criteri utilizzati nelle query multimediali spesso si riferiscono a cose che cambiano durante una visita a una pagina. Ad esempio, un visitatore pu\u00f2 decidere di ridimensionare la finestra del browser o ruotare il proprio tablet\/dispositivo mobile. La modifica risultante nella visualizzazione dovrebbe essere perfetta e l'invio di una richiesta per un altro file CSS sarebbe tutt'altro che ideale. Ci\u00f2 \u00e8 particolarmente vero per i dispositivi mobili, che cercano di chiudere i collegamenti radio il prima possibile per preservare la carica della batteria. Potenzialmente dover ristabilire quel collegamento quando le dimensioni del viewport cambiano potrebbe essere una cattiva notizia per la durata della batteria.<\/code>\n<\/p>\n<p>\n  <code>Tuttavia, Chrome si sforza di gestire questi diversi file in modo intelligente. Mentre tutti i file verranno scaricati, solo quello con la media query attualmente corrispondente bloccher\u00e0 il rendering. Tutti gli altri verranno caricati con priorit\u00e0 inferiore.<\/code>\n<\/p>\n<p>\n  <code>Sfortunatamente, altri browser non sono altrettanto premurosi. In Firefox, ad esempio, i file CSS inutilizzati non solo bloccano il rendering, ma bloccano anche il caricamento di altri oggetti sulla pagina.<\/code>\n<\/p>\n<p>\n  <code>Il grafico a cascata qui sotto illustra il punto. Le immagini in questa pagina non iniziano a caricarsi fino a quando il file CSS inutilizzato non \u00e8 stato scaricato completamente:<\/code>\n<\/p>\n<p>\n  <code>Puoi aggirare questo problema utilizzando JavaScript per caricare i CSS in modo condizionale ma, come abbiamo gi\u00e0 visto, JavaScript ha i suoi costi in termini di prestazioni.<\/code>\n<\/p>\n<h5>\n  <code>Che cosa significa tutto questo per le prestazioni di un sito reattivo rispetto a un sito mobile?<\/code><br \/>\n<\/h5>\n<p>\n  <code>Bene, gli utenti mobili e gli utenti desktop su un sito reattivo dovranno scaricare lo stesso CSS.<\/code>\n<\/p>\n<p>\n  <code>E ce ne sar\u00e0 di pi\u00f9 di quanto ce ne sarebbe su un sito progettato solo per desktop o dispositivi mobili.<\/code>\n<\/p>\n<p>\n  <code>Inoltre, \u00e8 pi\u00f9 probabile che un sito mobile dedicato utilizzi una versione pi\u00f9 leggera e ridotta del CSS desktop (anche se questo \u00e8 forse meno vero ora, poich\u00e9 gli utenti crescono e si aspettano un'esperienza pi\u00f9 ricca su display mobili sempre pi\u00f9 sofisticati).<\/code>\n<\/p>\n<p>\n  <code>Quindi, a parit\u00e0 di altre condizioni, sembra che ci sia qualcosa nell'argomentazione secondo cui \u00e8 probabile che un sito reattivo sia pi\u00f9 lento di un sito mobile a causa del CSS aggiuntivo richiesto. Tuttavia, fintanto che i progettisti sono consapevoli delle potenziali insidie, dovrebbero essere in grado di creare fogli di stile a caricamento rapido per un sito reattivo. In particolare \u00e8 bene:<\/code>\n<\/p>\n<ul>\n<li>\n    <code>evitare di utilizzare URI di dati per le immagini: le immagini di sfondo binarie verranno (normalmente) caricate solo se\/quando sono necessarie, ma tutti gli URI di dati verranno caricati a prescindere.<\/code>\n  <\/li>\n<li>\n    <code>mantienilo leggero: poich\u00e9 tutti i CSS devono essere scaricati, \u00e8 importante essere efficienti. Ci\u00f2 significa evitare duplicazioni e assicurarsi che le regole globali siano impostate al di fuori del CSS basato su media query.<\/code>\n  <\/li>\n<\/ul>\n<h5>\n  <code>RESS (Responsive Web Design + Componenti lato server)<\/code><br \/>\n<\/h5>\n<p>\n  <code>RESS \u00e8 un ibrido tra design reattivo e adattivo, che prevede lo sniffing dell'agente utente sul server per esaminare le caratteristiche del dispositivo client e fornire contenuti appropriati ad esso.<\/code>\n<\/p>\n<p>\n  <code>Se una delle obiezioni al design reattivo \u00e8 che implica la distribuzione di tutti i contenuti su tutti i dispositivi, perch\u00e9 non mitigare questo problema eliminando parte di quei contenuti dove \u00e8 possibile?<\/code>\n<\/p>\n<p>\n  <code>Questo pu\u00f2 avere molto senso. Se c'\u00e8 un'immagine che sai che non vorresti mai visualizzare su dispositivi il cui schermo \u00e8 al di sotto di una certa dimensione, potresti anche non inviarla a quei dispositivi, risparmiando larghezza di banda e riducendo i tempi di caricamento.<\/code>\n<\/p>\n<p>\n  <code>Inoltre, se stai utilizzando query multimediali che sai non potrebbero essere soddisfatte su determinati dispositivi, c'\u00e8 almeno un argomento per separare il tuo CSS in file diversi e caricarli in modo condizionale.<\/code>\n<\/p>\n<p>\n  <code>Vale la pena ricordare che l'intero processo non \u00e8 \"gratuito\" in termini di prestazioni. Ovviamente \u00e8 necessario eseguire del lavoro sul server, il che richiede tempo, probabilmente non abbastanza per superare i vantaggi, ma \u00e8 qualcosa di cui essere consapevoli.<\/code>\n<\/p>\n<h5>\n  <code>Il verdetto<\/code><br \/>\n<\/h5>\n<p>\n  <code>I siti responsive sono lenti?<\/code>\n<\/p>\n<p>\n  <code>Dipende cosa intendi per lento.<\/code>\n<\/p>\n<p>\n  <code>\u00c8 probabile che il sito reattivo pi\u00f9 veloce che potresti realizzare sia pi\u00f9 lento del sito mobile dedicato pi\u00f9 veloce che potresti realizzare?<\/code>\n<\/p>\n<p>\n  <code>Probabilmente.<\/code>\n<\/p>\n<p>\n  <code>Abbiamo anche visto che ci sono alcune insidie. Se non stai attento, \u00e8 facile finire per costringere gli utenti a scaricare molte immagini e CSS ridondanti, rendendo il tuo sito reattivo molto pi\u00f9 lento di quanto dovrebbe essere.<\/code>\n<\/p>\n<p>\n  <code>Tuttavia, non deve essere cos\u00ec. \u00c8 perfettamente possibile creare un sito reattivo che sia altrettanto veloce quanto deve essere e offra un'esperienza utente eccellente. E poich\u00e9 sia \u200b\u200bgli standard che i browser iniziano a mettersi al passo con ci\u00f2 che gli sviluppatori vogliono offrire, dovrebbe iniziare a diventare pi\u00f9 facile.<\/code>\n<\/p>\n<p>\n  <code>&lt;\/p&gt;\n&lt;p&gt;<\/code>\n<\/p>\n<div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">\n  <code>Fonte di registrazione: &lt;a target=\"_blank\" rel=\"noopener nofollow\" data-pssr=\"\" href=\"http:\/\/www.instantshift.com\/2015\/09\/07\/making-responsive-websites-perform\/\"&gt;instantshift.com&lt;\/a&gt;<\/code>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>C&#8217;\u00e8 stato un tempo in cui potevi distinguere con sicurezza tra una pagina web desktop e una pagina web mobile. Tanto \u00e8 vero, infatti, che un intero settore \u00e8 cresciuto attorno al riutilizzo di siti desktop per dispositivi mobili. Per un po&#8217; non eri nessuno se non avevi un sito mobile separato su un dominio separato. Poi le cose iniziarono a cambiare. I display mobili sono migliorati oltre ogni riconoscimento. Cos\u00ec hanno fatto i browser mobili. I tablet hanno gettato un altro elemento nell&#8217;equazione. \u00c8 arrivato il 4G. I display Retina offrivano nuovi livelli di chiarezza per gli utenti finali. Improvvisamente, il confine tra desktop e mobile sembrava sfocato. \u2026<\/p>\n","protected":false},"author":1,"featured_media":222114,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[199,56],"tags":[],"class_list":["post-255407","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-web-design","category-web-e-wordpress"],"_links":{"self":[{"href":"https:\/\/inform.click\/it\/wp-json\/wp\/v2\/posts\/255407","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/inform.click\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/inform.click\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/inform.click\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/inform.click\/it\/wp-json\/wp\/v2\/comments?post=255407"}],"version-history":[{"count":0,"href":"https:\/\/inform.click\/it\/wp-json\/wp\/v2\/posts\/255407\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/inform.click\/it\/wp-json\/wp\/v2\/media\/222114"}],"wp:attachment":[{"href":"https:\/\/inform.click\/it\/wp-json\/wp\/v2\/media?parent=255407"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/inform.click\/it\/wp-json\/wp\/v2\/categories?post=255407"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/inform.click\/it\/wp-json\/wp\/v2\/tags?post=255407"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}