I Fogli di Stile - Università degli Studi dell`Aquila
Transcript
I Fogli di Stile - Università degli Studi dell`Aquila
I Fogli di Stile Dispense per il corso di Ingegneria del Web Revisione 05/11 Giuseppe Della Penna ([email protected]) Dipartimento di Informatica Università degli studi dell'Aquila Corso di Ingegneria del Web I Fogli di Stile: Compatibilità Cross-Browser I Fogli di Stile Un foglio di stile CSS è un documento di testo, costituito da una serie di regole di stile, che determina le caratteristiche visive del documento cui è associato. Un foglio di stile, in generale, può essere incorporato in un documento o collegato ad esso. In un documento HTML, i fogli di stile CSS incorporati vanno inseriti nella sezione <head> all’interno di tag <style> aventi type=“text/css”, , mentre i fogli di stile CSS collegati possono essere indicati inserendo nella sezione <head> dei tag <link> aventi type=“text/css”, rel=“stylesheet” e href=“uri_del_foglio_di_stile”. E' anche possibile incorporare una regola di stile di stile inerente uno specifico elemento scrivendola direttamente nell’attributo style dello stesso. <html> <head> <!-- foglio di stile incorporato --> <style type="text/css"> .classe2 {background-color: magenta} </style> <!-- foglio di stile collegato (esterno) --> <link rel="stylesheet" type="text/css" href="main.css"/> </head> <body> <p style="font-size: 15pt">Testo</p> </body> </html> Ogni documento HTML può avere anche più di un foglio di stile associato: le regole di ciascun foglio vengono applicate, in base ai loro criteri di attivazione, e si sommano secondo le regole di cascading. Compatibilità Cross-Browser Modalità Standards e Quirks Prima di fare esperimenti con i CSS, però, è necessario ricordare che i browser supportano due modalità di rendering: Standards mode and Quirks mode. Lo Standards mode lavora seguendo il più possibile le specifiche del W3C, quindi in maniera (quasi) indipendente dal browser, mentre il Quirks mode segue le regole di formattazione dello specifico browser, con le sue limitazioni ed estensioni. La modalità Quirks esiste per rendere i browser compatibili con i vecchi siti web, che erano sviluppati con codice molto browserdipendente. Oggi, è necessario sviluppare i nuovi siti in modalità Standards. Tuttavia, di default i browser usano la modalità Quirks. Per entrare in modalità Standards occorre inserire all’inizio del documento una dichiarazione doctype come quella che segue Per usare l’XHTML transitional: <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> Per usare l’XHTML strict: Revisione 05/11 Pagina 2/25 Corso di Ingegneria del Web I Fogli di Stile: Fogli di Stile Multipli <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> Stylesheet di Default e di Base Molti browser applicano alle proprietà dei vari elementi default diversi, corrispondenti al loro stylesheet di default. Per realizzare CSS crossbrowser, può essere utile azzerare queste differenze e creare i fogli di stile a partire da una base minima comune. Questo si può ottenere inserendo all’inizio del foglio di stile una specifica come la seguente (http://kurafire.net/log/archive/2005/07/26/starting-css-revisited): html, body, form, fieldset { margin: 0; padding: 0; font: 100%/120% Verdana, Arial, Helvetica, sans-serif; } h1, h2, h3, h4, h5, h6, p, pre, blockquote, ul, ol, dl, address { margin: 1em 0; padding: 0; } li, dd, blockquote { margin-left: 1em; } form label { cursor: pointer; } fieldset { border: none; } input, select, textarea { font-size: 100%; } Fogli di Stile Multipli Se si associano più fogli di stile per lo stesso documento, CSS in generale li combina in ordine di inclusione. In più, con HTML è possibile specificare l’inclusione condizionale di un foglio di stile (o un gruppo di fogli) in un documento in base a vari criteri: • • Il media di output Le preferenze dell’utente Media Types Quando si incorpora o collega un foglio di stile a un documento HTML, è possibile specificare nell’elemento <style> o <link> l’attributo media. Il valore di media è una lista separata da virgole di nomi di media descriptors, che identificano il tipo di output per il quale il foglio di stile è adatto: • • • • • screen (default) tty, tv, projection, handheld: indicano diversi tipi di terminali di tipo visivo print: il foglio di stile selezionato per la stampa (utile ad esempio per eliminare o combiare colori o elementi opzionali presenti nel rendering su schermo) aural, braille: rendering per sintetizzatori vocali o braille all: tutti i tipi di media <head> <!-- foglio di stile collegato (esterno) per il media schermo --> <link rel="stylesheet" type="text/css" media="screen" href="main.css"/> </head> Revisione 05/11 Pagina 3/25 Corso di Ingegneria del Web I Fogli di Stile: Regole I media types sono utili per creare fogli di stile alternativi. Infatti un foglio di stile con un particolare media verrà utilizzato dal browser solo se il documento viene renderizzato sul media indicato (schermo, stampante, ...). Si veda l’esempio sui fogli di stile alternativi presente tra il materiale online del corso Fogli di Stile Alternativi In HTML è possibile dotare di una pagina di tre diversi tipi di stile per lo stesso tipo di media: • • • Stili persistenti: sono sempre caricati dal browser. Gli stili incorporati nel documento sono sempre persistenti. Stili preferiti: si tratta gli stili di default che verranno combinati a quelli persistenti, se presenti. Uno stile preferito deve essere sempre collegato (esterno) e si indica inserendo l’attributo title=“nome_stile” all’interno del tag <link>. Stili alternativi: sono stili che possono essere caricati alternativamente a quello preferito, a seconda delle preferenze dell’utente. Devono essere sempre collegati e si indicano inserendo l’attributo title=“nome_stile” all’interno del tag <link> e modificandone l’attributo rel ad “alternate stylesheet”. <head> <!-- foglio di stile preferito --> <link rel="stylesheet" type="text/css" title="principale" href="main.css"/> <!-- foglio di stile alternativo --> <link rel="alternate stylesheet" type="text/css" title="alternativo" href="main.css"/> </head> Il browser mostra inizialmente il foglio di stile preferito insieme a quelli persistenti, e non usa quelli alternativi. L'utente può scegliere uno stile alternativo utilizzando il menu del browser (ad esempio, in Firefox, selezionando Visualizza > Stile pagina). Questa scelta non è definitiva: in generale, ricaricando la pagina, si ritorna allo stile predefinito. Si veda l’esempio sui fogli di stile alternativi presente tra il materiale online del corso Regole Una regola CSS definisce uno stile di formattazione e una classe di elementi a cui deve essere applicato. Lo stile di formattazione è a sua volta definito da una lista di proprietà valorizzate, con la sintassi proprietà: valore, poste all’interno di parentesi graffe e separate da un punto e virgola. La classe di elementi è invece definita con speciali pattern detti selettori. Un esempio di regola astratta è SEL {P1: V1 [!important]; P2: V2; P3: V3} dove P1,P2,P3 sono nomi di proprietà e V1, V2, V3 i relativi valori. Il modificatore !important, opzionale, scritto dopo il valore (ma prima del separatore) di qualsiasi proprietà, serve ad aumentare la priorità della regola durante il processo di cascading, come vedremo più avanti. Revisione 05/11 Pagina 4/25 Corso di Ingegneria del Web I Fogli di Stile: Selettori Selettori Un uso corretto dei selettori permette di rendere i fogli di stile compatti e modulari. Indicare in modo corretto gli elementi su cui applicare una certa formattazione è un esercizio importante per imparare ad usare bene i CSS. Per ciascun tipo di selettore si vedano i corrispondenti esempi commentati presenti tra il materiale online del corso Selettori Semplici Un selettore semplice è un selettore di base seguito da zero o più selettori di attributo, selettori di classe, selettori di ID , pseudo classi e pseudo elementi. I selettori di base sono due: • • Il selettore universale (*) fa match con ogni elemento. I selettori di tipo (stringhe rappresentanti nomi di elementi) fanno match con gli elementi aventi il nome corrispondente. p {color: red} /* imposta a rosso il colore del testo in tutti gli elementi p */ Selettori di Attributo Ad ogni selettore di base possono essere posposti dei selettori di attributo. I possibili selettori di questo tipo sono: • • • • [A] (l’elemento deve avere un attributo A) [A=V] (l’elemento deve avere un attributo A con valore V) [A~=V] (l’elemento deve avere un attributo A il cui valore è una lista separata da spazi contenente V) [A|=V] (l’elemento deve avere un attributo A il cui valore è una lista separata da ‘-’ contenente V) p[id] {color: red} /* imposta a rosso il colore del testo in tutti gli elementi p dotati di attributo id */ I selettori di attributo non sono supportati nelle versioni meno recenti di quasi tutti i browser. L'esempio che segue mostra come marcare visivamente in una pagina HTML il testo di lingua inglese (la lingua è indicata correttamente tramite l'attributo lang di HTML). *[lang=en] {font-variant: italic} Selettori di Classe Quando si lavora con HTML, è disponibile una speciale sintassi abbreviata, detta selettore di classe, per lavorare con l’attributo class degli elementi. Revisione 05/11 Pagina 5/25 Corso di Ingegneria del Web I Fogli di Stile: Selettori La sintassi “S.C”, applicabile a qualsiasi selettore semplice S, è equivalente a S[class~=C]. Come caso speciale, è possibile scrivere il selettore di classe da solo (mentre in generale i selettori di attributo devono seguire un altro selettore valido), sottintendendo, prima di esso, il selettore universale: .C è equivalente a *.C, cioè *[class~=C]. p.special {color: red} /* imposta a rosso il colore del testo in tutti gli elementi p di classe special */ .other {color: blue} /* imposta a blu il colore del testo in tutti gli elementi di classe other */ Selettori di ID In XML (e in HTML) è possibile assegnare ad ogni elemento un ID univoco. Questo ID può essere usato nei CSS per applicare formattazione a un elemento specifico. Il selettore ID può essere posto dopo ogni selettore di base ed ha la sintassi #ID. Il selettore S#ID fa match con l’elemento che corrisponde al selettore S ed ha l’ID specificato. E’ possibile (e molto comune) usare i selettori di ID da soli, proprio come quelli di classe, sottintendendo un selettore universale: #ID equivale a *#ID, cioè all’elemento (di qualunque tipo) avente l’ID specificato. I selettori di ID si usano spesso per formattare gli elementi principali del layout di una pagina web. Ciascun elemento (header, corso, menu, barra, ...) viene dotato di un ID univoco e quindi formattato con l'ausilio di CSS. #header {height: 100px} /* imposta la dimensione verticale del blocco co ID header */ div#menu {border: 1px solid black} * imposta il bordo della div con ID menu */ Pseudo classi Le pseudo classi permettono di identificare elementi in base ad alcune loro particolari proprietà. • • • • • • :first-child (l’elemento è il primo figlio del suo genitore) :link (l’elemento è un link non visitato) :visited (l’elemento è un link visitato) :hover (l'elemento è attualmente indicato dall’utente, ad esempio passandovi sopra il mouse) :focus (l'elemento è attualmente con focus, cioè che accetta input da tastiera) :active (l'elemento è attualmente attivato, ad esempio da un click del mouse) a:hover {color: red} /* colora di rosso il testo negli elementi a quando il mouse li sovrasta */ La pseudoclasse :hover è utilizzatissima per realizzare animazioni al passaggio del mouse, ad esempio righe di una tabella che si evidenziano o sottomenu che appaiono quindi il mouse passa sopra di essi. Si veda l'esempio del menu css statico presente tra il materiale online del corso Tuttavia, Internet Explorer l'imita tuttora l'uso di questa pseudoclasse ai soli elementi a (link). Questo significa che, per ottenere degli effetti di animazione css anche in internet explorer, è necessario che l'oggetto da animare sia in qualche modo incluso all'interno di un link. Sono stati Revisione 05/11 Pagina 6/25 Corso di Ingegneria del Web I Fogli di Stile: Selettori sviluppate molte tecniche per ovviare a questo problema. Si vedano ad esempio i menu popup CSS crossbrowser sul sito CSSPlay. Pseudo elementi E’ infine possibile applicare formattazione ad elementi fittizi, non propriamente facenti parte del documento e/o delimitati da tag. Questi elementi si chiamano pseudo elementi. • • • :first-line (la prima riga del blocco di testo contenuto nell’elemento) :first-letter (il primo carattere del blocco di testo contenuto nell’elemento) :before, :after (indicano le posizioni precedente e successiva all’elemento. Si usano un congiunzione con la proprietà CSS content) p:first-letter {font-size: 110%} /* aumenta la dimensione della prima lettera di ogni paragrafo */ Combinazioni di Selettori Due selettori S e T possono essere combinati in un terzo selettore in vari modi. Se S e T sono due selettori, allora possiamo scrivere anche i seguenti selettori composti: • • • • S T (spazio intermedio) Questo selettore fa match con gli elementi indicati da T solo se sono discendenti di un elemento che fa match con S S>T Questo selettore fa match con gli elementi indicati da T solo se sono figli di un elemento che fa match con S S+T Questo selettore fa match con gli elementi indicati da T solo se seguono immediatamente un elemento che fa match con S, e condividono con questo lo stesso genitore. S, T Questo selettore fa match con gli elementi indicati da S e da T (or logico o raggruppamento di selettori) h1,h2,h3 {color: red} /* colora di rosso il testo dei titoli di livello 1-3 */ div#menu a {color: blue} /* colora di blu il testo degli elementi a all'interno della div con ID menu */ Attenzione, però: i selettori composti che utilizzano "+" e ">" sono la caratteristica dei selettori CSS meno supportata dai browser meno recenti (e in alcuni casi anche da quelli recenti), quindi vanno usati con estrema cautela! L'uso corretto dei selettori CSS permette di ottenere facilmente effetti molto interessanti. Si veda l'esempio del menu css statico presente tra il materiale online del corso, in cui una lista non ordinata viene trasformata da CSS in un menu multilivello animato. Per ora si osservi solo la forma dei selettori, più avanti illustreremo le proprietà di stile che realizzano la formattazione. Revisione 05/11 Pagina 7/25 Corso di Ingegneria del Web I Fogli di Stile: Calcolo dei Valori delle Proprietà di Stile Calcolo dei Valori delle Proprietà di Stile Durante il rendering, CSS deve determinare lo stile da assegnare a ciascun elemento del documento. Questo implica calcolare il valore di ogni singola proprietà di stile che l’elemento può avere. Per determinare il valore di una specifica proprietà P per un elemento E, CSS applica le regole seguenti, nell'ordine: 1. Cascading La proprietà ha uno stile specificato tramite regole CSS? 2. Ereditarietà Se le proprietà non è specificata, può essere ereditata dall’elemento padre? 3. Valore di default In caso nulla sia applicabile, la proprietà assume inizialmente il valore dato dallo stylesheet di default. Vediamo ora come funzionano queste regole. Cascading In un foglio di stile (o nell'insieme dei fogli di stile associati a un documento) è possibile (e a volte molto utile) che esistano più regole che fanno match con gli stessi elementi. Inoltre CSS prevede, oltre ai fogli di stile dati dall’autore, altri due fogli di stile da considerare: • • Foglio di stile utente. L’utente può fornire delle regole di stile implicite, come ad esempio la dimensione di base dei caratteri, tramite le opzioni del browser. Foglio di stile del browser. Ogni browser deve avere un suo foglio di stile di default, che determina la visualizzazione di base di ogni elemento HTML. Quando CSS calcola il valore di ogni singola proprietà di stile, prende in considerazione tutte le regole che fanno match (tramite il loro selettore) con l’elemento da formattare in tutti i fogli di stile, e ne seleziona una sola con il metodo della cascata. In particolare, quando più regole fanno match con lo stesso elemento, l’effettivo valore di ciascuna proprietà viene selezionato confrontando (in ordine di importanza) la priorità di origine, la specificità e l'ordine di definizione delle regole e selezionando quella che risulta avere maggior peso. La Priorità di origine di una regola è determinata dalla lista che segue: 1. 2. 3. 4. 5. Valore !important del foglio di stile utente Valore !important del foglio di stile autore Valore del foglio di stile autore Valore del foglio di stile utente Valore di default del foglio di stile del browser Quindi una proprietà dichiarata !important dall'utente (ad esempio, l'impostazione della dimensione base del carattere in alcuni browser) è prioritaria rispetto a qualsiasi foglio di stile creato dall'autore della pagina. D'altra parte, tutte le proprietà non !important definite dall'utente sono meno prioritarie di quelle definite dall'autore. I valori di default del browser sono i meno Revisione 05/11 Pagina 8/25 Corso di Ingegneria del Web I Fogli di Stile: Calcolo dei Valori delle Proprietà di Stile prioritari. In base alla lista precedente, quindi, il browser è in grado di attribuire una priorità ad ogni regola. Se a questo punto esiste una sola regola con priorità massima, viene selezionata. Se, invece, ci sono più regole con la stessa priorità massima, il browser prova a distinguerle tramite la loro specificità. La specificità di una regola è determinata da quanto essa indichi con precisione l'oggetto a cui sta per essere applicata: 1. Un selettore più specifico per un determinato elemento ha la precedenza su uno più generico. 2. In HTML, le regole inserite nell’attributo style dell’elemento sono considerate con la massima specificità. Quindi, ad esempio, una regola con selettore p.cl (paragrafo di classe cl) ha la meglio sulle una regole con selettore .cl o p quando deve essere applicata a un paragrafo di classe cl. Nello stesso caso, il selettore .cl ha la meglio sul selettore p in quanto meno generico. p {color: red; font-size: 18pt;} .cl {color: blue; background-color: green; } p.cl{background-color: olive} ... <p class="cl">TEST</p> Nell'esempio, viene selezionato il valore blue come color, una font-size di 18 punti e un colore di fondo oliva. Se due o più regole hanno la stessa priorità e la stessa specificità, viene infine preso in considerazione il loro ordine di dichiarazione: una regola ha la precedenza su tutte quelle che la precedono. Ereditarietà Molte proprietà (si veda la specifica CSS) vengono automaticamente ereditate dai figli di un elemento, se non esistono regole specifiche che ne calcolano un valore diverso tramite la cascata. Questo comportamento di default è molto utile quando si creano fogli di stile complessi. Ad esempio, se si specifica un font per i tag p, tutti i tag in esso contenuti (ad esempio b) avranno lo stesso font, a meno che non venga loro assegnato (globalmente o individualmente) uno stile che specifichi un font diverso. E’ inoltre possibile forzare l’ereditarietà di una proprietà specificando (ove possibile) la parola chiave inherit come valore della proprietà stessa. p {background-color: blue; color: white; border-top: 10px solid olive} b {color: red} i {border: inherit} Nell'esempio, i paragrafi e gli elementi b,i in essi nidificati avranno tutti sfondo blu. I tag b avranno testo rosso, mentre tutto il resto del testo nel paragrafo (compreso quello nei tag i) sarà bianco. I tag p e i, infine, avranno un bordo superiore di 10 pixel. Dopo aver visto tutte le regole di selezione usate dai CSS, è utile per esercizio leggere il sorgente dell'esempio cascading ed ereditarietà presente tra il materiale online del corso, e verificare se si è in grado di prevedere che attributi avranno nel browser i vari elementi della pagina. Provate anche a cercare differenze di rendering della stessa pagina tra browser diversi! Revisione 05/11 Pagina 9/25 Corso di Ingegneria del Web I Fogli di Stile: Elementi Base del Linguaggio CSS Elementi Base del Linguaggio CSS Vediamo ora alcune regole di base utilizzate per esprimere i valori delle proprietà CSS. Da questo punto in poi, è possibile avvalersi dello script CSS explorer, presente tra il materiale online del corso, oltre che degli esempi via via indicati, per testare interattivamente le proprietà di stile e il loro effetto sugli elementi. Misure ed Unità di Misura Le misure vengono espresse nel linguaggio CSS da numeri (anche decimali, e in alcuni casi negativi) seguiti immediatamente dal codice dell’unità di misura. Inserire uno spazio tra il numero e il codice rende di solito non valida la proprietà! Tuttavia, la misura zero può essere specificata anche senza un codice di unità. Esempi di kisure valide sono, ad esempio, 0, 3mm, 4px, -2in, 80%. Esistono due classi di unità di misura: relative e assolute. Le unità relative sono em (font-size attuale), ex (x-height attuale) e px (pixel del dispositivo). Sono molto indicate nel caso in cui si desideri far adattare automaticamente le dimensioni al dispositivo e alle sue impostazioni (es. stampante o browser con varie dimensioni di carattere). Infatti, ad esempio, 1em corrisponde alla corrente dimensione del font, quindi la sua effettiva misura può variare se la dimensione carattere del browser viene aumentata dall'utente o da altre regole del foglio di stile, facendo adattare di conseguenza anche le strutture che ospitano il testo. Le unità assolute sono in (pollici), cm (centimetri), mm (millimetri), pt (punti = 1/72 di pollice), pc (pica = 12 punti) . Sono utili solo quando il dispositivo di output è unico e precisamente definito. In molti casi, le misure possono anche essere espresse come percentuali. La misura di riferimento è di solito quella della stessa proprietà nell’elemento contenitore. Colori Il colori possono essere definiti nel linguaggio CSS tramite la specifica numerica RGB o attraverso il loro nome proprio. Le specifica RGB permette di definire qualsiasi colore attraverso il valore delle sue tre componenti rossa, verde e blu. Le stringhe RGB esadecimali hanno la forma #RRGGBB, in cui ciascuna coppia di cifre rappresenta il valore esadecimale della rispettiva componente. Ad esempio, #FFFFFF rappresenta il colore bianco. La forma abbreviata #RGB rappresenta il numero in cui ogni componente ha come valore quello della cifra corrispondente ripetuto per due volte: quindi #FFF è uguale all'esempio visto sopra. Le stringhe RGB decimali, invece, si ottengono utilizzando il costrutto rgb(R,G,B), dove R, G e B sono numeri compresi tra 0 e 255 o percentuali (intese come frazioni del valore massimo 255). In questo caso il colore bianco si scrive rgb(255,255,255). Infine, i colori per cui è definito un nome proprio sono maroon (#800000), red (#ff0000), orange (#ffA500), yellow (#ffff00), olive (#808000), purple (#800080), fuchsia (#ff00ff), white #ffffff, lime (#00ff00), green (#008000), navy (#000080), blue (#0000ff), aqua (#00ffff), teal (#008080), black (#000000), silver (#c0c0c0) e gray (#808080). Revisione 05/11 Pagina 10/25 Corso di Ingegneria del Web I Fogli di Stile: Bordi Shortand Properties Il linguaggio CSS dispone di molte proprietà che spesso vengono impostate in gruppo, come ad esempio le tre proprietà che definiscono un bordo (colore, spessore, stile) o le proprietà di un font (famiglia, dimensione, peso, …). Per questo motivo, sono disponibili anche le cosiddette proprietà shortand, che permettono, con la loro particolare sintassi, di impostare con una sola operazione i valori di diverse proprietà. Nell’impostare una proprietà shorthand, i valori di ogni singola proprietà “componente” vengono scritti di seguito, separati da uno spazio. L’ordine non è di solito significativo, in quanto non esistono ambiguità nel linguaggio. Se una o più proprietà vengono omesse nell’impostazione shorthand, il loro valore è considerato quello di default. Ad esempio, la proprietà CSS font può essere usata per impostare contemporaneamente tutte le proprietà font-style, font-variant, font-weight, font-size, line-height e font-family. Per impostare un bordo uniforme intorno a un elemento, si può scrivere border: 1px solid black oppure border-left: 1px solid black border-right: : 1px solid black border-top: 1px solid black border-bottom: : 1px solid black oppure border-left-width: 1px border-left-style: solid border-left-color: black border-right-width: 1px border-right-style: solid border-right-color: black border-top-width: 1px border-top-style: solid border-top-color: black border-bottom-width: 1px border-bottom-style: solid border-bottom-color: black Bordi La maggior parte degli elementi possono essere dotati di un bordo sui quattro lati del loro box. Ogni bordo può possedere differenti caratteristiche (colore, spessore, stile). E’ inoltre possibile, nel caso dei bordi delle tabelle, specificare come i bordi adiacenti debbano combinarsi. Nota: I bordi delle tabelle specificati tramite CSS sono indipendenti da quelli mostrati tramite l’attributo border di <table>. • • I colori dei bordi possono essere specificati, come di consueto, tramite nomi simbolici (ad es. white), o tramite le loro componenti rgb in esadecimale (ad es. #FFFFFF) o decimale (ad es. rgb(255,255,255)). Lo spessore dei bordi è invece un valore che può essere specificato in una qualsiasi delle unità di misura accettate dai CSS (ad es. px, pt, mm, …) Revisione 05/11 Pagina 11/25 Corso di Ingegneria del Web • I Fogli di Stile: Bordi I principali stili per i bordi sono dotted, dashed, solid, double, groove, ridge, inset, outset. Tuttavia, la maggior parte dei browser supporta solo solid, dotted e dashed. #e {border: 1px solid black} /* imposta un bordo solido, nero dello spessore di 1 pixel intorno all'elemento con ID e */ Per tutte le proprietà esistono degli shorthand che permettono di impostare gli stessi valori per tutti i lati contemporaneamente e/o di specificare le tre proprietà (colore, spessore, stile) con un’unica istruzione. Molto spesso è richiesta la realizzazione di bordi arrotondati. Questo in CSS2 non è possibile, tuttavia esistono varie tecniche per ottenere lo stesso risultato. Tra il materiale del corso sono esposti tre esempi di questo tipo: il primo esempio utilizza delle piccole immagini per realizzare gli angoli smussati, ed è quindi più difficile da realizzare e mantenere, sebbene rappresenti la tecnica attualmente più diffusa. Un esempio alternativo utilizza invece solo i bordi CSS con qualche piccolo trucco per realizzare l’illusione degli angoli smussati. Infine, è possibile usare, con opportuni accorgimenti di portabilità, anche le nuove proprietà di stile CSS3 per ottenere questo effetto. Proprietà CSS per i Bordi • • • • • proprietà: border shorthand per border-top, border-right, border-bottom, border-left valori: {spessore, stile, colore} proprietà: border-color shorthand per border-top-color,border-right-color,border-bottom-color,border-left-color valori: colore | transparent proprietà: border-style shorthand per border-top-style,border-right-style,border-bottom-style,border-left-style valori: none | nome stile bordo | inherit proprietà: border-width shorthand per border-top-width,border-right-width,border-bottom-width,border-left-width valori: misura proprietà: border-collapse determina in che modo i bordi di elementi adiacenti (ad esempio le celle di una tabella) saranno visualizzati. Il valore collapse li collassa in un bordo solo, mentre separate li mostra entrambi affiancati. valori: collapse | separate elementi su cui è applicabile: tabelle ed elementi interni inline Si vedano gli esempi tra le proprietà comuni CSS presenti tra il materiale online del corso. E' anche possibile effettuare prove interattive tramite il CSS explorer. Nuove Proprietà Introdotte dai CSS3: Bordi Smussati Il CSS3 introducono molte nuove proprietà riguardanti i box e i loro bordi. Tuttavia, non essendo ancora del tutto supportate, queste proprietà vanno usate con cautela e applicando opportuni accorgimenti per massimizzarne la resa crossbrowser. In particolare, per realizzare bordi con angoli smussati è possibile usare le proprietà che seguono: Revisione 05/11 Pagina 12/25 Corso di Ingegneria del Web • • I Fogli di Stile: Sfondo proprietà: border-top-left-radius, border-top-right-radius, border-bottom-left-radius, border-bottom-right-radius valori: misura | misura misura determina il raggio di curvatura dell’angolo indicato dalla proprietà. Se si specifica un solo valore, il raggio orizzontale sarà uguale a quello verticale (cioè l’angolo sarà circolare), altrimenti è possibile specificare separatamente questi due valori (generando bordi ellittici). proprietà: border-radius valori: misura{1,4} | misura{1,4} / misura{1,4} determina il raggio di curvatura di tutti gli angoli contemporaneamente. Nella prima versione, le misure fornite rappresentano il raggio (orizzontale e verticale) di ciascun angolo. Se se ne specificano meno di quattro, le restanti saranno dedotte (ad esempio, se si specifica una sola misura, verrà usata per tutti gli angoli). Nella seconda versione, le misure poste prima del simbolo “/” rappresentano i raggi orizzontali, mentre quelle poste dopo di esso indicano i raggi verticali. Purtroppo queste proprietà non sono interpretate correttamente neppure da alcune versioni di Firefox e di Chrome. Per sanare il più possibile questa situazione, è possibile inserire nei fogli di stile, oltre alle proprietà suddette, anche le loro versioni “proprietarie” dei vari browser, in modo che ciascuno “veda” il comando che gli è più congeniale. Per fortuna, queste proprietà specifiche hanno la stessa sintassi di quelle standard appena viste: quelle usate da Firefox si ottengono anteponendo la stringa “-moz-“ al nome della proprietà, mentre quelle usate da Chrome e Safari usando il prefisso “-webkit-“. Riassumendo, l’esempio che segue mostra come realizzare un tipico bordo arrotondato su un box: .roundbox { border: 1px solid #8AAFE1; border-radius:5px; -moz-border-radius:5px; -webkit-border-radius:5px; } Sfondo Tutti gli elementi di tipo blocco possono essere dotati di uno sfondo, costituito da un colore solido o da un’immagine. Nel caso di sfondi costituiti da immagini, il file da utilizzare deve essere indicato tramite il costrutto url(‘…’), il cui argomento deve essere una URL valida (anche relativa alla posizione del foglio di stile CSS sul filesystem), ed è possibile specificare: • • • In che posizione far apparire l’immagine rispetto all’elemento di cui è sfondo. Se l’immagine dovrà essere ripetuta per riempire l’intera superficie messa a disposizione dall’elemento. Se l’immagine debba “scorrere” insieme al contenuto della finestra o rimanere fissa. #e {background-color: red} ID e */ Revisione 05/11 /* imposta uno sfondo rosso per l'elemento con Pagina 13/25 Corso di Ingegneria del Web I Fogli di Stile: Sfondo E' spesso utile specificare un colore di fondo anche quando si utilizza un'immagine di sfondo. Infatti, l'immagine viene sovrapposta al colore, quindi si può usare il riempimento dato dal colore di sfondo per sostituire l'immagine mentre è ancora in fase di caricamento, senza far degradare troppo l'aspetto visuale, o per "estendere" l'immagine collegandosi al suo colore di fondo. Grazie all’elevata versatilità degli sfondi, questi vengono spesso utilizzati per scopi impropri, ad esempio per creare effetti grafici (bottoni, elementi strutturali della pagina, ecc) che non sarebbero realizzabili importando semplicemente le immagini tramite il costrutto <img> di HTML. Proprietà CSS per lo sfondo • • • • • proprietà: background-color colore di fondo valori: colore | transparent proprietà: background-attachment ancoraggio dello sfondo. Determina se l'immagine di fondo si muove quando il suo contenitore viene scrollato (ad esempio tramite una barra di scorrimento) valori: scroll | fixed | inherit (scrolla con la pagina | resta fisso rispetto alla pagina | eredita il comportamento dell'elemento genitore) proprietà: background-image definisce l'immagine di fondo, posizionata al di sopra del colore di fondo valori: url | none | inherit (inserisci come sfondo il file grafico dato | nessuna immagine) proprietà: background-position definisce la posizione dell’immagine di fondo, orizzontale e verticale valori: top left | top center | top right | center left | center center | center right | bottom left | bottom center | bottom right | inherit proprietà: background-repeat imposta l'estensione dell’immagine di fondo: se l'immagine è più piccola dell'area che dovrebbe coprire, viene ripetuta più volte valori: repeat | repeat-x | repeat-y | no-repeat | inherit (ripeti l'immagine in orizzontale e verticale | ripeti solo in orizzontale | ripeti solo in verticale | non ripetere ) Si vedano gli esempi tra le proprietà comuni CSS presenti tra il materiale online del corso. E' anche possibile effettuare prove interattive tramite il CSS explorer. Nuove Proprietà Introdotte dai CSS3: le Ombre I CSS3 permettono di realizzare facilmente ombre, che prima venivano ottenute con complesse operazioni tramite sovrapposizione di oggetti con sfondi particolari. In particolare, è possibile usare la proprietà che segue: • proprietà: box-shadow valori: none | inset? misura{2,4} colore (, inset? misura{2,4} colore)* le prime due misure (obbligatorie) impostano l’offset dell’ombra rispetto all’oggetto, cioè di quanto “sporgerà” da esso, e possono essere anche negative per spostare l’ombra in alto o Revisione 05/11 Pagina 14/25 Corso di Ingegneria del Web I Fogli di Stile: Formattazione a sinistra. La terza misura, opzionale, è il raggio di sfumatura dell’ombra: più è alto, più l’ombra risulterà sfumata verso gli estremi. La quarta misura, opzionale, è lo “spread” dell’ombra, che rappresenta quanto l’ombra stessa verrà “espansa” o “contratta” (se il valore è negativo) rispetto all’area dell’oggetto che la proietta. L’ultimo parametro indica il colore dell’ombra (omettendo il quale ciascun browser userà il suo default). Se precedute dalla parola chiave inset, queste misure determinano un’ombra proiettata all’interno dell’oggetto. Infine, se si specificano più configurazioni di ombra (separate da virgole), queste verranno tutte applicate, nell’ordine, “stratificandole”. Anche questa proprietà non è interpretata correttamente da tutti i browser, ma è possibile inserire, oltre ai nomi standard, le versioni “proprietarie” di questa proprietà per migliorarne la compatibilità. Ecco quindi un esempio in cui viene proiettata in’ombra esterna, spostata di 5 pixel a sinistra e in basso, con un raggio di sfumatura di due pixel e di colore grigio: .shadow { box-shadow:5px 5px 2px #DDD; -moz-box-shadow:5px 5px 2px #DDD; -webkit-box-shadow:5px 5px 2px #DDD } Formattazione Di seguito riportiamo la lista commentata delle principali proprietà di formattazione per caratteri e paragrafi. Si tratta di proprietà molto comuni e spesso auto esplicative. Caratteri • • • • • proprietà: color colore carattere valori: colore proprietà: font-family tipo di carattere valori: uno o più nomi di font, separati da virgole, in ordine di priorità (se un carattere non è presente sul sistema, viene provato il successivo, e così via. E' consigliabile concludere sempre la lista con un nome di font comune come Helvetica o Times, seguito da un nome generico di famiglia come sans-serif o serif, solitamente compresi da tutte le piattaforme) proprietà: font-size dimensione carattere valori: misura proprietà: font-style stile del carattere valori: normal | italic | oblique (normale | corsivo | obliquo) proprietà: font-variant variante del font valori: normal | small-caps (normale | maiuscoletto) Revisione 05/11 Pagina 15/25 Corso di Ingegneria del Web • • • I Fogli di Stile: Formattazione proprietà: font-weight peso del font valori: normal | bold | bolder | lighter (normale | grassetto | grassetto pronunciato | sottile) proprietà: text-decoration sottolineatura dei caratteri valori: none | underline | overline | line-through (nessuna | sottolineato | sovralineato | barrato) proprietà: text-transform trasformazione del testo (maiuscole/minuscole) valori: capitalize | uppercase | lowercase | none (iniziali maiuscole | tutto maiuscolo | tutto minuscolo | normale) #e {font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11pt;} Si vedano gli esempi tra le proprietà comuni CSS presenti tra il materiale online del corso. E' anche possibile effettuare prove interattive tramite il CSS explorer. E’ possibile importare all’interno dei documenti dei font scaricabili dal web (le cosiddette web fonts) tramite la speciale “at-rule” CSS denominata @font-face. Ad esempio, il codice che segue installa un font liberamente distribuito da Google: @font-face { font-family: 'Tangerine'; font-style: normal; font-weight: normal; src: url('http://themes.googleusercontent.com/font?kit=HGfsyCL5WASpHOFnouGRPY6323mHUZFJMgTvxaG2iE'); src: local('Tangerine'), url('http://themes.googleusercontent.com/font?kit=HGfsyCL5WASpHOFnouGRD8E0i7KZn-EPnyo3HZu7kw') format('woff'); } Dopo aver eseguito questo comando, si potrà assegnare a qualsiasi blocco di testo la font-family chiamata “Tangerine”, che verrà scaricata dagli indirizzi indicati e messa nella cache del browser. Da notare che questa direttiva importa il font assegnandolo alla sola variante non-grassetto noncorsivo di questa famiglia. L’uso delle web fonts è tuttora in fase di crescita e definizione, quindi per ulteriori informazioni si rimanda, ad esempio, al sito Google Web Fonts: http://www.google.com/webfonts. Paragrafi • • proprietà: line-height altezza delle righe, cioè la distanza tra la base dei caratteri di due righe consecutive. E' diverso dal concetto di interlinea, che rappresenta lo spazio tra due righe, ma può essere utilizzato per ottenere gli stessi effetti. valori: misura | normal proprietà: text-align allineamento orizzontale paragrafi valori: left | right | center | justify (sinistra | centro | destra | giustificato) Nel caso dell'allineamento justify, gli spazi tra Revisione 05/11 Pagina 16/25 Corso di Ingegneria del Web • • • • I Fogli di Stile: Liste parole vengono espansi per fare in modo che tutte le righe abbiano la medesima larghezza. E' un effetto molto professionale, tipico dei word processors, ma alcuni browser non lo supportano. proprietà: vertical-align allineamento verticale paragrafi all'interno delle celle di una tabella: non funziona per il testo in generale! valori: top | middle | bottom (in alto | al centro | in basso) elementi applicabili: celle di tabelle proprietà: text-indent rientro sinistro paragrafi valori: misura proprietà: word-spacing spazio tra parole valori: misura | normal proprietà: letter-spacing spazio tra lettere valori: misura | normal Si vedano gli esempi tra le proprietà comuni CSS presenti tra il materiale online del corso. E' anche possibile effettuare prove interattive tramite il CSS explorer. Liste Tramite CSS è possibile creare liste puntate e numerate di tipo semplice, con immagini standard o numeri (arabi, romani, ecc.) come punti elenco, usando l’attributo list-style-type. In generale, gli attributi lista di CSS si applicano agli elementi lista già definiti da HTML (ul, ol, li) per modificarne il comportamento di default. Tuttavia, gli attributi di tipo list possono essere applicati a tutti gli elementi per la cui proprietà display sia impostata al valore list-item. La funzionalità più avanzata, resa disponibile tramite l’attributo list-style-image, prevede l’uso di immagini come punti elenco. In questo caso, l’attributo list-style-type viene ignorato. Quando si creano liste di tipo personalizzato con immagini, bisogna sempre regolare i rientri, il padding e i margini degli elementi in modo da ottenere l’effetto visivo desiderato. Infatti, a seconda del browser, il margine e/o il padding dell’elemento list-item determinano il rientro dell’elemento stesso e/o lo spazio tra il punto elenco e il testo associato. Proprietà CSS per le liste • • proprietà: list-style-type tipi standard di punto elenco attribuibili ad elementi list-item valori:disc | circle | square | decimal | decimal-leading-zero | lower-roman | upper-roman | lower-greek | lower-latin | upper-latin | armenian | georgian | lower-alpha | upperalpha | none proprietà: list-style-image punto elenco immagine: permette di sostituire il punto (selezionato con list-style-type) con un'immagine arbitraria valori: uri |none Revisione 05/11 Pagina 17/25 Corso di Ingegneria del Web • I Fogli di Stile: Box Model come nel caso della proprietà background-image, si utilizza il costrutto uri('...') per caricare l'immagine da usare come punto elenco proprietà: list-style-position posizione del punto elenco rispetto al testo valori:inside | outside determina se il testo a capo debba iniziare sotto (inside) o a fianco (outside) del punto elenco Si vedano gli esempi delle proprietà lista nei CSS presenti tra il materiale online del corso. Box Model Il box model del CSS controlla il dimensionamento e il posizionamento di tutti gli elementi della pagina HTML, manipolandoli tramite il loro bounding box, cioè il rettangolo che li racchiude. Per questo, in questa sezione parleremo spesso di box riferendoci al contorno di un generico elemento. Controllare la Generazione dei Box Tramite la proprietà CSS display è possibile specificare/modificare il comportamento del box associato a un elemento, rispetto al suo contesto. I valori ammessi sono inline, block, list-item e none. • • • • block genera un box di tipo blocco (che occupa uno spazio orizzontale e verticale separato dagli altri box, come p o div) inline genera un box inline, che entra a far parte del flusso esterno senza interromperlo (come b o span) list-item visualizza il box come un elemento di lista (come li) none disattiva la generazione del box, rimuovendo l’elemento associato dal documento a tutti gli effetti. E' quindi possibile, ad esempio, trasformare i link (elemento a), che di default sono di tipo inline (come da specifica HTML), in un elemento di tipo blocco specificando la clausola CSS a {display: block} La proprietà display è usata molto spesso per rendere visibili selettivamente delle parti della pagina, ad esempio elementi attivati da uno script. Per rimuovere completamente un elemento dal flusso della pagina è infatti sufficiente impostare la sua proprietà display su none, mentre per farlo riapparire è necessario reimpostare il suo display sul valore appropriato (inline, block, listitem) per l'elemento stesso. Si vedano gli esempi relativi alla gestione della visibilità con i CSS presenti tra il materiale online del corso. Un esempio avanzato di menu simile a quello presente negli esempi precedenti è mostrato nell'esempio di menu con popup multilivello realizzato tramite CSS, presente tra il materiale online del corso. Parte di quest'ultimo esempio sarà però chiara più avanti, dopo aver studiato il posizionamento degli elementi. Revisione 05/11 Pagina 18/25 Corso di Ingegneria del Web I Fogli di Stile: Box Model Mostrare e Nascondere Elementi Dopo aver generato il box relativo a un elemento, si può specificare se il contenuto del box debba essere o meno visualizzato tramite la proprietà visibility, i cui valori possono essere visible o hidden. • • visible (default) mostra l’elemento. hidden nasconde l’elemento. Impostando la proprietà ad hidden, il box dell’elemento non viene rimosso dal flusso del documento, per cui il suo ingombro viene comunque considerato nel calcolo del layout. In pratica sulla pagina apparirà uno "spazio vuoto" al posto dell'elemento. Se si vuole rimuovere totalmente un elemento dalla pagina, quindi, è necessario usare la proprietà display. Gestione del Contenuto Tutti gli elementi contenitori, cioè quelli che possono contenere testo e altri elementi HTML, solitamente adattano le proprie dimensioni in base all'ampiezza del loro contenuto. Spesso, però, questi elementi possono avere una dimensione fissa o massima. In questi casi, se il contenuto è più grande del contenitore, si può specificare come trattare la parte che ne fuoriesce tramite la proprietà overflow, che può avere uno dei valori visible, hidden, scroll o auto. • • • • visible (default) lascia che il contenuto extra sia renderizzato anche fuori dal contenitore, sovrapponendosi ai suoi bordi e al contenuto circostante. hidden nasconde la parte di contenuto che fuoriesce dal contenitore, effettuando il cosiddetto clipping. Si tratta di un effetto utile, ad esempio, per simulare lo scorrimento di un contenuto all'interno di una finestra. scroll fa apparire delle barre di scorrimento all’interno del contenitore, in modo che il contenuto possa essere gestito tramite scrolling. Le barre appariranno in ogni caso, anche se il contenuto non fuoriesce. auto fa apparire delle barre di scorrimento all’interno del contenitore, in modo che il contenuto possa essere gestito tramite scrolling, solo se questo fuoriesce dal contenitore. In questo modo, è possibile dotare ogni elemento della logica di scorrimento tipica della finestra del browser. Si vedano gli esempi relativi alla gestione dell'overflow con i CSS presenti tra il materiale online del corso. Margini e Spazi Il margine è lo spazio vuoto lasciato tra il bordo del box di un oggetto e quello degli oggetti circostanti; determina, cioè, la distanza tra il bordo esterno del box (anche se il bordo non è visibile) e quello dei box circostanti. Si specifica tramite una misura impostata sulla proprietà margin (che è una shorthand per le quattro proprietà margin-right, margin-left, margin-top, margin-bottom). Il padding, invece, è lo spazio vuoto lasciato tra il bordo del box di un oggetto e il contenuto del box stesso. Si specifica tramite una misura impostata sulla proprietà padding (che è una shorthand per le quattro proprietà padding-top, padding-right, padding-bottom, padding-left). Revisione 05/11 Pagina 19/25 Corso di Ingegneria del Web I Fogli di Stile: Posizionamento In molti casi, se il bordo dell'oggetto non è visibile, margin e padding producono lo stesso effetto visivo, ma bisogna sempre usare l’attributo logicamente più adatto allo scopo. #e {border: 1px solid black; margin-top: 3mm; padding: 5px} /* imposta un margine di 3 millimetri prima dell'elemento con ID e, inserisce un padding di 5 pixel tra il suo bordo e il contenuto */ Dimensionamento La dimensione di ogni elemento può essere impostata in vari modi, sovrascrivendo completamente o vincolandoparzialmente la dimensione naturale calcolata dal browser (solitamente adatta al contenuto). Nel caso si voglia fissare la dimensione di un oggetto, è possibile specificarla tramite le proprietà width e height, che accettano come valori misure assolute o percentuali, che in quest'ultimo caso si intendono relative alle corrispondenti dimensioni del contenitore. Il valore di default auto per entrambe queste proprietà corrisponde alla dimensione naturale, calcolata attraverso le altre proprietà dell’elemento. In alternativa, è possibile specificare le dimensioni minime o massime che il browser può far assumere a un contenitore tramite le proprietà max-height, max-width, min-height e min-width, anch’esse espresse come misure assolute o percentuali. In questo modo si fornisce una certa libertà al browser di adattare l'oggetto al suo contenuto e al contesto, ma si forniscono vincoli di massima, ad esempio per impedire che un oggetto diventi troppo piccolo in seguito al ridimensionamento della finestra del browser. Tuttavia queste proprietà non sono supportate da alcuni browser. In generale, le proprietà di dimensionamento hanno valore solo per elementi di tipo blocco. Oggetti con dimensione minima o fissata possono determinare l'apparizione delle barre di scorrimento nel contenitore #e {min-width: 100px; max-width: 250px} Posizionamento Il posizionamento degli elementi è la chiave per la realizzazione di layout complessi, in cui le aree funzionali delle pagine web sono disposte con precisione in base allo spazio messo a disposizione dal browser. Gli elementi possono essere posizionati in quattro modi diversi, specificabili con l’attributo CSS position: static, relative, absolute e fixed. Le ultime quattro modalità si utilizzando di solito in combinazione con le proprietà left, right, top, e bottom, che accettano come valori misure utilizzate per determinare l'effettivo posizionamento degli elementi. Gli elementi posizionati in maniera absolute o fixed si dicono rimossi dal flusso del testo. La loro posizione non dipende più dagli elementi che li circondano, anche se, nel caso absolute, continuano a scorrere insieme al resto della pagina. Gli elementi posizionati, infine, possono in generale anche sovrapporsi ad altri elementi, in quanto la loro posizione non influenza più il posizionamento degli elementi che li circondano (posizionato i no). In questo caso, è utile determinare quali elementi siano in primo piano e quali in secondo piano, cioè quali elementi possano "nasconderne" altri. Questo è possibile utilizzando Revisione 05/11 Pagina 20/25 Corso di Ingegneria del Web I Fogli di Stile: Posizionamento la proprietà z-index, il cui valore determina la posizione dell'elemento sull'asse Z. Maggiore è il valore dello z-index, più in alto (in primo piano) si troverà l'elemento. Vediamo in dettaglio come funzionano i vari sistemi si posizionamento. Posizionamento statico (static) L’oggetto viene posto nella sua posizione naturale, data dal flusso del testo (default). Tutti gli elementi HTML hanno posizionamento static, a meno che la loro proprietà position venga impostata tramite CSS. Posizionamento relativo (relative) L’oggetto viene posizionato alle coordinate impostate tramite gli attributi left, right, top e bottom e relative alla sua posizione naturale. In pratica, gli attributi left, right, top e bottom vengono interpretati come offset rispetto alla posizione che l'elemento avrebbe in modalità static. Ad esempio, il codice {position: relative; left: -10px} sposta l'elemento a cui è applicato di 10 pixel a sinistra rispetto alla sua posizione naturale. In generale, comunque, il posizionamento relativo è poco usato. E' molto comune invece attivare il posizionamento relativo senza impostare le proprietà left, right, top, bottom (che sono quindi implicitamente poste a zero). Questo fa sì che l'elemento resti posizionato nella sua locazione naturale (quella data dal metodo static), ma lo rende una potenziale origine per il posizionamento del suo contenuto, come spiegato di seguito. Si vedano i relativi esempi di posizionamento presenti tra il materiale online del corso. Posizionamento assoluto (absolute) L’oggetto viene posizionato alle coordinate impostate tramite gli attributi left, right, top e bottom e relative all’angolo superiore sinistro del suo più diretto contenitore con posizionamento non statico. In questo caso, quindi, i valori di left, right, top e bottom sono coordinate assolute, misurate rispetto all'origine data dall'angolo superiore sinistro di un altro elemento. Questo elemento "di riferimento" viene scelto tra i contenitori dell'oggetto posizionato, in ordine gerarchico (prima il contenitore diretto, poi il contenitore del contenitore, ecc. fino ad arrivare al body del documento). Il criterio di scelta è semplice: viene selezionato il primo contenitore che abbia una proprietà position impostata a un valore diverso da static. Come detto sopra, questo non implica che il contenitore debba essere a sua volta posizionato in una locazione diversa da quella naturale: infatti, impostare position su relative senza modificare gli attributi left, right, top e bottom corrisponde logicamente a conservare il posizionamento static, ma rende l'oggetto un potenziale riferimento per il posizionamento (assoluto) di altri elementi. E' quindi molto comune trovare elementi posizionati in maniera assoluta rispetto al documento (o meglio al suo body, che è sempre un origine valida) o a un suo contenitore con posizionamento relativo. Si vedano i relativi esempi di posizionamento presenti tra il materiale online del corso. Revisione 05/11 Pagina 21/25 Corso di Ingegneria del Web I Fogli di Stile: Floats Posizionamento fisso (fixed) L’oggetto viene posizionato alle coordinate impostate tramite gli attributi left, right, top e bottom e relative all’angolo superiore sinistro del viewport (di solito la finestra del browser), e non al documento. Questo significa che l'oggetto non scorrerà con il contenuto della finestra, ma rimarrà fisso rispetto all'area di visualizzazione del browser. Nei casi di posizionamento relativo o assoluto, invece, l'oggetto rimane ancorato a un riferimento presente nel documento, quindi scorre insieme al documento stesso. Questo effetto può essere utile per costruire elementi del layout (come menu o avvisi) che siano sempre visibili all'utente. Prima dell'avvento del posizionamento fisso, questo stesso effetto si otteneva usando javascript per alterare la posizione di un elemento in base allo scorrimento della finestra, in modo che apparisse come fisso. In alcuni casi questa tecnica è ancora utile, in quanto il posizionamento fisso non è ancora supportato da tutti i browser. Si vedano i relativi esempi di posizionamento presenti tra il materiale online del corso. Proprietà di Posizionamento Riassumiamo le proprietà coinvolte nel posizionamento degli elementi. • • • proprietà: position Determina il tipo di posizionamento dell’elelento valori: static | relative | absolute | fixed proprietà: top, left, right, bottom Determina la posizione dell’elemento, in base alle regole definite dal valore della proprietà position valori: misura proprietà: z-index Determina la posizione dell’elemento sull’asse Z. Valori maggiori spostano l’elemento verso l’utente. valori: numero | auto | inherit Floats Un altro modo di disporre elementi nella pagina web in maniera non statica è quello dei floats. Tramite la tecnica di floating è possibile rimuovere degli elementi dal flusso del testo e posizionarli in maniera dinamica sul bordo sinistro o destro del loro contenitore. Gli elementi posizionati tramite floating hanno delle caratteristiche uniche che li rendono "intelligenti": si distribuiscono sempre al meglio in relazione allo spazio a loro disposizione, si impilano e vanno a capo dinamicamente come fossero elementi di testo, e il testo che li circonda scorre intorno a loro margine in maniera automatica. Questo tipo di effetto è spesso usato per creare menu, layout a colonne, ecc. Tuttavia, i l'algoritmo di disposizione dei float è molto complesso, e differisce tra i vari browser, anche nelle versioni più attuali. Per questo alcuni effetti ottenuti tramite floats potrebbero non essere pienamente crossbrowser. Usate quindi questa proprietà con cautela! Revisione 05/11 Pagina 22/25 Corso di Ingegneria del Web I Fogli di Stile: Contenuto Dinamico Per rendere floating un blocco si imposta la sua proprietà float su left o right. In questo modo il blocco assumerà l'ampiezza minima richiesta dal suo contenuto (è spesso opportuno dichiarare una dimensione minima o fissa per i float) e si disporrà sul margine indicato del suo contenitore. Poiché l'oggetto è rimosso dal flusso della pagina, potrà anche fuoriuscire dal contenitore e sovrapporsi agli oggetti circostanti. Tuttavia, il testo in tutti gli oggetti a cui il blocco float si sovrappone non verrà coperto dal blocco, ma scorrerà intorno ad esso. Questo rende i float molto diversi dai normali blocchi posizionati. Per evitare che un blocco float appaia oltre una certa posizione verticale, o si sovrapponga a un segmento della pagina, si può dotare qualsiasi elemento della proprietà clear. Questa proprietà può avere valore left, right o both, e istruisce CSS a porre l'elemento indicato, e tutti quelli che lo seguono, dopo la fine di tutti i blocchi float, rispettivamente sinistri, destri o entrambi. Questo può ovviamente implicare l'inserimento di spazio bianco sulla pagina. Infine, se si inseriscono nella stessa area della pagina più blocchi float sullo stesso margine, questi si comporteranno come caratteri di un testo: si affiancheranno, in ordine di dichiarazione, formando una riga, se lo spazio orizzontale del browser lo permette, altrimenti alcuni float saranno "mandati a capo" a formare una riga al di sotto della prima. Questo effetto è molto utile, ad esempio per creare una serie di riquadri che si ridispongono automaticamente per occupare al meglio l'area a loro disposizione. Ad esempio, provate il seguente codice CSS e HTML, variando la dimensione della finestra: .box <div <div <div {min-width: 200px; float: left; border: 1px dashed red; } class="box"> Primo riquadro </div> class="box"> Secondo riquadro </div> class="box"> Terzo riquadro </div> Altri esempi potete trovarli sul file degli esempi d'uso dei blocchi float presente tra il materiale online del corso. E' utile visualizzare questi esempi su più browser per identificare le differenze di rendering. Proprietà per i floats • • proprietà: float Imposta l’oggetto come floating sul lato sinistro o destro del contenitore. Il valore none disabilita il floating. valori: left | right | none proprietà: clear La proprietà clear impostata su un elemento fa sì che tutti i floats del tipo specificato (sinistri, destri o entrambi) vengano disposti prima dell’elemento stesso.In altre parole, il contenuto dei float indicati dalla proprietà clear non potrà scorrere verticalmente oltre l'elemento che ha questa proprietà impostata. valori: left | right | both Contenuto Dinamico Anche se è una caratteristica poco nota, i CSS permettono anche di inserire particolari tipi di contenuto (testo) nel documento, oltre a variarne l'aspetto puramente visuale. La generazione automatica di contenuto si realizza in due fasi: prima si definisce e/o si aggiorna il testo da inserire, tramite le proprietà quotes, counter-reset e counter-increment, poi si inserisce il testo vero e proprio usando la proprietà content. Revisione 05/11 Pagina 23/25 Corso di Ingegneria del Web I Fogli di Stile: Altre Proprietà L'attributo quotes permette di specificare le virgolette (aperta e chiusa) che dovranno circondare l'elemento, se richiesto. E’ possibile specificare più coppie, una per ciascun livello di nidificazione delle virgolette stesse. I valori ammessi sono none (nessuna virgoletta) o una o più coppie di stringhe, ad esempio #elemento {quotes: "<" ">" "<<" ">>"} Il comportamento speciale dell'elemento q di HTML, ad esempio, è realizzato tramite la proprietà quotes. Tuttavia, non tutti i browser supportano questa proprietà. In CSS è inoltre possibile programmare contatori sequenziali, utilizzabili ad esempio per numerare titoli o liste. I contatori hanno un nome proprio, e vengono controllati tramite proprietà poste in opportune regole. La proprietà counter-reset permette di impostare a un certo valore o azzerare uno o più contatori. La sintassi della proprietà è counter-reset (stringa [intero])+, dove le stringhe sono nomi di contatori e gli interi, opzionali (default zero), il numero a cui impostarli. Ad esempio, il seguente codice crea un contatore esempi che viene resettato dopo l'inizio di ogni sezione di primo livello (h1): h1 {counter-reset: esempi} La proprietà counter-increment, invece, permette di incrementare uno o più contatori di un valore dato (default 1), ed ha come sintassi counter-increment (stringa [intero])+. L'esempio che segue si aggiunge a quello precedente: il contatore esempi viene incrementato in ogni elemento di ogni lista ordinata di classe esempio. ol.esempio li {counter-increment: esempi} Infine, una volta definito il contenuto, lo si può inserire prima o dopo un elemento (non è possibile, cioè, intervenire sul contenuto dell'elemento stesso), A questo scopo, si utilizza la proprietà content, che è applicabile solo agli pseudo elementi :before e :after, e specifica il testo che andrà inserito rispettivamente prima o dopo l'elemento a cui è applicata. La sintassi della proprietà è content: none | ("stringa" | counter(C,S) | open-quote | close-quote)+ I valori di open-quote e close-quote generano in output le stringhe impostate dall’attributo quotes sullo stesso elemento. C può essere il nome di un qualunque contatore visibile dall’elemento, mentre S (opzionale) è uno dei valori definiti per la proprietà list-style-type, e determina il modo in cui il numero sarà formattato. E' possibile anche inserire una stringa costante arbitraria, o una sequenza di uno o più dei suddetti elementi. Ad esempio, a completamento dei due frammenti proposti soopra, il codice CSS che segue fa in modo che le liste ordinate di classe esempio abbiano una numerazione sequenziale che non ricomincia in ogni lista, ma si riavvia solo all'inizio di ogni sezione di primo livello. ol.esempio {list-style: none} ol.esempio li:before {content: counter(esempi,decimal) ". "} Si vedano anche gli esempi nel file delle altre proprietà CSS presenti tra il materiale online del corso. Altre Proprietà Elenchiamo qui altre proprietà CSS che possono essere utili in nelle applicazioni web più comini. • proprietà: cursor Imposta la forma del mouse quando è sopra l’elemento. Revisione 05/11 Pagina 24/25 Corso di Ingegneria del Web I Fogli di Stile: Altre Proprietà valori: [uri, ]* (auto | crosshair | default | pointer | move | e-resize| ne-resize | nw-resize | n-resize | se-resize | sw-resize |s-resize | w-resize | text | wait | help | progress) I nomi rappresentano i più comuni tipi standard di cursore usati nei sistemi operativi. La lista di uri, opzionale, indica una o più risorse (immagini) esterne da usare come cursore. Il browser utilizzerà la prima di cui riconosce il formato. In ogni caso, è necessario fornire anche uno dei cursori standard, come unico valore o come ultima scelta nella lista. Si vedano anche gli esempi nel file delle altre proprietà CSS presenti tra il materiale online del corso. This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. Revisione 05/11 Pagina 25/25