Ottimizzazione dei siti per smartphone e tablet tramite CSS3

Ottimizzazione dei siti per smartphone e tablet tramite CSS3

Lo sviluppo di siti web è cambiato radicalmente con la forte diffusione di tablet e smartphone. Ecco alcune problematiche osservate dal punto di vista degli sviluppatori

di pubblicato il nel canale Programmi
 

Ottimizzazione dei siti per smartphone e tablet tramite CSS3 - segue

Con le Media Query si estende questo concetto e si inseriscono ulteriori condizioni e parametri, in questo modo:


media="screen and (max-device-width: 320px)"


href="low_end_smartphone.css" />
media="screen and (max-device-width: 480px)"


href="mid_end_smartphone.css" />
media="screen and (max-device-width: 720px)"

href="hi_end_smartphone.css" />
 

In questo esempio abbiamo tre diversi CSS, ottimizzati per tre fasce di smarphone compresi nelle risoluzioni orizzontali di 320, 480 e 720 pixel. Ma le tre varianti sono visualizzabili anche su PC, semplicemente ridimensionando la finestra. Il browser, infatti, sceglierà lo stile adeguato in base alla dimensione in pixel della finestra.  Questo metodo può però risultare un po’ macchinoso per chi sviluppa il frontend, perché si ritroverebbe a dover aggiornare un certo numero di file che, magari, hanno poche differenze tra loro.

Chiaramente è possibile inserire le regole comuni in un CSS di base, e poi caricare un secondo CSS in base alla risoluzione, contenente solo le variazioni. Questa soluzione è probabilmente più adeguata e minimizza anche la quantità di dati da scambiare tra il server ed il client, ma richiede comunque un certo numero di richieste GET.

In questo articolo non approfondiremo il tema delle ottimizzazioni, che sarà oggetto di un articolo futuro, ma per il momento basti sapere che spesso è più conveniente scambiare pochi file più grossi piuttosto che molti file piccoli. Per questo motivo, è possibile inglobare le Media Query all’interno di un singolo CSS valido per tutti i dispositivi.

Ad esempio, potremmo avere un file unico, chiamato “style.css”, contenente delle regole come queste:


@media screen and (max-width: 480px) {
// Schermo molto piccolo, disattiviamo la barra di navigazione
.navigation-bar {
display: none;
}
}
@media screen and (min-width: 480px) {
// Schermo di medie dimensioni, la barra è visibile
.navigation-bar {
display: block;
}
}
@media screen and (min-width: 1024px) {
// Display grande, mostriamo anche la barra laterale
.sidebar {
display: block;
}
}
 

In questo caso, solo gli elementi da modificare vengono specificati ed il processo di sviluppo e testing viene notevolmente snellito. In ultimo, è sempre possibile creare delle combinazioni di queste tecniche per ottenere il massimo della flessibilità richiesta dal particolare frontend che stiamo sviluppando. Ad esempio si possono usare le Media Query in congiunzione con degli script JS per ottenere effetti particolarmente complessi.

Un ultimo accenno va fatto riguardo alla regola, non ancora standardizzata, “viewport”. La definizione di una viewport si presenta in questo modo:


@viewport {
width: 320px;
zoom: fixed; // Zoom disabilitato
}
 

Serve a specificare una dimensione per la finestra, che può essere definita in pixel, in percentuale, o automatica in base alla larghezza effettiva dello schermo. Può essere usata in congiunzione con le Media Queries in questo modo:


@media screen and (max-width: 400px) {
@viewport { width: 320px; }
/* CSS per schermi piccoli / Vista “snapped” in Windows 8 */
}

@media screen and (min-width: 400px) and (max-width: 1024px) {
@viewport { width: 400px; }
/* CSS per schermi medi */
}

@media screen and (min-width: 1024px) {
@viewport { width: 1024px; }
/* CSS per schermi grandi */
}
 

Ad oggi, questa regola non è ancora stata ratificata, ma è stata già implementata in tutti i browser moderni. In particolare, Microsoft ne consiglia l’uso per specificare la vista “snapped” nelle applicazioni Windows Store realizzate in HTML5, ragion per cui è stata introdotta in IE10. Come tutte le regole non standardizzate, per usarle è necessario anteporre il prefisso dei vendor, ad esempio @-ms-viewport @-o-viewport @-moz-viewport e infine @-webkit-viewport.

Per ulteriori informazioni fate riferimento a questi link di approfondimento:

http://msdn.microsoft.com/en-us/library/hh708740(v=vs.85).aspx

http://www.w3.org/TR/css3-mediaqueries/

http://dev.w3.org/csswg/css-device-adapt/

Articoli precedenti:

Parte 1. Internet Explorer 10, il browser del riscatto
Parte 2. Internet Explorer 10 e la compatibilità col passato
Parte 3. Modern.ie, un nuovo strumento di testing da Microsoft

Parte 4. Supporto CSS3 in Internet Explorer 10, una panoramica

12 Commenti
Gli autori dei commenti, e non la redazione, sono responsabili dei contenuti da loro inseriti - info
magicken29 Aprile 2013, 17:01 #1
So che non c'entra tanto con l'articolo, ma giro con i debug javascript attivi ed ormai i siti, come questo, sono pieni di errori!!! Anche i siti dove ti insegnano javascript e tutto il resto sono stracarichi di errori!!!
Vi prego date un'occhiata al vostro sito! Fatelo per i poveri programmatori web che ogni giorno visitano il vostro sito. Grazie
Fire-Dragon-DoL29 Aprile 2013, 21:14 #2
Credo ci sia un errore quando viene menzionato "controlli lato server, con javascript, [...]", ammenochè non si usi nodejs, javascript è lato server =D

Dopodichè, lo standard "de facto" per media query lato javascript è modernizr:

[CODE]Modernizr.mq('only all'); // true if supported
Modernizr.mq('only screen and (max-width: 768px)') // true[/CODE]
Esempio, con la prima controlliamo se la media query è supportata, con la seconda testiamo direttamente la media query.

In questo modo non è troppo difficile creare un sistema di query javascript.

Dopodichè, da web developer, volontariamente non faccio questi controlli perché è giusto che l'utenza migliori la propria situazione browser ^^
Il_Baffo29 Aprile 2013, 23:52 #3
Originariamente inviato da: Fire-Dragon-DoL
Credo ci sia un errore quando viene menzionato "controlli lato server, con javascript, [...]", ammenochè non si usi nodejs, javascript è lato server =D

non è un errore, c'è la virgola.

escludendo i siti semi-statici, una web application con singolo frontend resposive è probabilmente più facile da gestire in 2 tier separati.
Dico ciò, in quanto si rischia di caricare il dom con elementi e script non visualizzati anche perché le stesse funzionalità di JS cambiano e non sempre jquery è sufficiente.
Poi possono cambiare i comportamenti applicativi o i path di navigazione, si pensi all'hover che con il touch screen non c'è o all'upload di file che non è possibile da mobile nella maggior parte dei casi.
Tra l'altro le media query possono portare ad un utilizzo del processore più elevato consumando inutilmente batteria.
Credo che al momento ci sia ancora da lavorare molto prima di avere una soluzione universale.
Fire-Dragon-DoL30 Aprile 2013, 00:16 #4
Originariamente inviato da: Il_Baffo
non è un errore, c'è la virgola.

escludendo i siti semi-statici, una web application con singolo frontend resposive è probabilmente più facile da gestire in 2 tier separati.
Dico ciò, in quanto si rischia di caricare il dom con elementi e script non visualizzati anche perché le stesse funzionalità di JS cambiano e non sempre jquery è sufficiente.
Poi possono cambiare i comportamenti applicativi o i path di navigazione, si pensi all'hover che con il touch screen non c'è o all'upload di file che non è possibile da mobile nella maggior parte dei casi.
Tra l'altro le media query possono portare ad un utilizzo del processore più elevato consumando inutilmente batteria.
Credo che al momento ci sia ancora da lavorare molto prima di avere una soluzione universale.


No secondo me stai andando contro il principio per il quale è nato il responsive design: gestire l'applicazione in 2 tier separati E' costoso, il responsive design nasce per ridurre questi cosi. Altrimenti avremmo continuato ad avere un sito versione "mobile" e un sito versione "desktop".

Per quanto riguarda l'ottimizzazione, è molto più importante avere un singolo grosso file javascript e un singolo grosso css che averli separati. Facendo una manciata di calcoli a livello di consumi, per "scusare" l'utilizzo di fogli css separati, si dovrebbero avere dei pesi intorno ai 300KB (calcoli molto approssimativi).
Considerando quanto cicli della cpu vengono consumanti per effettuare una nuova richiesta al server e riceverla, conviene molto di piu fare un unico CSS.

Per quanto riguarda elementi del dom non visualizzati, il responsive design si avvale appositamente di questa tecnica per ottimizzare il tutto: un elemento del DOM non visualizzato consuma nulla a livello di rendering e molto poco per essere aggiunto all'html. Supponendo che tu voglia, per questo motivo, rimuovere dei pezzi di DOM obsoleti, ti troveresti lo stesso discorso di prima, ti servono 300KB di DOM (senza considerare immagini), o comunque intorno i 100 (peso fisico dell'html) per "compensare" questa cosa, per questo risulta irrilevante.

Le media query hanno un impatto infimo sulla batteria e sul processore, visto che sono paragonabili a delle if. Ottenere lo stesso risultato col javascript è equivalente se non piu oneroso, è solo sui PC desktop che puoi ridimensionare il browser, sul mobile non esiste questa cosa, la media query viene eseguita al primo caricamento e in caso di rendering aggiuntivi della pagina web (ovvero in caso di animazioni), il tutto può essere "aggirato" con le nuove animazioni dei CSS3 tipo transform3D che garntiscono di non renderizzare nuovamente l'intera pagina.

Per quanto riguarda la presenza/mancanza del touch, il responsive design si propone come un modo di "mixare" i due design (quello mobile e quello normale), quindi per forza di cose si giunge a dei compromessi, ma comunque non sono difficili da raggiungere: non utilizzare "hover" per eventuali menu a tendina, assicurarsi che non siano necessari "tooltip" o simili per agire sul sito e cose simili. Per questo abbiamo i siti web "mobile first", che sono appunto pensati prima per il mobile.

Dopodichè, per i CSS4 è previsto un draft (che potrebbe essere spostato nei css3) delle media query che propongono appunto un modo per capire se il dispositivo è provvisto di puntatore o meno.

Detto questo concludo con:
[HTML]Il meccanismo prevede che l’utente, raggiungendo il sito principale, venga redirezionato sul sito mobile se si verificano certe condizioni (User Agent / Risoluzione schermo), e il meccanismo può essere implementato lato server, tramite JavaScript, oppure con una combinazione dei due[/HTML]

Avevo letto la frase come "implementato lato server, tramite javascript, oppure..." come fosse una precisazione della frase precedente (appunto tra due virgole), non come "questo, o quello, o quell'altro", ecco perchè non capivo bene :P
Il_Baffo30 Aprile 2013, 10:27 #5
Originariamente inviato da: Fire-Dragon-DoL
No secondo me stai andando contro il principio per il quale è nato il responsive design: gestire l'applicazione in 2 tier separati E' costoso, il responsive design nasce per ridurre questi cosi. Altrimenti avremmo continuato ad avere un sito versione "mobile" e un sito versione "desktop".

Non è un problema di pincipio ma di praticabilità.
Sulla base delle esperienze che ho avuto posso dire che fare 2 siti è meno costoso in temini di ore uomo e sbattimenti vari che fare un sito responsive (molto dinamico e cross-browser).
Lo stesso facebook o altri giganti usano dei siti paralleli per motivi prestazionali e di funzionalità diverse.

Originariamente inviato da: Fire-Dragon-DoL
Per quanto riguarda l'ottimizzazione, è molto più importante avere un singolo grosso file javascript e un singolo grosso css che averli separati. Facendo una manciata di calcoli a livello di consumi, per "scusare" l'utilizzo di fogli css separati, si dovrebbero avere dei pesi intorno ai 300KB (calcoli molto approssimativi).
Considerando quanto cicli della cpu vengono consumanti per effettuare una nuova richiesta al server e riceverla, conviene molto di piu fare un unico CSS.

Pienamente d'accordo, infatti non ho mai parlato di includere più file.

Originariamente inviato da: Fire-Dragon-DoL
Per quanto riguarda elementi del dom non visualizzati, il responsive design si avvale appositamente di questa tecnica per ottimizzare il tutto: un elemento del DOM non visualizzato consuma nulla a livello di rendering e molto poco per essere aggiunto all'html. Supponendo che tu voglia, per questo motivo, rimuovere dei pezzi di DOM obsoleti, ti troveresti lo stesso discorso di prima, ti servono 300KB di DOM (senza considerare immagini), o comunque intorno i 100 (peso fisico dell'html) per "compensare" questa cosa, per questo risulta irrilevante.

Qui mi sono spiegato male, il problema prestazionale in questo caso non è nel rendering ma nelle dimensioni del download e nei selettori jquery (per classe o per attributo) che devono comunque parsare gli elementi nascosti a meno di applicare degli scope ben precisi ai selettori.

Ho trovato un post che è molto più esplicativo di me
http://sixrevisions.com/mobile/resp...not-the-future/
Fire-Dragon-DoL30 Aprile 2013, 15:56 #6
Originariamente inviato da: Il_Baffo
Non è un problema di pincipio ma di praticabilità.
Sulla base delle esperienze che ho avuto posso dire che fare 2 siti è meno costoso in temini di ore uomo e sbattimenti vari che fare un sito responsive (molto dinamico e cross-browser).
Lo stesso facebook o altri giganti usano dei siti paralleli per motivi prestazionali e di funzionalità diverse.


Pienamente d'accordo, infatti non ho mai parlato di includere più file.


Qui mi sono spiegato male, il problema prestazionale in questo caso non è nel rendering ma nelle dimensioni del download e nei selettori jquery (per classe o per attributo) che devono comunque parsare gli elementi nascosti a meno di applicare degli scope ben precisi ai selettori.

Ho trovato un post che è molto più esplicativo di me
http://sixrevisions.com/mobile/resp...not-the-future/


Ma lo stesso articolo ti dice quello che ti sto dicendo io:

[HTML]Certainly, for types of websites with limited user interaction — such as informational sites, blogs and news sites — responsive web design is a good, and often very practical, solution.[/HTML]

A livello di costi abbiamo questa sequenza (dal più economico al più costoso):
[LIST=1]
[*]Design Classico
[*]Design Responsive
[*]2 Layout
[/LIST]

Non è possibile differentemente, proprio perchè due layout differenti vanno scritti entrambi da 0, mentre il responsive ti permette di riusare il codice del precedente.

Facebook non è un buon esempio che mi porti, hanno parecchi soldi da spendere, ovviamente possono permettersi di mantenere due layout. Il design responsive è un compromesso tra i due layout e il layout solo desktop.

Io pure ci ho messo di più la prima volta che ho fatto un layout responsive, ma poi ho iniziato ad avvalermi di librerie tipo Susy (anche se nel campo è piu famoso bootstrap, quello fa molte più cose ed è il motivo per il quale NON lo uso), che mi hanno semplificato l'approccio di moltissimo.
In aggiunta ai preprocessori tipo SCSS, diventa comodo scrivere le media query senza veramente nessuna difficoltà.

Dopodichè, grazie ai CSS framework che girano, il workflow è cambiato parecchio: la gente si lamenta di photoshop, molti lo hanno lasciato in favore di "sketch" (una app per Mac solamente, per ora), altri ancora semplicemente scrivono direttamente un prototipo, perchè sono diventati sufficientemente veloci (ovviamente il prototipo poi viene revisionato e ottimizzato).

Concludo per il problema dei selettori jquery, se usi una classe tipo quelle di bootstrap: http://twitter.github.io/bootstrap/scaffolding.html#responsive (vai in fondo a "Responsive utility classes" puoi facilmente scrivere del codice javascript "selettivo" tipo:

[CODE]$('.photobox:not(.hidden-phone)').photobox();[/CODE]

Questo per abilitare un semplice plugin javascript piuttosto carino, ovviamente è solo un esempio.

Concluco con quel che riguarda i caricamenti di immagini e cose simili, con una sintassi come i breakpoint di susy (molto carina devo dire), puoi facilmente far caricare delle immagini differenti (applicandole come sfondo) e effettivamente risparmiando in banda ( http://timkadlec.com/2012/04/media-query-asset-downloading-results/ )
Tuvok-LuR-30 Aprile 2013, 16:11 #7
mi avete fatto venire in mente questo articolo che lessi tempo fà, al tempo delle elezioni americane metteva a confronto i siti di Obama (Responsive) e Romney (siti separati).
http://mobile.smashingmagazine.com/...tial-smackdown/

La vittoria di Obama potrebbe suggerire che il primo approccio è il migliore
Fire-Dragon-DoL30 Aprile 2013, 16:18 #8
Originariamente inviato da: Tuvok-LuR-
mi avete fatto venire in mente questo articolo che lessi tempo fà, al tempo delle elezioni americane metteva a confronto i siti di Obama (Responsive) e Romney (siti separati).
http://mobile.smashingmagazine.com/...tial-smackdown/

La vittoria di Obama potrebbe suggerire che il primo approccio è il migliore


Ma non ce ne è uno "migliore" direttamente, è una questione di budget.
Lo sai quanta gente ancora mi dice "no fallo solo desktop che risparmio" e io devo portargli il marketshare dei browser per spiegargli la differenza?

Certo che col sito di romney è abbastanza "triste", nel senso che la differenza tra i due layout è talmente infima da essere ridicolo l'averne usato due differenti.
Tuvok-LuR-30 Aprile 2013, 16:38 #9
si vabbè era una battuta quella su Obama

Per quanto mi riguarda preferisco le tecniche responsive, a meno che il layout mobile debba avere un design o funzionalità completamente diverse...poi se il budget è poco bastano pochi accorgimenti per far diventare l'esperienza mobile non ottima ma quantomeno decente (spostare sidebar in alto etc...).

Poi anche all'interno del responsive stesso ci sono diverse scuole di pensiero, c'è chi sceglie il mobile-first e lavora aggiungendo e chi parte dalla versione desktop...due framework molto popolari, Foundation 4 e Bootstrap 3 stanno andando entrambi verso il primo approccio.

Poi se il mercato è quello italiani molte considerazioni vanno rivalutate perchè siamo sicuramente indietro sul mobile
Fire-Dragon-DoL30 Aprile 2013, 17:33 #10
Originariamente inviato da: Tuvok-LuR-
si vabbè era una battuta quella su Obama

Per quanto mi riguarda preferisco le tecniche responsive, a meno che il layout mobile debba avere un design o funzionalità completamente diverse...poi se il budget è poco bastano pochi accorgimenti per far diventare l'esperienza mobile non ottima ma quantomeno decente (spostare sidebar in alto etc...).

Poi anche all'interno del responsive stesso ci sono diverse scuole di pensiero, c'è chi sceglie il mobile-first e lavora aggiungendo e chi parte dalla versione desktop...due framework molto popolari, Foundation 4 e Bootstrap 3 stanno andando entrambi verso il primo approccio.

Poi se il mercato è quello italiani molte considerazioni vanno rivalutate perchè siamo sicuramente indietro sul mobile


Sono d'accordo con te.
In realtà in Italia siamo indietro su tutto il development web (quanta gente conosci che usa css preprocessor?), ed è stupida come cosa perchè la maggior parte di chi naviga in Italia lo fa su smartphone

Devi effettuare il login per poter commentare
Se non sei ancora registrato, puoi farlo attraverso questo form.
Se sei già registrato e loggato nel sito, puoi inserire il tuo commento.
Si tenga presente quanto letto nel regolamento, nel rispetto del "quieto vivere".

La discussione è consultabile anche qui, sul forum.
 
^