Lezione 22: Comprendere i Selettori CSS - Element, Class e ID (Corso HTML)

In questa lezione cruciale, esploreremo i selettori CSS fondamentali: element, class e id. Impara a targettizzare specifici elementi HTML per applicare stili in modo efficace e organizzato, un passo indispensabile per ogni sviluppatore web.

La programmazione web è un viaggio affascinante che inizia con la comprensione di come i vari linguaggi interagiscono tra loro per dare vita ai siti che navighiamo ogni giorno. Abbiamo già esplorato le basi dell'HTML, imparando a strutturare il contenuto di una pagina web. Ma una pagina ben strutturata non è sufficiente se non è anche piacevole alla vista e facile da usare. È qui che entra in gioco il CSS (Cascading Style Sheets), il linguaggio che ci permette di dare stile e layout ai nostri documenti HTML.

Per applicare stili CSS agli elementi HTML, dobbiamo prima "selezionarli". Immaginate di avere una scatola piena di giocattoli diversi: per colorare solo le macchinine rosse, dovete prima identificarle. Allo stesso modo, i selettori CSS sono gli strumenti che ci permettono di puntare a specifici elementi o gruppi di elementi all'interno del nostro HTML per applicare regole di stile mirate. Senza i selettori, il CSS sarebbe quasi inutile, poiché non sapremmo a quali parti del documento applicare le nostre modifiche visive.

In questa lezione, ci concentreremo sui tre selettori CSS più comuni e fondamentali: il selettore per elemento (o tipo), il selettore per classe e il selettore per ID. Comprendere a fondo questi tre pilastri è essenziale per costruire qualsiasi interfaccia web moderna e ben mantenuta. Ogni selettore ha il suo scopo, i suoi vantaggi e i suoi specifici casi d'uso, e saperli distinguere e applicare correttamente è un segno distintivo di un buon sviluppatore frontend.

1. Il Cuore del CSS: Selezionare gli Elementi

Prima di immergerci nei dettagli di ogni selettore, è fondamentale capire il concetto generale di "selezione" in CSS. Quando scriviamo regole CSS, stiamo essenzialmente dicendo al browser: "Trova tutti gli elementi che corrispondono a questo criterio e applica loro queste proprietà di stile". Il criterio è appunto il selettore. La capacità di selezionare con precisione è ciò che rende il CSS così potente e flessibile.

Un selettore CSS è un pattern che punta agli elementi HTML a cui si vuole applicare uno stile. Questi pattern possono essere semplici, come il nome di un tag HTML, oppure molto complessi, combinando diversi criteri per selezionare un elemento specifico in un contesto particolare. Per i principianti, iniziare con i selettori base è il modo migliore per costruire una solida comprensione.

Il CSS viene solitamente scritto in un file separato (.css) e collegato al documento HTML tramite il tag <link> all'interno della sezione <head>. Questo approccio, noto come "fogli di stile esterni", è la best practice per mantenere il codice organizzato e riutilizzabile. In alternativa, si possono usare stili interni (<style> nel <head>) o stili in linea (attributo style su un elemento HTML), ma questi ultimi due sono generalmente sconsigliati per progetti di una certa dimensione a causa della loro minore manutenibilità e riusabilità.

Sintassi Base di una Regola CSS

Ogni regola CSS è composta da due parti principali:

  1. Il Selettore: Indica a quali elementi HTML si applicano le regole.
  2. Il Blocco di Dichiarazione: Contiene una o più dichiarazioni, racchiuse tra parentesi graffe {}. Ogni dichiarazione è una coppia proprietà-valore, separata da due punti : e terminata da un punto e virgola ;.

Esempio:

p {
  color: blue;
  font-size: 16px;
}

In questo esempio, p è il selettore, e color: blue; e font-size: 16px; sono le dichiarazioni. Questo significa che tutti i paragrafi (<p>) nel documento avranno testo blu e una dimensione del carattere di 16 pixel.

2. Selettore per Elemento (Type Selector)

Il selettore per elemento, o selettore di tipo, è il più semplice e diretto tra i selettori CSS. Permette di selezionare tutti gli elementi di un determinato tipo di tag HTML.

Come Funziona

Per usare un selettore per elemento, è sufficiente scrivere il nome del tag HTML che si vuole stilizzare. Ad esempio, se vuoi stilizzare tutti i paragrafi, userai p. Se vuoi stilizzare tutte le intestazioni di primo livello, userai h1.

Sintassi

selector_name {
  property: value;
}

Dove selector_name è il nome del tag HTML (es. body, h1, p, a, img, div, span).

Quando Usarlo

Il selettore per elemento è ideale quando vuoi applicare uno stile di base e uniforme a tutti gli elementi di un certo tipo sulla tua pagina. È ottimo per definire stili globali o predefiniti per i tag HTML standard. Ad esempio, potresti voler che tutti i paragrafi abbiano un certo line-height o che tutti i link abbiano un text-decoration predefinito.

Esempio di Codice

Consideriamo questo semplice HTML:

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Esempio Selettore Elemento</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>Benvenuti nel mio sito</h1>
    <p>Questo è il primo paragrafo del contenuto.</p>
    <p>Questo è il secondo paragrafo, anch'esso importante.</p>
    <a href="#">Vai a un'altra pagina</a>
</body>
</html>

E il file style.css:

/* style.css */
body {
  font-family: Arial, sans-serif;
  margin: 20px;
  background-color: #f4f4f4;
}

h1 {
  color: #333;
  text-align: center;
  border-bottom: 2px solid #ccc;
  padding-bottom: 10px;
}

p {
  font-size: 18px;
  line-height: 1.6;
  color: #555;
}

a {
  color: #007bff;
  text-decoration: none;
}

a:hover {
  text-decoration: underline;
}

In questo esempio, abbiamo usato i selettori body, h1, p e a per stilizzare rispettivamente il corpo della pagina, tutte le intestazioni h1, tutti i paragrafi e tutti i link. Ogni elemento di quel tipo riceverà gli stili definiti. È un modo efficiente per impostare uno stile di base per l'intera pagina.

Vantaggi e Limiti

  • Vantaggi: Facile da usare, ottimo per stili globali, rende il codice più pulito per stili di base.
  • Limiti: Manca di specificità. Non puoi stilizzare un solo paragrafo in modo diverso dagli altri usando solo questo selettore. Se hai bisogno di maggiore controllo, devi ricorrere ad altri selettori.

3. Selettore per Classe (Class Selector)

Il selettore per classe è uno strumento incredibilmente potente e versatile che ti permette di applicare stili a gruppi specifici di elementi, indipendentemente dal loro tipo di tag. È il selettore più utilizzato e flessibile nello sviluppo web moderno.

Come Funziona

Per usare un selettore per classe, devi prima assegnare un attributo class agli elementi HTML che vuoi stilizzare. L'attributo class può avere uno o più valori (nomi di classe), separati da spazi. Nel CSS, si seleziona una classe precedendo il nome della classe con un punto (.).

Sintassi

In HTML:

<element class="nome-classe-1 nome-classe-2">Contenuto</element>

In CSS:

.nome-classe-1 {
  property: value;
}

.nome-classe-2 {
  property: value;
}

Quando Usarlo

Le classi sono ideali per:

  • Riusabilità: Puoi applicare la stessa classe a più elementi diversi (un p, un div, un span, ecc.) per dare loro lo stesso stile. Questo evita la ripetizione di codice CSS.
  • Raggruppamento: Permettono di raggruppare elementi che condividono una funzione o un aspetto visivo, anche se non sono dello stesso tipo HTML.
  • Modularità: Aiutano a creare componenti riutilizzabili e stili modulari.
  • Stili Condizionali: Spesso usate con JavaScript per aggiungere o rimuovere dinamicamente classi, cambiando l'aspetto degli elementi in base all'interazione dell'utente o allo stato dell'applicazione.

Esempio di Codice

Riprendiamo il nostro HTML e aggiungiamo delle classi:

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Esempio Selettore Classe</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>Benvenuti nel mio sito</h1>
    <p class="introduzione">Questo è il primo paragrafo, un'introduzione speciale.</p>
    <p>Questo è il secondo paragrafo, standard.</p>
    <div class="box-info">
        <p>Contenuto importante all'interno di un box.</p>
        <a href="#" class="button">Clicca qui</a>
    </div>
    <p class="introduzione">Un altro paragrafo con la stessa classe di introduzione.</p>
</body>
</html>

E il file style.css aggiornato:

/* style.css */
body {
  font-family: Arial, sans-serif;
  margin: 20px;
  background-color: #f4f4f4;
}

h1 {
  color: #333;
  text-align: center;
  border-bottom: 2px solid #ccc;
  padding-bottom: 10px;
}

p {
  font-size: 18px;
  line-height: 1.6;
  color: #555;
}

.introduzione {
  font-style: italic;
  color: #007bff;
  font-weight: bold;
}

.box-info {
  background-color: #e9ecef;
  border: 1px solid #dee2e6;
  padding: 15px;
  margin: 20px 0;
  border-radius: 5px;
}

.button {
  display: inline-block;
  background-color: #28a745;
  color: white;
  padding: 10px 20px;
  text-decoration: none;
  border-radius: 5px;
  margin-top: 10px;
}

.button:hover {
  background-color: #218838;
}

In questo esempio, notiamo:

  • p.introduzione: Il primo e l'ultimo paragrafo hanno la classe introduzione e quindi ricevono stili specifici (corsivo, colore blu, grassetto) che il secondo paragrafo standard non ha.
  • .box-info: Il div riceve uno stile di sfondo, bordo e padding, rendendolo un "box" visivamente distinto.
  • .button: Il link all'interno del div è stilizzato come un bottone, dimostrando come una classe possa essere applicata a un tipo di elemento diverso per ottenere un aspetto specifico.

Un elemento può avere più classi. Ad esempio, <p class="testo-grande testo-centrato"> applicherà gli stili definiti per testo-grande e testo-centrato a quel paragrafo. Questo è estremamente utile per combinare diversi stili modulari.

4. Selettore per ID (ID Selector)

Il selettore per ID è il più specifico dei tre selettori base. È progettato per selezionare un singolo elemento univoco sulla pagina. L'unicità è la sua caratteristica distintiva e più importante.

Come Funziona

Per usare un selettore per ID, devi assegnare un attributo id a un elemento HTML. Il valore dell'attributo id deve essere unico all'interno dell'intero documento HTML. Nel CSS, si seleziona un ID precedendo il nome dell'ID con un cancelletto (#).

Sintassi

In HTML:

<element id="nome-id-unico">Contenuto</element>

In CSS:

#nome-id-unico {
  property: value;
}

Quando Usarlo

Gli ID sono appropriati per:

  • Elementi Unici: Elementi che appaiono una sola volta sulla pagina e hanno un ruolo strutturale o funzionale specifico (es. header, footer, main-navigation, sidebar, logo).
  • Ancore Interne: Usati per creare link interni alla pagina (<a href="#nome-id">).
  • JavaScript: Spesso usati da JavaScript per accedere a un elemento specifico del DOM (Document Object Model) in modo diretto e univoco.

L'Importanza dell'Unicità

È una regola fondamentale dell'HTML e del CSS che un id debba essere univoco per l'intera pagina. Non dovresti mai avere due elementi con lo stesso id. Anche se i browser spesso gestiscono questa violazione senza errori evidenti, può portare a comportamenti imprevedibili nel CSS, in JavaScript e nella navigazione interna. Se hai bisogno di stilizzare più elementi in modo simile, usa le classi, non gli ID.

Esempio di Codice

Modifichiamo nuovamente il nostro HTML e CSS:

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Esempio Selettore ID</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <header id="main-header">
        <h1>Il Mio Blog Personale</h1>
        <nav>
            <ul>
                <li><a href="#">Home</a></li>
                <li><a href="#about">Chi Sono</a></li>
                <li><a href="#contact">Contatti</a></li>
            </ul>
        </nav>
    </header>

    <main>
        <section id="about">
            <h2>Chi Sono</h2>
            <p>Sono un appassionato sviluppatore web che ama creare esperienze digitali.</p>
        </section>

        <section>
            <h2>Ultimi Articoli</h2>
            <p>Qui troverai i miei ultimi post.</p>
        </section>
    </main>

    <footer id="main-footer">
        <p>&copy; 2023 Il Mio Blog. Tutti i diritti riservati.</p>
    </footer>
</body>
</html>

E il file style.css aggiornato:

/* style.css */
body {
  font-family: Arial, sans-serif;
  margin: 0;
  background-color: #f8f9fa;
}

#main-header {
  background-color: #343a40;
  color: white;
  padding: 1rem 0;
  text-align: center;
}

#main-header h1 {
  margin: 0;
  color: white;
  border-bottom: none;
  padding-bottom: 0;
}

#main-header nav ul {
  list-style: none;
  padding: 0;
  margin: 0;
}

#main-header nav ul li {
  display: inline;
  margin: 0 15px;
}

#main-header nav ul li a {
  color: white;
  text-decoration: none;
  font-weight: bold;
}

#main-header nav ul li a:hover {
  text-decoration: underline;
}

main {
  padding: 20px;
  max-width: 960px;
  margin: 20px auto;
  background-color: white;
  box-shadow: 0 0 10px rgba(0,0,0,0.1);
  border-radius: 8px;
}

section {
  margin-bottom: 30px;
  padding-bottom: 20px;
  border-bottom: 1px dashed #eee;
}

section:last-of-type {
  border-bottom: none;
}

h2 {
  color: #007bff;
  margin-top: 0;
}

#about {
  background-color: #e2f0fb;
  padding: 20px;
  border-radius: 5px;
  border-left: 5px solid #007bff;
}

#main-footer {
  background-color: #343a40;
  color: white;
  text-align: center;
  padding: 1rem 0;
  margin-top: 30px;
}

Qui, abbiamo usato #main-header, #about e #main-footer per stilizzare parti uniche della nostra pagina: l'intestazione principale, la sezione "Chi Sono" e il piè di pagina. Questi elementi sono unici per natura in una pagina web tipica, rendendo l'uso degli ID appropriato. Notate anche come il link Chi Sono nella navigazione (<a href="#about">) punta direttamente alla sezione con id="about", una funzionalità comune per la navigazione interna.

5. Gerarchia e Specificità: Chi Vince?

Quando più regole CSS possono applicarsi allo stesso elemento, come fa il browser a decidere quale regola deve prevalere? La risposta sta nel concetto di specificità dei selettori. Ogni selettore ha un "punteggio" di specificità, e la regola con il punteggio più alto vince.

L'ordine generale di specificità (dal più specifico al meno specifico, ignorando gli stili in linea che hanno la specificità più alta assoluta):

  1. ID Selettori: Hanno la specificità più alta tra i selettori che abbiamo visto. Un ID è unico, quindi la sua regola ha un peso maggiore.
  2. Class Selettori: Hanno una specificità media. Una classe può essere applicata a più elementi, ma è comunque più specifica di un tag generico.
  3. Element Selettori: Hanno la specificità più bassa. Si applicano a tutti gli elementi di un dato tipo.

Se due selettori hanno la stessa specificità, vince la regola che appare per ultima nel foglio di stile (o nell'ordine in cui sono stati caricati i fogli di stile).

Perché è Importante?

Capire la specificità è cruciale per il debugging e per scrivere CSS prevedibile. Spesso, un principiante si trova a chiedersi perché una certa regola non viene applicata. La causa è quasi sempre un'altra regola con una specificità maggiore che la sta sovrascrivendo. È una buona pratica cercare di mantenere la specificità più bassa possibile per rendere il CSS più facile da mantenere e da estendere.

6. Esempi Pratici e Scenari Reali

Vediamo un esempio più complesso che integra tutti e tre i selettori per costruire una semplice card di prodotto o articolo, un componente comune in molti siti web.

Scenario: Vogliamo creare delle card per visualizzare prodotti o articoli. Ogni card avrà un titolo, una descrizione, e un pulsante. Alcune card potrebbero essere "in evidenza" con uno stile speciale.

HTML (index.html):

<!DOCTYPE html>
<html lang="it">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Esempio Card con Selettori</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <header id="header-principale">
        <h1>I Nostri Prodotti</h1>
    </header>

    <div class="container">
        <div class="card">
            <h2 class="card-title">Prodotto Standard A</h2>
            <p class="card-description">Una descrizione breve del prodotto A. Ottimo rapporto qualità-prezzo.</p>
            <button class="btn btn-primary">Acquista Ora</button>
        </div>

        <div class="card featured-card">
            <h2 class="card-title">Prodotto In Evidenza B</h2>
            <p class="card-description">Questo è il nostro prodotto di punta! Non lasciartelo sfuggire.</p>
            <button class="btn btn-secondary">Scopri di Più</button>
        </div>

        <div class="card">
            <h2 class="card-title">Prodotto C</h2>
            <p class="card-description">Un'altra offerta interessante per te.</p>
            <button class="btn btn-primary">Dettagli</button>
        </div>
    </div>

    <footer id="footer-globale">
        <p>&copy; 2023 Negozio Online</p>
    </footer>
</body>
</html>

CSS (style.css):

/* Stili globali con selettori per elemento */
body {
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    margin: 0;
    background-color: #f2f2f2;
    color: #333;
}

h1 {
    font-size: 2.5em;
    margin-bottom: 20px;
}

p {
    font-size: 1.1em;
    line-height: 1.6;
}

button {
    border: none;
    padding: 10px 20px;
    border-radius: 5px;
    cursor: pointer;
    font-size: 1em;
    transition: background-color 0.3s ease;
}

/* Stili per ID - elementi unici */
#header-principale {
    background-color: #0056b3;
    color: white;
    padding: 30px 0;
    text-align: center;
    box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}

#footer-globale {
    background-color: #333;
    color: white;
    text-align: center;
    padding: 20px 0;
    margin-top: 40px;
}

/* Stili per Classi - elementi riutilizzabili e raggruppabili */
.container {
    max-width: 1200px;
    margin: 40px auto;
    display: flex;
    flex-wrap: wrap;
    gap: 30px;
    justify-content: center;
}

.card {
    background-color: white;
    border-radius: 10px;
    box-shadow: 0 4px 10px rgba(0,0,0,0.1);
    padding: 25px;
    width: 300px;
    text-align: center;
    transition: transform 0.2s ease;
}

.card:hover {
    transform: translateY(-5px);
}

.card-title {
    color: #0056b3;
    font-size: 1.8em;
    margin-top: 0;
    margin-bottom: 15px;
}

.card-description {
    color: #666;
    margin-bottom: 25px;
}

.btn-primary {
    background-color: #007bff;
    color: white;
}

.btn-primary:hover {
    background-color: #0056b3;
}

.btn-secondary {
    background-color: #6c757d;
    color: white;
}

.btn-secondary:hover {
    background-color: #5a6268;
}

/* Stile per una classe combinata (featured-card) */
.featured-card {
    border: 3px solid #ffc107;
    box-shadow: 0 6px 15px rgba(255,193,7,0.4);
    background-color: #fff3cd;
}

.featured-card .card-title {
    color: #e0a800;
}

.featured-card .btn-secondary {
    background-color: #ffc107;
    color: #333;
}

.featured-card .btn-secondary:hover {
    background-color: #e0a800;
}

In questo esempio, possiamo vedere chiaramente l'uso combinato dei selettori:

  • Selettori per Elemento: body, h1, p, button definiscono stili di base globali che si applicano a tutti gli elementi di quel tipo. Questo stabilisce un look and feel coerente per l'intera pagina.
  • Selettori per ID: #header-principale e #footer-globale sono usati per stilizzare le sezioni uniche della pagina, come l'intestazione e il piè di pagina, che appaiono una sola volta.
  • Selettori per Classe: .container, .card, .card-title, .card-description, .btn, .btn-primary, .btn-secondary sono usati per creare componenti riutilizzabili. Ad esempio, .card definisce lo stile generale di una card, e .btn-primary e .btn-secondary definiscono stili per diversi tipi di pulsanti. La classe featured-card viene aggiunta a una card specifica per darle uno stile aggiuntivo e unico, dimostrando come le classi possano essere concatenate per effetti combinati.

Questo esempio mostra come, combinando i tre tipi di selettori, si possa costruire una struttura robusta e flessibile per lo styling, permettendo di gestire sia stili globali che specifici con efficacia.

7. Errori Comuni e Consigli Utili

Anche i selettori base possono portare a errori comuni per i principianti. Essere consapevoli di questi può farvi risparmiare tempo e frustrazione.

Dimenticare il Punto o il Cancelletto

  • Errore: Scrivere my-class { ... } invece di .my-class { ... } o my-id { ... } invece di #my-id { ... }.
  • Soluzione: Ricorda sempre che le classi richiedono il punto (.) e gli ID il cancelletto (#) nel CSS.

Usare ID Quando Servirebbe una Classe

  • Errore: Applicare id="item1", id="item2", id="item3" a una lista di elementi simili che dovrebbero avere lo stesso stile.
  • Soluzione: Se più elementi condividono lo stesso stile o funzione, usa una classe (es. class="lista-item"). Gli ID sono per elementi unici.

Nomi di Classi/ID Non Descrittivi

  • Errore: Usare nomi come red-text, left-column, font-large che descrivono l'aspetto piuttosto che lo scopo o il contenuto. Questi nomi diventano problematici se lo stile cambia (es. red-text ora è blu).
  • Soluzione: Scegli nomi semantici che descrivano lo scopo dell'elemento o del componente, come warning-message, sidebar-nav, product-card. Questo rende il CSS più robusto e facile da capire.

Non Comprendere la Specificità

  • Errore: Aggiungere !important a una regola CSS per farla funzionare, senza capire perché la regola originale non veniva applicata. Questo è un anti-pattern e rende il CSS difficile da mantenere.
  • Soluzione: Quando una regola non si applica, controlla la specificità delle altre regole che potrebbero influire sullo stesso elemento. Usa gli strumenti di sviluppo del browser (Developer Tools) per ispezionare gli stili applicati e la loro origine.

Mancanza di Coerenza nella Denominazione

  • Errore: Usare my-button, myButton, MyButton in diversi punti del progetto. Questo può portare a confusione e errori.
  • Soluzione: Adottare una convenzione di denominazione coerente (es. kebab-case per classi e ID: nome-del-componente). Framework come BEM (Block Element Modifier) offrono linee guida eccellenti per la denominazione delle classi.

8. Prossimi Passi

Congratulazioni! Hai ora una solida comprensione dei tre selettori CSS fondamentali. Questo è un passo enorme per chiunque si avvicini al mondo dello sviluppo web. Ma il CSS è un linguaggio ricco e ci sono ancora molte cose da esplorare per diventare un vero maestro degli stili. Ecco alcuni argomenti che potresti voler approfondire nelle prossime lezioni o in autonomia:

  • Altri Tipi di Selettori: Esistono selettori più avanzati come i selettori di attributo (es. [type="text"]), i selettori pseudo-classi (es. :hover, :focus, :first-child), i selettori pseudo-elementi (es. ::before, ::after), e i selettori combinatori (es. div p, div > p, div + p, div ~ p). Questi ti daranno un controllo ancora più granulare sui tuoi stili.
  • Specificità in Dettaglio: Approfondisci come viene calcolata la specificità per evitare conflitti di stile e scrivere CSS più prevedibile.
  • Ereditarietà CSS: Scopri come alcune proprietà CSS vengono ereditate dagli elementi figli e come questo influisce sul tuo styling.
  • Box Model: Un concetto fondamentale in CSS che spiega come il browser rende gli elementi HTML in termini di contenuto, padding, bordo e margine.
  • Flessibilità con Flexbox e Grid: Per layout più complessi e responsive, Flexbox e CSS Grid sono strumenti indispensabili che ti permetteranno di creare design moderni con facilità.
  • Unità di Misura in CSS: Esplora le diverse unità di misura (px, em, rem, vw, vh, %) e quando usarle per layout flessibili e responsive.

Continuare a praticare è la chiave. Prova a costruire piccole pagine web e a stilizzarle usando i selettori che hai imparato. Sperimenta, rompi le cose e poi riparale. È il modo migliore per imparare e consolidare le tue conoscenze. Il mondo della programmazione web è vasto e in continua evoluzione, ma con queste basi solide, sei ben equipaggiato per continuare il tuo percorso!