CSS3: introduzione alle novità

Ok, a differenza di alcuni mesi fa, ora i tempi sono maturi per iniziare ad esplorare le novità introdotte da CSS3 e, giusto per rompere il ghiaccio, inizieremo dalle istruzioni che maggiormente si stanno diffondendo: quelle che riguardano colori, testi, ombre e bordi.

In realtà CSS3 introduce una miriade di novità, che vi illustrerò di volta in volta in articoli successivi a questo: una delle mie preferite sono le transition che, vi assicuro, riescono spesso a sostituire alla grande jQuery per animazioni, rotazioni, ecc.

Ma torniamo alle prime novità di CSS3: eh sì, per la gioia di tutti i web designer che sinora avevano solo Photoshop come alleato per applicare ombre a testi ed oggetti o realizzare bordi arrotondati, ora possiamo fare tutto con CSS3 🙂 …ma so già cosa state per chiedervi: quali browser supporteranno quanto stiamo per vedere ?

A questa domanda risponderò dopo ma vi anticipo che, a meno di voler estendere la compatibilità ad IE 6 (che è un po’ come cercare di resuscitare i morti :D), tutti gli altri browser se la cavano egregiamente, magari con alcuni accrocchi come Modernizr.

Modificatore rgba

Ma torniamo a noi: partiamo con un nuovo modificatore che riguarda, in generale, la definizione del colore per un qualunque oggetto.

Guardate le seguenti istruzioni:

background: rgba(255,255,255,0.75);

border: 1px solid rgba(255,255,255,1);

Notate qualcosa di diverso rispetto al solito ?

Rispetto alla precedente codifica (esadecimale) dei colori (#ffffff), in questo caso abbiamo utilizzato un formato basato sui valori di luminosità delle tre componenti di colore RGB in una scala da 0 a 255.

L’ultimo valore, invece, rappresenta il coefficiente “alpha” relativo all’opacità che va da 0 (trasparente) a 1 (colore pieno).

Come vedete, il modificatore rgba può essere usato in qualsiasi dichiarazione di un colore che prima era riservato al solo formato esadecimale (la seconda riga dell’esempio, infatti, lo applica al colore del bordo).

Ombra dei testi

Questa è una nuova direttiva che riesce a dare maggior risalto ai testi, ad esempio, per conferire un minimo di profondità o aggiungere ombre evidenti ad un testo.

L’istruzione è, appunto, text-shadow, vediamola in azione:

text-shadow: 0px 1px 2px #000;

Vi spiego i valori utilizzati:

  • il primo valore (in questo caso 0px) rappresenta l’offset orizzontale dell’ombra rispetto al testo: valori positivi indicano uno spostamento a destra del testo, valori negativi a sinistra.
  • il secondo valore, invece, rappresenta l’offset verticale (in questo caso 1 pixel)….anche qui: valori positivi per offset in basso rispetto al testo, valori negativi in alto rispetto al testo.
  • il terso valore è il “radius”, il raggio dell’ombra: è mio modesto parere che le famose “drop shadow”, quelle ombre enooooormi sotto al testo, siano ormai old-style 🙂 …io adoro utilizzare valori molto bassi per conferire tridimensionalità ai testi senza eccessi 😉
  • l’ultimo valore è chiaramente il colore dell’ombra, in questo caso espresso in valori esadecimali con 8bit per colore (ma avrei potuto utilizzare rgba tranquillamente ;))

Bordi arrotondati

Questa istruzione, devo dire, porta i segni della costante guerra tra i browser e, di fatto, richiede 4 istruzioni per fare praticamente la stessa cosa, ma per 4 tipologie di browser differenti.

Se volessimo arrotondare, ad esempio, di 10pixel un oggetto qualsiasi, dovremmo scrivere:

-moz-border-radius: 10px;

-khtml-border-radius: 10px;

-webkit-border-radius: 10px;

border-radius: 10px;

Le prime tre istruzioni sono specifiche per alcuni browser, l’ultima è quella che “si spera” diventi lo standard…ma per il momento sono richieste tutte e 4.

In questo esempio, però, ci siamo tenuti sul caso semplice: stesso raggio per tutti i 4 bordi dell’oggetto in questione.

Se volessimo, ad esempio, definire raggi differenti per i 4 angoli di un oggetto, avremmo:

border-radius: 5px 10px 15px 20px;

dove i valori sono, nell’ordine: top-left, top-right, bottom-right, bottom-left.

Quindi, in questo caso, avrò applicato un raggio di:

5pixel in alto a sinistra

10pixel in alto a destra

15pixel in basso a destra

20pixel in basso a sinistra

Ombra degli oggetti

Analogamente a quanto abbiamo visto per i testi, è possibile applicare un’ombra anche agli oggetti – il concetto è lo stesso applicato ai testi, con le quattro istruzioni specifiche per i singoli browser:

-moz-box-shadow: 0 1px 3px rgba(0,0,0,0.5);

-webkit-box-shadow: 0 1px 3px rgba(0,0,0,0.5);

-khtml-box-shadow: 0 1px 3px rgba(0,0,0,0.5);

box-shadow: 0 1px 3px rgba(0,0,0,0.5);

In questo esempio sto applicando un’ombra:

  • di colore nero con opacità al 50%
  • sfasata verticalmente di 1pixel
  • di un raggio di 3pixel

Modernizr, e browser supportati

Ok, tutto bellissimo: ma ora che me ne faccio di queste istruzioni se i browser più diffusi non le supportano ? …e qui entra in gioco Modernizr una libreria Javascript che estende il supporto ad HTML 5 e CSS3 a browser poco avvezzi alle novità.

Basterà infatti includere lo script di Modernizr nelle nostre pagine per applicare bordi ed ombre:

<script src=”modernizr-1.1.min.js”></script>

Discorso a parte, invece, per il modificatore rgba: purtroppo per questo non c’è Modernizr che tenga e, a costo di rinunciare all’alpha, possiamo utilizzare rgb per IE, ecco un esempio:

border: 5px solid rgb(255,255,255); /*rgba fix per IE */

border: 5px solid rgba(255,255,255,0.75);

Pixel ? ma ora non conviene usare i punti ?

Eh già, negli esempi appena riportati ho usato pixel come unità di misura per i bordi…in realtà, mentre vi scrivo, è in corso una evoluzione nei display di alcuni dispositivi, ad esempio un certo Retina Display di iPhone 4…non so se avete presente ?! un display con densità di pixel doppia rispetto al numero di punti.

Pertanto, sarà buona norma utilizzare i punti (pt) al posto dei pixel (px), ma per i dettagli vi rimando all’articolo in questione 😉

ciaooo 🙂

Retina Display: come cambia il web design

Dalla presentazione del nuovo iPhone 4 le speculazioni su come “ora tutto cambia, di nuovo” non hanno smesso di ronzarmi in testa.

All’inizio la mia prima considerazione è stata: “ok, la prima cosa che cambia è il saldo del mio conto corrente”, visto che il nuovo gioiellino costa un botto.

La seconda è stata “ma davvero dovrò impugnarlo solo con la mano destra ???” 😀

…vabbè, tralascio le polemiche su quello che accadrà in questi giorni in merito a qualche “problema di gioventù” (e mi auguro che tutto si risolva per il meglio).

Ma aldilà di questi (poco trascurabili) dettagli 🙂 …il primo vero elemento di innovazione di questo dispositivo, che non vedo l’ora di sperimentare di persona, è il display: il famigerato Retina Display, infatti, ha una risoluzione di 960×640 pixel, ovvero il DOPPIO dei pixel per ogni punto.

Cosa cambia, quindi, nella realizzazione di interfacce per questo dispositivo ?

Sostanzialmente tutto ciò che è realizzato con grafica vettoriale (quindi, elementi della gui per applicazioni native, font ed immagini vettoriali) avrà una migliore visualizzazione potendo contare, a parità di punti, di un numero doppio di pixel…e per questi elementi, tra l’altro, non è richiesta alcuna azione di ottimizzazione da parte dello sviluppatore (sia di applicazioni native che web).

Il discorso cambia, invece, per le immagini: per quest’ultime, infatti, il display dell’iPhone 4 tenderà a rappresentare immagini dalle dimensioni X,Y su un numero di pixel pari ad 2*X, 2*Y, ciò si traduce in una rappresentazione meno definita delle immagini rispetto alla risoluzione reale del display.

Per ovviare a questo problema:

  • per lo sviluppo di app native basterà creare immagini con risoluzione doppia e rinominarle adeguatamente per far sì che XCode associ automaticamente l’immagine giusta al dispositivo su cui dovrà essere visualizzata (nella documentazione di Apple per gli sviluppatori ci sono tutti i dettagli)
  • per lo sviluppo di applicazioni web, invece, lo scenario è un po’ più complesso: per ottimizzare la visualizzazione di immagini su dispositivi con risoluzione differente dai classici 72dpi, infatti, oltre che disporre delle immagini in alta risoluzione, bisognerà ricorrere all’utilizzo delle media queries del CSS3, specificando il rapporto di moltiplicazione tra il numero di punti ed il numero di pixel.

Cosa sono le media query ?
La semplifico parecchio: sono delle query ovvero dei filtri che restringono le condizioni entro cui applicare un foglio di stile (come nell’esempio che segue) o un blocco di codice CSS3.

Una buona pratica, secondo me, potrebbe essere quella di realizzare un foglio di stile ad hoc per ogni specifico dispositivo, come nel caso dell’iPhone, in cui il rapporto in questione è 2 ed includerlo nell’header della pagina, ad esempio, in questo modo:

[sourcecode language=’html’]
[/sourcecode]

In questo modo, all’interno del file 2x.css andremo a ridefinire i riferimenti ad immagini per gli elementi della pagina, con immagini specifiche per un display con densità doppia di pixel per punti, rispetto ai monitor tradizionali.

Come vedete, avendo definito la media query a livello di riferimento al file da richiamare in quella circostanza, nel file CSS basterà inserire i blocchi di istruzioni senza applicare ulteriormente le media query.

Personalmente non credo che tutti i siti web o le applicazioni web in generale richiedano un simile intervento, magari Flickr o altri siti il cui contenuto principale è costituito da immagini, questo tipo di attenzione farà la differenza ma è anche vero che, nel frattempo, il web si evolve anche sul fronte del supporto ad immagini vettoriali, canvas, ecc…motivo per cui, secondo me, questi interventi “lato CSS” tenderanno a diminuire.

E’ anche vero, però, che il Retina Display ha solcato un terreno sinora poco battuto: immagino che nei prossimi mesi/anni inizieranno a fioccare display con densità di pixel per punti ben oltre i 72dpi (dei monitor tradizionali).

…vedremo 🙂