033.4 Lezione 1
Certificazione: |
Web Development Essentials |
---|---|
Versione: |
1.0 |
Argomento: |
033 Stile dei Contenuti con i CSS |
Obiettivo: |
033.4 Modellazione e Disposizione dei Contenitori nei CSS |
Lezione: |
1 di 1 |
Introduzione
Ogni elemento visibile in un documento HTML è reso come un contenitore rettangolare (box). Così, il termine box model descrive l’approccio che i CSS hanno nel modificare le proprietà visuali degli elementi. Come contenitori di diverse dimensioni, gli elementi HTML possono essere annidati all’interno di elementi container — di solito l’elemento div
— così da essere organizzati in sezioni e sotto-sezioni.
Possiamo usare i CSS per modificare la posizione dei “contenitori”, da piccoli aggiustamenti a drastici cambiamenti nella disposizione degli elementi nella pagina. Oltre al normale flusso, la posizione di ogni casella può essere basata sugli elementi che la circondano, o sulla sua relazione con il contenitore principale o sulla sua relazione con la viewport, che è l’area della pagina visibile all’utente. Nessun singolo meccanismo soddisfa tutti i possibili requisiti di layout, quindi può essere necessaria una combinazione di essi.
Flusso Normale
Il modo predefinito in cui il browser mostra l’albero dei documenti è chiamato flusso normale. I rettangoli corrispondenti agli elementi sono posizionati più o meno nello stesso ordine in cui appaiono nell’albero del documento, rispetto ai loro elementi principali. Tuttavia, a seconda del tipo di elemento, il riquadro corrispondente può seguire regole di posizionamento distinte.
Un buon modo per capire la logica del flusso normale è rendere visibili i contenitori. Possiamo iniziare con una pagina molto semplice, con solo tre elementi div
separati, ognuno dei quali ha un paragrafo con testo casuale:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>CSS Box Model and Layout</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div id="first">
<h2>First div</h2>
<p><span>Sed</span> <span>eget</span> <span>velit</span>
<span>id</span> <span>ante</span> <span>tempus</span>
<span>porta</span> <span>pulvinar</span> <span>et</span>
<span>ex.</span></p>
</div><!-- #first -->
<div id="second">
<h2>Second div</h2>
<p><span>Fusce</span> <span>vitae</span> <span>vehicula</span>
<span>neque.</span> <span>Etiam</span> <span>maximus</span>
<span>vulputate</span> <span>neque</span> <span>eu</span>
<span>lobortis.</span> <span>Phasellus</span> <span>condimentum,</span>
<span>felis</span> <span>eget</span> <span>eleifend</span>
<span>aliquam,</span> <span>dui</span> <span>dolor</span>
<span>bibendum</span> <span>leo.</span></p>
</div><!-- #second -->
<div id="third">
<h2>Third div</h2>
<p><span>Pellentesque</span> <span>ornare</span> <span>ultricies</span>
<span>elementum.</span> <span>Morbi</span> <span>vulputate</span>
<span>pretium</span> <span>arcu,</span> <span>sed</span>
<span>faucibus.</span></p>
</div><!-- #third -->
</body>
</html>
Ogni parola è in un elemento span
, così possiamo dare uno stile alle parole e vedere come vengono trattate anche come caselle. Per rendere visibili i contenitori, dobbiamo modificare il file del foglio di stile style.css
cui fa riferimento il documento HTML. Le seguenti regole implementeranno ciò di cui abbiamo bisogno:
* {
font-family: sans;
font-size: 14pt;
}
div {
border: 2px solid #00000044;
}
#first {
background-color: #c4a000ff;
}
#second {
background-color: #4e9a06ff;
}
#third {
background-color: #5c3566da;
}
h2 {
background-color: #ffffff66;
}
p {
background-color: #ffffff66;
}
span {
background-color: #ffffffaa;
}
Il risultato viene mostrato in Figure 1.
Figure 1 mostra che ogni tag HTML ha una casella corrispondente nel layout. Gli elementi div
, h2
e p
si estendono alla larghezza del loro elemento principale. Per esempio, l’elemento genitore degli elementi div
è l’elemento body
, quindi si estendono alla larghezza del corpo, mentre il genitore di ogni elemento h2
e p
è il suo corrispondente div
. I contenitori che si estendono fino alla larghezza del loro elemento pricipale sono chiamati elementi block. Alcuni dei più comuni tag HTML resi come blocchi sono h1
, h2
, h3
, p
, ul
, ol
, table
, li
, div
, section
, form
, e aside
. Gli elementi di blocco “gemelli” — elementi di blocco che condividono lo stesso elemento genitore — sono impilati all’interno del loro genitore dall’alto verso il basso.
Note
|
Alcuni elementi di blocco non sono pensati per essere usati come contenitori di altri elementi di blocco. È possibile, per esempio, inserire un elemento di blocco all’interno di un elemento |
Oltre al testo stesso, elementi come h1
, p
e li
si aspettano solo elementi inline come figli. Come la maggior parte dei testi occidentali, gli elementi inline seguono il flusso di testo da sinistra a destra. Quando non c’è più spazio nella parte destra, il flusso degli elementi inline continua nella riga successiva, proprio come il testo. Alcuni tag HTML comuni trattati come contenitori inline sono span
, a
, em
, strong
, img
, input
e label
.
Nella nostra pagina HTML di esempio, ogni parola all’interno dei paragrafi era inserita all’interno di un tag span
, in modo da poter essere evidenziata con una regola CSS corrispondente. Come mostrato nell’immagine, ogni elemento span
è posizionato orizzontalmente, da sinistra a destra, finché non c’è più spazio nell’elemento principale.
L’altezza dell’elemento dipende dal suo contenuto, così il browser regola l’altezza di un elemento contenitore per ospitare i suoi elementi a blocchi annidati o le linee di elementi in linea. Tuttavia, alcune proprietà CSS influenzano la forma di un contenitore, la sua posizione e il posizionamento dei suoi elementi interni.
Le proprietà margin
e padding
influenzano tutti i tipi di casella. Se non si impostano esplicitamente queste proprietà, il browser ne imposta alcune utilizzando valori standard. Come visto in Figure 1, gli elementi h2
e p
sono stati resi con uno spazio tra di loro. Questi spazi sono i margini superiori e inferiori che il browser aggiunge di default a questi elementi. Possiamo rimuoverli modificando le regole CSS per i selettori h2
e p
:
h2 {
background-color: #ffffff66;
margin: 0;
}
p {
background-color: #ffffff66;
margin: 0;
}
Il risultato appare in Figure 2.
margin
può cambiare o rimuovere i margini dagli elementi.L’elemento body
ha anche, per impostazione predefinita, un piccolo margine che crea uno spazio circostante. Anche questo spazio può essere rimosso usando la proprietà margin
..
Mentre la proprietà margin
definisce lo spazio tra l’elemento e ciò che c’è intorno, la proprietà padding
dell’elemento definisce lo spazio interno tra i limiti del contenitore e i suoi elementi figli. Considera gli elementi h2
e p
all’interno di ogni div
nel codice di esempio. Potremmo usare la loro proprietà margin
per creare uno spazio ai bordi del corrispondente div
, ma è più semplice cambiare la proprietà padding
del contenitore:
#second {
background-color: #4e9a06ff;
padding: 1em;
}
Solo la regola per il secondo div
è stata modificata, quindi i risultati (Figure 3) mostrano la differenza tra il secondo div
e gli altri contenitori div
.
div
possono avere padding
diversi.La proprietà margin
è un’abbreviazione per quattro proprietà che controllano i quattro lati del contenitore: margin-top
, margin-right
, margin-bottom
e margin-left
. Quando a margin
è assegnato un singolo valore, come negli esempi usati finora, tutti e quattro i margini del box lo usano. Quando sono scritti due valori, il primo definisce i margini superiore e inferiore, mentre il secondo definisce i margini destro e sinistro. Usando margin: 1em 2em
, per esempio, si definisce uno spazio di 1 em per i margini superiore e inferiore e uno spazio di 2 em per i margini destro e sinistro. Scrivere quattro valori imposta i margini per i quattro lati in senso orario, iniziando dall’alto. I diversi valori nella proprietà non sono tenuti a usare le stesse unità.
Anche la proprietà padding
è un’abbreviazione che segue gli stessi principi della proprietà margin
.
Nel loro comportamento predefinito, gli elementi del blocco si allungano per adattarsi alla larghezza disponibile. Ma questo non è obbligatorio. La proprietà width
può impostare una dimensione orizzontale fissa per il contenitore:
#first {
background-color: #c4a000ff;
width: 6em;
}
L’aggiunta di width: 6em
alla regola CSS restringe il primo div
orizzontalmente, lasciando uno spazio vuoto alla sua destra (Figure 4).
width
cambia la larghezza orizzontale del primo div
.Invece di lasciare il primo div
allineato a sinistra, potremmo volerlo centrare. Centrare un box equivale a impostare margini della stessa dimensione su entrambi i lati, quindi possiamo usare la proprietà margin
per centrarlo. La dimensione dello spazio disponibile può variare, quindi usiamo il valore auto
per i margini destro e sinistro:
#first {
background-color: #c4a000ff;
width: 6em;
margin: 0 auto;
}
I margini sinistro e destro sono calcolati automaticamente dal browser e il contenitore sarà centrato (Figure 5).
margin
è usata per centrare il primo div
.Come mostrato, rendere più stretto un elemento del blocco non rende lo spazio rimanente disponibile per l’elemento successivo. Il flusso naturale è ancora conservato, come se l’elemento più stretto occupasse ancora tutta la larghezza disponibile.
Personalizzazione del Flusso Normale
Il flusso normale è semplice e sequenziale. I CSS ti permettono anche di interrompere il flusso normale e posizionare gli elementi in modi molto specifici, anche scavalcando lo scorrimento della pagina. Vedremo diversi modi per controllare il posizionamento degli elementi in questa sezione.
Elementi Flottanti
È possibile fare in modo che gli elementi dei blocchi gemelli condividano lo stesso spazio orizzontale. Un modo per farlo è attraverso la proprietà float
, che rimuove l’elemento dal flusso normale. Come suggerisce il nome, la proprietà float
rende il riquadro flottante sopra gli elementi di blocco che vengono dopo, così essi saranno resi come se fossero sotto il riquadro flottante. Per rendere il primo div
flottante a destra, aggiungi float: right
alla regola CSS corrispondente:
#first {
background-color: #c4a000ff;
width: 6em;
float: right;
}
I margini automatici sono ignorati in un contenitore flottante, quindi la proprietà margin
può essere rimossa. Figure 6 mostra il risultato del floating del primo div
a destra.
div
è flottante e non fa parte del flusso normale.Per impostazione predefinita tutti gli elementi del blocco che vengono dopo l’elemento flottante andranno sotto di esso. Pertanto, data un’altezza sufficiente, il riquadro flottante coprirà tutti i restanti elementi del blocco.
Anche se un elemento flottante va sopra altri elementi a blocchi, il contenuto in linea all’interno del contenitore dell’elemento flottante si avvolge intorno all’elemento stesso: come in riviste e giornali, che spesso avvolgono il testo intorno a un’immagine.
L’immagine precedente mostra come il primo div
copra il secondo div
e parte del terzo. Supponiamo di voler far flottare il primo div
sopra il secondo div
, ma non sopra il terzo. La soluzione è includere la proprietà clear
nella regola CSS corrispondente al terzo div
:
#third {
background-color: #5c3566da;
clear: right;
}
Impostando la proprietà clear
a right
, l’elemento corrispondente salta qualsiasi elemento precedente spostato a destra, riprendendo il flusso normale (Figure 7).
clear
ritorna al flusso normale.Allo stesso modo, se un elemento precedente flotta a sinistra, puoi usare clear: left
per riprendere il flusso normale. Quando devi saltare elementi flottanti sia a sinistra sia a destra, usa clear: both
.
Posizionare Contenitori
Nel flusso normale ogni casella va dopo le caselle che la precedono nell’albero del documento. Gli elementi fratelli precedenti “spingono” gli elementi che vengono dopo di loro, spostandoli a destra e in basso all’interno del loro elemento principale. L’elemento genitore può avere i propri fratelli che avranno lo stesso comportamento. È come mettere le piastrelle una accanto all’altra in un muro, cominciando dall’alto.
Questo metodo di posizionamento dei contenitori è chiamato static, ed è il valore predefinito per la proprietà CSS position
. A parte la definizione dei margini e del padding
, non c’è modo di riposizionare un contenitore statico nella pagina.
Come l’analogia delle piastrelle sul muro, il posizionamento statico non è obbligatorio. Come per le piastrelle, puoi posizionare le caselle ovunque tu voglia, anche coprendo altre caselle. Per farlo, assegna alla proprietà position
uno dei seguenti valori:
relative
-
L’elemento segue il normale flusso del documento, ma può usare le proprietà
top
,right
,bottom
eleft
per impostare degli offset rispetto alla sua posizione statica originale. Gli offset possono anche essere negativi. Gli altri elementi rimangono nelle loro posizioni originali, come se l’elemento relativo fosse ancora statico. absolute
-
L’elemento ignora il normale flusso degli altri elementi e si posiziona nella pagina tramite le proprietà
top
,right
,bottom
, eleft
. I loro valori sono relativi al corpo del documento o a un contenitore principale non statico. fixed
-
L’elemento ignora il normale flusso degli altri elementi e si posiziona tramite le proprietà
top
,right
,bottom
, eleft
. I valori sono relativi al viewport (cioè l’area dello schermo dove viene mostrato il documento). Gli elementi fissi non si muovono mentre il visitatore scorre il documento, ma assomigliano a un adesivo fissato sullo schermo. sticky
-
L’elemento segue il normale flusso del documento. Tuttavia, invece di uscire dal viewport quando il documento scorre, si fermerà nella posizione impostata dalle proprietà
top
,right
,bottom
eleft
. Se il valoretop
è10px
, per esempio, l’elemento smetterà di scorrere sotto la parte superiore del viewport quando raggiunge 10 pixel dal limite superiore del viewport. Quando ciò accade, il resto della pagina continua a scorrere, ma l’elemento adesivo si comporta come un elemento fisso in quella posizione. Tornerà alla sua posizione originale quando il documento scorrerà di nuovo nella sua posizione nel viewport. Gli elementi adesivi sono comunemente usati al giorno d’oggi per creare menu superiori che siano sempre visibili.
Le posizioni che possono usare le proprietà top
, right
, bottom
e left
non sono obbligate a usarle tutte. Se imposti entrambe le proprietà top
e height
di un elemento assoluto, per esempio, il browser calcola implicitamente la sua proprietà bottom
(top + height = bottom).
La Proprietà display
Se l’ordine dato dal flusso normale non è un problema nel tuo progetto, ma vuoi cambiare l’allineamento dei vari contenitori nella pagina, modifica la proprietà display
dell’elemento. La proprietà display
può anche far scomparire completamente l’elemento dal documento visualizzato, impostando display: none
. Questo è utile quando si vuole mostrare l’elemento in seguito usando JavaScript.
La proprietà display
può anche, per esempio, far comportare un elemento a blocchi come un elemento in linea (display: inline
). Questa non è però considerata una buona pratica. Esistono metodi migliori per mettere gli elementi contenitore uno accanto all’altro, come il modello flexbox.
Il modello flexbox è stato inventato per superare le limitazioni dei float e per eliminare l’uso inappropriato delle tabelle per strutturare il layout della pagina. Quando si imposta la proprietà display
di un elemento contenitore su flex
per trasformarlo in un contenitore flexbox, i suoi figli più prossimi si comporteranno più o meno come celle in una riga di tabella.
Tip
|
Se vuoi ancora più controllo sul posizionamento degli elementi nella pagina, dai un’occhiata alla funzione CSS grid. La griglia è un potente sistema basato su righe e colonne per creare layout elaborati. |
Per testare la visualizzazione flex
, aggiungi un nuovo elemento div
alla pagina di esempio e rendilo il contenitore dei tre elementi div
esistenti:
<div id="container">
<div id="first">
<h2>First div</h2>
<p><span>Sed</span> <span>eget</span> <span>velit</span>
<span>id</span> <span>ante</span> <span>tempus</span>
<span>porta</span> <span>pulvinar</span> <span>et</span>
<span>ex.</span></p>
</div><!-- #first -->
<div id="second">
<h2>Second div</h2>
<p><span>Fusce</span> <span>vitae</span> <span>vehicula</span>
<span>neque.</span> <span>Etiam</span> <span>maximus</span>
<span>vulputate</span> <span>neque</span> <span>eu</span>
<span>lobortis.</span> <span>Phasellus</span> <span>condimentum,</span>
<span>felis</span> <span>eget</span> <span>eleifend</span>
<span>aliquam,</span> <span>dui</span> <span>dolor</span>
<span>bibendum</span> <span>leo.</span></p>
</div><!-- #second -->
<div id="third">
<h2>Third div</h2>
<p><span>Pellentesque</span> <span>ornare</span> <span>ultricies</span>
<span>elementum.</span> <span>Morbi</span> <span>vulputate</span>
<span>pretium</span> <span>arcu,</span> <span>sed</span>
<span>faucibus.</span></p>
</div><!-- #third -->
</div><!-- #container -->
Aggiungi la seguente regola CSS al foglio di stile per trasformare il contenitore div
in un contenitore flexbox:
#container {
display: flex;
}
Il risultato sono i tre elementi interni div
mostrati fianco a fianco (Figure 8).
Usare il valore inline-flex
invece di flex
ha fondamentalmente lo stesso risultato, ma fa sì che i figli si comportino più come elementi inline.
Design Responsivo
Sappiamo che i CSS forniscono proprietà che regolano le dimensioni degli elementi e dei caratteri in relazione all’area dello schermo disponibile. Tuttavia, potresti voler andare oltre e usare un design diverso per dispositivi diversi: per esempio, sistemi desktop rispetto a dispositivi con schermi di dimensioni inferiori a una certa misura. Questo approccio è chiamato responsive web design, e i CSS forniscono metodi chiamati media queries per renderlo possibile.
Nell’esempio precedente, abbiamo modificato il layout della pagina per mettere gli elementi div
uno accanto all’altro in colonne. Questo layout è adatto a schermi più grandi, ma sarà troppo ingombrante in schermi più piccoli. Per risolvere questo problema, possiamo aggiungere una media query al foglio di stile che corrisponda solo agli schermi con almeno 600px
di larghezza:
@media (min-width: 600px){
#container {
display: flex;
}
}
Le regole CSS all’interno della direttiva @media
saranno usate solo se il criterio tra parentesi è soddisfatto. In questo esempio, se la larghezza della finestra è inferiore a 600px
, la regola non sarà applicata al contenitore div
e i suoi figli saranno resi come elementi convenzionali div
. Il browser rivaluta le media query ogni volta che la dimensione della finestra cambia, così il layout può essere cambiato in tempo reale mentre si ridimensiona la finestra del browser o si ruota lo smartphone.
Esercizi Guidati
-
Se la proprietà
position
non viene modificata, quale metodo di posizionamento verrà utilizzato dal browser? -
Come ci si può assicurare che il riquadro di un elemento sia visualizzato dopo qualsiasi elemento flottante?
-
Come puoi usare la proprietà stenografica
margin
per impostare i margini top/bottom a4px
e i margini right/left a6em
? -
Come si può centrare orizzontalmente un elemento contenitore statico con larghezza fissa sulla pagina?
Esercizi Esplorativi
-
Scrivi una regola CSS che corrisponda all’elemento
<div class="picture">
in modo che il testo all’interno dei suoi susseguenti elementi di blocco si posizioni verso il suo lato destro. -
Come influisce la proprietà
top
su un elemento statico rispetto al suo elemento principale? -
In che modo cambiare la proprietà
display
di un elemento inflex
influenza il suo posizionamento nel flusso normale? -
Quale caratteristica dei CSS ti permette di usare un set separato di regole a seconda delle dimensioni dello schermo?
Sommario
Questa lezione si occupa della modellazione dei contenitori nei CSS e come possiamo personalizzarla. Oltre al normale flusso del documento, il designer può fare uso di diversi meccanismi di posizionamento per implementare un layout personalizzato. La lezione passa attraverso i seguenti concetti e procedure:
-
Il normale flusso del documento.
-
Regolazioni del margine e del bordo del contenitore di un elemento.
-
Utilizzo delle proprietà float e clear.
-
Meccanismi di posizionamento: static, relative, absolute, fixed e sticky.
-
Valori alternativi per la proprietà
display
. -
Nozioni di base sul responsive design.
Risposte agli Esercizi Guidati
-
Se la proprietà
position
non viene modificata, quale metodo di posizionamento verrà utilizzato dal browser?Il metodo
static
. -
Come ci si può assicurare che il riquadro di un elemento sia visualizzato dopo qualsiasi elemento flottante?
La proprietà
clear
dell’elemento dovrebbe essere impostata suboth
. -
Come puoi usare la proprietà stenografica
margin
per impostare i margini top/bottom a4px
e i margini right/left a6em
?Può essere sia
margin: 4px 6em
siamargin: 4px 6em 4px 6em
. -
Come si può centrare orizzontalmente un elemento contenitore statico con larghezza fissa sulla pagina?
Usando il valore
auto
nelle sue proprietàmargin-left
emargin-right
.
Risposte agli Esercizi Esplorativi
-
Scrivi una regola CSS che corrisponda all’elemento
<div class="picture">
in modo che il testo all’interno dei suoi susseguenti elementi di blocco si posizioni verso il suo lato destro..picture { float: left; }
-
Come influisce la proprietà
top
su un elemento statico rispetto al suo elemento principale?La proprietà
top
non si applica agli elementi statici. -
In che modo cambiare la proprietà
display
di un elemento inflex
influenza il suo posizionamento nel flusso normale?Il posizionamento dell’elemento stesso non cambia, ma i suoi più immediati elementi figli saranno resi orizzontalmente uno accanto all’altro.
-
Quale caratteristica dei CSS ti permette di usare un set separato di regole a seconda delle dimensioni dello schermo?
Le Media query permettono al browser di verificare le dimensioni del viewport prima di applicare una regola CSS.