CSS Layout delle pagine - Server users.dimi.uniud.it

Transcript

CSS Layout delle pagine - Server users.dimi.uniud.it
Laboratorio di Tecnologie Web
CSS
Layout delle pagine
Dott. Stefano Burigat
www.dimi.uniud.it/burigat
Strategie di layout
Esistono diverse strategie per definire il layout generale
delle pagine web:
• Layout fisso: il layout mantiene le proprie dimensioni
indipendentemente dalla dimensione della finestra del
browser o del testo
• Layout fluido o liquido: le dimensioni del layout
cambiano in modo proporzionale alle dimensioni della
finestra
• Layout elastico: le dimensioni del layout cambiano in
modo proporzionale alla dimensione del testo
• Layout ibrido: combina aree fisse e aree le cui
dimensioni variano dinamicamente
Layout fissi
Nei layout fissi, i designer controllano direttamente la
dimensione delle pagine e le relazioni tra elementi delle
pagine, allineamenti e lunghezza delle linee (la lunghezza
ottimale delle linee è 10-12 parole oppure 60-75 caratteri).
Un layout fisso viene creato impostando in pixel la
larghezza delle pagine (una dimensione comune è 960px) e
dei loro componenti (colonne, margini, etc.). Tipicamente,
il contenuto dell'intera pagina viene inserito all'interno di un
elemento <div> (che può essere posizionato al centro della
pagina in modo che eventuale spazio extra si disponga
equamente sui due lati).
Gli svantaggi di un layout fisso sono dovuti al fatto che non
si adatta alla dimensione della finestra del browser (che può
quindi diventare più piccola o molto più grande del
contenuto da visualizzare).
<!DOCTYPE html>
<html>
<head>
<title>
Tecnologie web
</title>
<style>
#wrapper {
width: 750px;
position: absolute;
margin-left: auto;
margin-right: auto;
padding: 0px;
}
#col1 {
position: absolute;
top: 0px;
left: 0px;
width: 200px;
background: orange;
}
#col2 {
position: absolute;
top: 0px;
right: 0px;
margin-left: 225px;
background: yellow;
}
</style>
</head>
<body>
<div id="wrapper">
<div id="col1">
<h1>Colonna 1</h1>
<p>Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor incididunt ut labore
et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.</p>
</div>
<div id="col2">
<h1>Colonna 2</h1>
<p>Sed ut perspiciatis unde omnis iste natus error
sit voluptatem accusantium doloremque laudantium, totam rem
aperiam, eaque ipsa quae ab illo inventore veritatis et quasi
architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam
voluptatem quia voluptas sit aspernatur aut odit aut fugit,
sed quia consequuntur magni dolores eos qui ratione voluptatem
sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum
quia dolor sit amet, consectetur, adipisci velit, sed quia non
numquam eius modi tempora incidunt ut labore et dolore magnam
aliquam quaerat voluptatem. Ut enim ad minima veniam, quis
nostrum exercitationem ullam corporis suscipit laboriosam,
nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum
iure reprehenderit qui in ea voluptate velit esse quam nihil
molestiae consequatur, vel illum qui dolorem eum fugiat quo
voluptas nulla pariatur?</p>
</div>
</div>
</body>
</html>
Layout fluidi
Nei layout fluidi, la dimensione delle pagine e delle
colonne al loro interno varia dinamicamente in funzione
dello spazio a disposizione.
Si può creare un layout di questo tipo impostando la
larghezza delle pagine e degli elementi in percentuale (o
non usare la proprietà “width” del tutto, nel qual caso
questa è impostata ad auto e gli elementi occupano tutto lo
spazio a loro disposizione).
Il principale svantaggio di questi layout è che possono
portare a righe di testo (ed elementi in generale) molto
lunghe o molto corte, pregiudicandone la leggibilità. Per
mitigare questo problema si può fare uso delle proprietà
“min-width” e “max-width”.
<!DOCTYPE html>
<html>
<head>
<title>
Tecnologie web
</title>
<style>
#col1 {
width: 70%;
margin-right: 5%;
float: left;
background: yellow;
}
#col2 {
width: 25%;
float: left;
background: orange;
}
</style>
</head>
<body>
<div id="col1">
<h1>Colonna 1</h1>
<p>Sed ...</p>
</div>
<div id="col2">
<h1>Colonna 2</h1>
<p>Lorem ...</p>
</div>
</body>
</html>
Layout elastici
Nei layout elastici, la dimensione delle pagine e degli
elementi si adatta alla dimensione del testo. Questo
permette di avere righe sempre della stessa lunghezza (in
termini di numero di parole o caratteri).
I layout elastici vengono creati impostando le dimensioni
degli elementi in em.
Questo tipo di layout è meno flessibile del layout fluido in
ambito mobile e non si applica particolarmente bene a
contenuti non testuali.
<!DOCTYPE html>
<html>
<head>
<title>
Tecnologie web
</title>
<style>
#col1 {
width: 12em;
margin-right: 2em;
float: left;
background: yellow;
}
#col2 {
width: 12em;
float: left;
background: orange;
}
</style>
</head>
<body>
<div id="col1">
<h1>Colonna 1</h1>
<p>Sed ...</p>
</div>
<div id="col2">
<h1>Colonna 2</h1>
<p>Lorem ...</p>
</div>
</body>
</html>
Layout ibridi
I layout ibridi utilizzano una combinazione di dimensioni
definite in px, percentuali ed em, in base alle esigenze. Ad
esempio, il codice suguente combina una colonna a
dimensione fissa con una colonna a dimensione variabile.
<!DOCTYPE html>
<html>
<head>
<title>
Tecnologie web
</title>
<style>
#col1 {
width: 200px;
position: absolute;
top: 0px;
left: 0px;
background: orange;
}
#col2 {
width: auto;
position: absolute;
top: 0;
left: 225px;
background: yellow;
}
</style>
</head>
<body>
<div id="wrapper">
<div id="col1">
<h1>Colonna 1</h1>
<p>Lorem ...</p>
</div>
<div id="col2">
<h1>Colonna 2</h1>
<p>Sed ...</p>
</div>
</div>
</body>
</html>
Layout multicolonna
In questa sezione, vedremo alcuni esempi di layout a due e
a tre colonne. Gli esempi sono volutamente minimali,
utilizzano elementi generici e sono da intendersi come base
per sviluppare layout più sofisticati e completi.
Utilizzo di float
La proprietà “float” è al momento la più utilizzata per
creare layout multicolonna nelle pagine web.
L'esempio seguente crea un layout fluido a due colonne per
una pagina contenente un header, due aree di contenuto
(contenuto principale e secondario) ed un footer.
<!DOCTYPE html>
<html>
<head>
<title>
Tecnologie web
</title>
<style>
body {
margin: 0;
padding: 0;
}
#header {
background-color: #CCC;
padding: 15px;
}
#main {
float: left;
width: 60%;
margin: 0 5%;
background: orange;
}
#secondary {
float: left;
width: 25%;
margin: 0 5% 0 0;
background: yellow;
}
#footer {
clear: left;
padding: 15px;
background: #CCC;
}
</style>
</head>
<body>
<div id="header"><p>Header</p></div>
<div id="main">
<p>Contenuto principale</p>
<p>Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor incididunt ut labore
et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.</p>
</div>
<div id="secondary">
<p>Articoli correlati:</p>
<ul>
<li>Link 1</li>
<li>Link 2</li>
<li>Link 3</li>
<li>Link 4</li>
</ul>
</div>
<div id="footer"><p>Footer</p></div>
</body>
</html>
Entrambe le aree di contenuto sono state definite come
elementi floating a sinistra ed hanno una dimensione
specificata in percentuale.
L'area di contenuto principale ha un margine a destra e a
sinistra mentre l'area secondaria ha un margine solo a
destra. I margini superiori sono stati impostati a 0 per
ottenere l'allineamento verticale.
Il footer utilizza la proprietà “clear” in modo che sia
posizionato sotto le aree di contenuto.
E' possibile applicare “max-width” e “min-width” per
migliorare l'usabilità su schermi molto grandi o molto
piccoli. Tali proprietà possono essere applicate ai singoli
elementi oppure si possono inserire tutti gli elementi
all'interno di un unico <div> e impostare i vincoli a questo.
L'esempio seguente crea un layout fisso a due colonne per
la stessa pagina. A differenza del layout fluido, in questo
caso tutta la pagina viene inserita all'interno di un elemento
<div> di cui viene specificata la dimensione in pixel ed
anche le dimensioni delle due aree di contenuto e dei
margini vengono trasformate in pixel.
<!DOCTYPE html>
<html>
<head>
<title>
Tecnologie web
</title>
<style>
body {
margin: 0;
padding: 0;
}
#wrapper {
width: 960px;
}
#header {
background-color: #CCC;
padding: 15px;
}
#main {
float: left;
width: 650px;
margin: 0 20px;
background: orange;
}
#secondary {
float: left;
width: 250px;
margin: 0 20px 0 0;
background: yellow;
}
#footer {
clear: left;
padding: 15px;
background: #CCC;
}
</style>
</head>
<body>
<div id="wrapper">
<div id="header"><p>Header</p></div>
<div id="main">
<p>Contenuto Loremprincipale</p>
<p>Lorem ...</p>
</div>
<div id="secondary">
<p>Articoli correlati:</p>
<ul>
<li>Link 1</li>
...
</ul>
</div>
<div id="footer"><p>Footer</p></div>
</div>
</body>
</html>
Per ottenere un layout centrato sulla finestra del browser, è
sufficiente settare la proprietà “margin” del wrapper al
valore 0 auto facendo così in modo che vengano creati
automaticamente dei margini destro e sinistro delle stesse
dimensioni nello spazio a disposizione.
Se si vuole fare in modo che l'header ed il footer occupino
l'intera larghezza della finestra mentre le due aree di
contenuto siano centrate, è sufficiente spostare il wrapper in
modo che racchiuda solo le aree di contenuto, senza
necessità di modificare le regole di stile.
Il seguente esempio crea un layout fluido a tre colonne,
aggiungendo un elemento <div> alla pagina precedente e
modificando le dimensioni delle colonne di conseguenza.
<!DOCTYPE html>
<html>
<head>
<title>
Tecnologie web
</title>
<style>
body {
margin: 0;
padding: 0;
}
#header {
background-color: #CCC;
padding: 15px;
}
#navigation {
float: left;
width: 22.5%;
margin: 0 0 0 2.5%;
background: yellow;
}
#main {
float: left;
width: 45%;
margin: 0 2.5%;
background: orange;
}
#secondary {
float: left;
width: 22.5%;
margin: 0 2.5% 0 0;
background: yellow;
}
#footer {
clear: left;
padding: 15px;
background: #CCC;
}
</style>
</head>
<body>
<div id="header"><p>Header</p></div>
<div id="navigation">
<p>Menu</p>
<ul>
<li>Link 1</li>
...
</ul>
</div>
<div id="main">
<p>Contenuto principale</p>
<p>Lorem ...</p>
</div>
<div id="secondary">
<p>Articoli correlati:</p>
<ul>
<li>Link 1</li>
...
</ul>
</div>
<div id="footer"><p>Footer</p></div>
</body>
</html>
Per trasformare questo layout in un layout fisso, si procede
come nell'esempio a due colonne (provatelo come
esercizio).
Utilizzo del posizionamento assoluto
Un metodo alternativo all'utilizzo di float per creare layout
multicolonna è rappresentato dal posizionamento assoluto.
Un problema di questa soluzione è il fatto che gli elementi
che vengono posizionati in modo assoluto non fanno parte
del flusso normale e quindi non influenzano gli altri
elementi. Questo non permette di creare facilmente un
footer al di sotto delle colonne.
L'esempio seguente crea un layout fluido a tre colonne.
<!DOCTYPE html>
<html>
<head>
<title>
Tecnologie web
</title>
<style>
body {
margin: 0;
padding: 0;
}
#header {
background-color: #CCC;
padding: 15px;
}
#contenuto {
position: relative;
margin: 0;
}
#navigation {
width: 20%;
position: absolute;
top: 0;
left: 2.5%;
margin: 0;
background: yellow;
}
#main {
width: 50%;
position: absolute;
top: 0;
left: 25%;
margin: 0;
background: orange;
}
#secondary {
width: 20%;
position: absolute;
top: 0;
right: 2.5%;
margin: 0;
background: yellow;
}
</style>
</head>
<body>
<div id="header"><p>Header</p></div>
<div id="contenuto">
<div id="main">
<p>Contenuto principale</p>
<p>Lorem ...</p>
</div>
<div id="navigation">
<p>Menu</p>
<ul>
<li>Link 1</li>
...
</ul>
</div>
<div id="secondary">
<p>Articoli correlati:</p>
<ul>
<li>Link 1</li>
...
</ul>
</div>
</div>
</body>
</html>
La soluzione si basa sul creare un containing block per le
tre colonne con posizione relativa e specificare poi la
posizione assoluta delle colonne al suo interno. Notate
anche che, al contrario dell'utilizzo della proprietà “float”,
non è necessario che le tre colonne compaiano nel codice
nell'ordine in cui vengono visualizzate (in questo esempio,
il contenuto principale è presente nel codice prima delle due
barre laterali).
L'esempio seguente crea un layout fisso tramite
posizionamento assoluto. Oltre all'utilizzo di dimensioni in
pixel, viene aggiunto un wrapper per racchiudere l'intera
pagina.
<!DOCTYPE html>
<html>
<head>
<title>
Tecnologie web
</title>
<style>
body {
margin: 0;
padding: 0;
}
#wrapper{
width: 960px;
margin: 0 auto;
}
#header {
background-color: #CCC;
padding: 15px;
}
#contenuto {
position: relative;
margin: 0;
}
#navigation {
width: 200px;
position: absolute;
top: 0;
left: 0;
margin: 0;
background: yellow;
}
#main {
width: 520px;
position: absolute;
top: 0;
left: 220px;
margin: 0;
background: orange;
}
#secondary {
width: 200px;
position: absolute;
top: 0;
right: 0;
margin: 0;
background: yellow;
}
</style>
</head>
<body>
<div id="wrapper">
<div id="header"><p>Header</p></div>
<div id="contenuto">
<div id="main">
<p>Contenuto principale</p>
<p>Lorem ...</p>
</div>
<div id="navigation">
<p>Menu</p>
<ul>
<li>Link 1</li>
...
</ul>
</div>
<div id="secondary">
<p>Articoli correlati:</p>
<ul>
<li>Link 1</li>
...
</ul>
</div>
</div>
</div>
</body>
</html>
Grid frameworks (e oltre)
Nel corso degli anni, sono stati proposti diversi framework
che permettono di semplificare la creazione di layout basati
su un'organizzazione del contenuto a griglia. Tipicamente,
tali framework sono rigidi nel senso che non permettono
variazioni rispetto all'organizzazione supportata. Per questo
motivo, sono utilizzati principalmente in fase di
prototipazione del design di un sito più che in fase di
produzione.
Un esempio di framework molto diffuso è il “960 Grid
System” che si può scaricare all'indirizzo http://960.gs/.
Esso si basa su pagine di dimensione 960px, suddivise in 12
oppure 16 colonne, larghe rispettivamente 60 o 40 pixel,
con margini di 10px attorno ad ogni colonna (esiste anche
una versione a 24 colonne di 30 pixel).
L'esempio seguente crea un layout a due colonne con
header e footer. Per farlo funzionare, dovete scaricare il
framework dal sito sopra riportato e fare riferimento al
foglio di stile esterno 960.css presente nel framework.
<!DOCTYPE html>
<html>
<head>
<title>
Tecnologie web
</title>
<link rel="stylesheet" type="text/css" media="all"
href="css/960.css" />
<style>
#header, #footer {
background: #CCC;
}
.column {
background: yellow;
}
</style>
</head>
<body>
<div class="container_12">
<div id="header" class="grid_12"><p>Header
960px</p></div>
<div class="clear"></div>
<div class="grid_8 column">
<p>Contenuto principale 620px</p>
<p>Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor incididunt ut labore
et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.</p>
</div>
<div class="grid_4 column">
<p>Menu 300px</p>
<ul>
<li>Link 1</li>
<li>Link 2</li>
<li>Link 3</li>
<li>Link 4</li>
</ul>
</div>
<div class="clear"></div>
<div id="footer" class="grid_12"><p>Footer
960px</p></div>
<div class="clear"></div>
</div>
</body>
</html>
Potete trovare un esempio più complesso, che evidenzia
anche i limiti di utilizzo di un framework di questo tipo,
all'indirizzo http://code.tutsplus.com/tutorials/prototypingwith-the-grid-960-css-framework--net-1787.
Oltre a 960, esistono diversi altri framework che
permettono di creare layout (anche di tipo responsive, ossia
che cambiano in funzione dello spazio di schermo a
disposizione). Alcuni esempi sono Blueprint
(http://www.blueprintcss.org/), BlueTrip
(http://bluetrip.org/), yui (http://yuilibrary.com/), Skeleton
(http://www.getskeleton.com/), Bootstrap
(http://getbootstrap.com/).
Future tecnologie di layout
Oltre alle strategie di layout descritte nelle sezioni
precedenti, sono state proposte o sono in fase di definizione
altre modalità per organizzare gli elementi sulle pagine
web. La maggior parte di queste sono supportate solo dalle
ultime versioni dei browser.
Un'aggiunta a CSS che consentirà di poter semplificare la
definizione dei layout è la possibilità di suddividere un
qualsiasi elemento in colonne tramite proprietà quali
“column-width” e “column-count”. La specifica completa
può essere trovata al seguente indirizzo:
http://www.w3.org/TR/css3-multicol/.
L'esempio seguente mostra la suddivisione di un elemento
<div> in due colonne.
<!DOCTYPE html>
<html>
<head>
<title>
Tecnologie web
</title>
<style>
div {
-webkit-column-count: 2;
}
</style>
</head>
<body>
<div>
<p>Contenuto principale</p>
<p>Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor incididunt ut labore
et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat. Duis aute irure dolor in reprehenderit in voluptate
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur
sint occaecat cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.</p>
</div>
</body>
</html>
Il Flexible Box Layout Model (noto come FlexBox)
permette di organizzare facilmente i box degli elementi gli
uni rispetto agli altri, senza dover utilizzare float, margini
negativi o altre complicate strategie. Alla pagina
http://bocoup.com/weblog/dive-into-flexbox/ potete trovare
una presentazione estesa di questo modello. La
documentazione W3C può essere trovata al seguente
indirizzo: http://www.w3.org/TR/css3-flexbox/.
Alla pagina http://dev.w3.org/csswg/css-grid/ può essere
trovata la descrizione di un altro modello per la definizione
del layout delle pagine basato su griglia.