Responsive Design

Bentornato.
Nella lezione precedente hai imparato CSS Grid.
Righe.
Colonne.
Card che si comportano come piccole scatole disciplinate.
Molto bene.
Ora dobbiamo far funzionare quei layout su schermi diversi.
Perché un sito che sembra bellissimo solo sul tuo laptop non è finito.
È solo sicuro di sé in una stanza sola.
Gli utenti possono aprire il tuo sito su:
- telefoni;
- tablet;
- laptop;
- monitor enormi;
- piccoli schermi vecchi;
- dispositivi che sembrano un browser incollato a un tostapane.
Il responsive design aiuta il sito ad adattarsi.
L’obiettivo è semplice:
rendere la pagina leggibile, usabile e piacevole su ogni schermo.
Senza costringere gli utenti a fare zoom, scrollare di lato o mettere in dubbio le tue scelte di vita.
Cosa Imparerai
In questa lezione imparerai:
- cosa significa responsive design;
- perché il viewport meta tag è importante;
- come usare larghezze flessibili;
- come rendere le immagini responsive;
- come usare le media queries;
- come applicare CSS mobile-first;
- come cambiare layout su schermi piccoli;
- come adattare card, testo e navigazione.
Cos’è il Responsive Design?
Responsive design significa costruire siti che si adattano a diverse dimensioni dello schermo.
Un layout desktop può avere:
- sezioni larghe;
- più colonne;
- testo grande;
- card affiancate.
Un layout mobile di solito ha bisogno di:
- una colonna;
- aree cliccabili più grandi;
- testo leggibile;
- meno complessità orizzontale;
- niente scroll laterale.
Responsive design non significa creare cinque siti diversi.
Significa creare un sito flessibile.
Un sito.
Molti schermi.
Meno caos.
Più dignità.
Il Viewport Meta Tag
Responsive design comincia in HTML.
Dentro head, dovresti avere questa riga:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
Questa riga dice al browser:
Usa la larghezza reale del dispositivo e non fingere che il telefono sia un piccolo desktop.
Senza questa riga, i browser mobile possono zoomare o scalare la pagina in modo strano.
Il tuo CSS può essere perfetto.
Ma senza il viewport meta tag, il telefono può comunque comportarsi come se avesse trovato il tuo layout in una caverna antica.
Includilo sempre.
Crea il Progetto
Crea una cartella per questa lezione:
mkdir css-lesson7
cd css-lesson7
touch index.html
touch style.css
Dovresti avere:
css-lesson7/
index.html
style.css
Apri la cartella nel tuo editor.
Costruiremo una piccola pagina responsive con:
- header;
- navigazione;
- hero section;
- card;
- immagine;
- footer.
Poi la faremo adattare agli schermi piccoli.
Niente panico.
Solo CSS.
Che a volte è la stessa cosa.
Ma oggi restiamo calmi.
Scrivi l’HTML
Apri index.html e aggiungi questo:
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Responsive Design</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header class="site-header">
<nav class="navbar">
<h1 class="logo">ResponsiveSite</h1>
<div class="nav-links">
<a href="#">Home</a>
<a href="#">Corsi</a>
<a href="#">Progetti</a>
<a href="#">Contatto</a>
</div>
</nav>
<section class="hero">
<div class="hero-text">
<h2>Costruisci Siti per Ogni Schermo</h2>
<p>
Il responsive design aiuta il layout ad adattarsi a telefoni, tablet, laptop e monitor grandi.
</p>
<a href="#" class="button">Inizia a Imparare</a>
</div>
<div class="hero-image">
<img src="https://via.placeholder.com/600x400" alt="Esempio di responsive design">
</div>
</section>
</header>
<main class="page">
<section class="intro">
<h2>Perché il Responsive Design Conta</h2>
<p>
Le persone visitano i siti da molti dispositivi. Il tuo layout dovrebbe funzionare ovunque, non solo sul tuo schermo preferito.
</p>
</section>
<section class="cards">
<article class="card">
<h2>Layout Flessibili</h2>
<p>Usa larghezze flessibili, Grid e Flexbox per creare layout che si adattano.</p>
</article>
<article class="card">
<h2>Testo Leggibile</h2>
<p>Il testo deve restare comodo da leggere sia su schermi piccoli che grandi.</p>
</article>
<article class="card">
<h2>Media Queries</h2>
<p>Usa media queries per cambiare stili a diverse dimensioni dello schermo.</p>
</article>
</section>
</main>
<footer class="site-footer">
<p>Creato mentre imparo responsive design.</p>
</footer>
</body>
</html>
Questo HTML include il viewport meta tag.
Bene.
La tua pagina è già più preparata per gli schermi mobile di molti siti del 2009.
Una piccola vittoria.
Inizia con il CSS Base
Apri style.css e aggiungi:
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: Arial, sans-serif;
background-color: #f3f4f6;
color: #111827;
}
a {
color: inherit;
text-decoration: none;
}
img {
max-width: 100%;
display: block;
}
Parte importante:
img {
max-width: 100%;
display: block;
}
Questo rende le immagini responsive.
L’immagine non diventerà più larga del suo container.
Senza questo, immagini grandi possono rompere il layout.
Le immagini sono come ospiti entusiasti.
Bello averle.
Ma hanno bisogno di confini.
Stilizza Header e Navbar
Aggiungi questo:
.site-header {
background-color: #111827;
color: white;
}
.navbar {
max-width: 1100px;
margin: 0 auto;
padding: 24px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
}
.logo {
margin: 0;
font-size: 24px;
}
.nav-links {
display: flex;
gap: 20px;
font-weight: 700;
}
Su desktop, logo e link saranno sulla stessa riga.
Va bene per schermi larghi.
Ma sui telefoni potrebbe non esserci abbastanza spazio.
Lo sistemeremo più avanti con una media query.
Per ora, layout desktop.
Come costruire il tavolo prima di decidere dove si siederà il gatto.
Stilizza la Hero Section
Aggiungi:
.hero {
max-width: 1100px;
margin: 0 auto;
padding: 64px 24px;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 40px;
align-items: center;
}
.hero-text h2 {
margin: 0 0 16px;
font-size: 48px;
line-height: 1.1;
}
.hero-text p {
color: #d1d5db;
font-size: 20px;
line-height: 1.7;
}
.button {
display: inline-block;
background-color: #2563eb;
color: white;
padding: 14px 20px;
border-radius: 999px;
font-weight: 700;
margin-top: 16px;
}
.hero-image img {
border-radius: 24px;
border: 2px solid #374151;
}
La hero usa Grid con due colonne:
grid-template-columns: 1fr 1fr;
Questo va bene per desktop.
Testo da una parte.
Immagine dall’altra.
Molto rispettabile.
Ma su un telefono, due colonne possono diventare troppo strette.
Quindi più avanti le trasformeremo in una colonna.
CSS deve imparare le buone maniere.
Stilizza la Pagina Principale
Aggiungi:
.page {
max-width: 1100px;
margin: 40px auto;
padding: 0 24px;
}
.intro {
background-color: white;
padding: 32px;
border-radius: 18px;
margin-bottom: 24px;
border-left: 6px solid #2563eb;
}
.intro h2 {
margin-top: 0;
font-size: 32px;
}
.intro p {
color: #4b5563;
font-size: 18px;
line-height: 1.7;
}
Questo dà al contenuto una larghezza comoda.
max-width impedisce alla pagina di diventare troppo larga.
padding tiene il contenuto lontano dai bordi dello schermo.
Sui telefoni, il padding laterale è molto importante.
Testo attaccato al bordo dello schermo sembra scomodo.
Come una sedia con una gamba sospetta.
Crea Card Responsive
Aggiungi:
.cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
.card {
background-color: white;
padding: 28px;
border: 2px solid #e5e7eb;
border-radius: 18px;
}
.card h2 {
margin-top: 0;
font-size: 24px;
}
.card p {
color: #4b5563;
font-size: 18px;
line-height: 1.6;
}
Su desktop mostriamo tre card in una riga.
Va bene.
Ma su tablet e telefoni servono meno colonne.
Qui entrano le media queries.
Le media queries sono CSS che dice:
“In certe condizioni, mi comporterò diversamente.”
Molto maturo.
Se solo tutti i layout fossero così emotivamente disponibili.
Cos’è una Media Query?
Una media query permette di applicare CSS solo quando alcune condizioni sono vere.
Esempio:
@media (max-width: 800px) {
.cards {
grid-template-columns: 1fr;
}
}
Questo significa:
Se lo schermo è largo 800px o meno, metti le card in una colonna.
Le media queries sono essenziali per il responsive design.
Permettono al layout di adattarsi.
Non di andare in panico.
Adattarsi.
Grande differenza.
Rendi il Layout Responsive
Aggiungi questo in fondo al CSS:
@media (max-width: 800px) {
.hero {
grid-template-columns: 1fr;
}
.cards {
grid-template-columns: repeat(2, 1fr);
}
.hero-text h2 {
font-size: 40px;
}
}
Ora:
- la hero diventa una colonna;
- le card diventano due colonne;
- il titolo hero diventa più piccolo.
Questo è meglio per tablet e schermi più piccoli.
Non perfetto ancora.
Ma meglio.
Responsive design non è una soluzione gigante.
È una serie di decisioni ragionevoli.
Come la vita.
Ma con più punti e virgola.
Migliora il Layout su Telefono
Aggiungi un’altra media query:
@media (max-width: 560px) {
.navbar {
flex-direction: column;
align-items: flex-start;
}
.nav-links {
flex-direction: column;
gap: 12px;
}
.hero {
padding: 48px 20px;
}
.hero-text h2 {
font-size: 34px;
}
.hero-text p {
font-size: 18px;
}
.cards {
grid-template-columns: 1fr;
}
.intro,
.card {
padding: 24px;
}
}
Ora sui telefoni:
- navbar diventa verticale;
- link diventano una colonna;
- titolo hero diventa più piccolo;
- card diventano una colonna;
- spacing diventa più compatto.
Questo è responsive design in azione.
Lo stesso HTML.
Layout diverso in base allo schermo.
Molto potente.
Molto utile.
Quasi sospettosamente civile.
CSS Mobile-First
Ci sono due approcci comuni.
Desktop-first:
.cards {
grid-template-columns: repeat(3, 1fr);
}
@media (max-width: 560px) {
.cards {
grid-template-columns: 1fr;
}
}
Mobile-first:
.cards {
grid-template-columns: 1fr;
}
@media (min-width: 700px) {
.cards {
grid-template-columns: repeat(3, 1fr);
}
}
Mobile-first significa scrivere prima il layout mobile, poi aggiungere layout più larghi per schermi più grandi.
Spesso è un buon approccio.
Perché?
Perché gli schermi piccoli hanno più limiti.
Se il design funziona su telefono, espanderlo per desktop è spesso più facile.
Come preparare prima uno zaino, poi trasferirsi in una casa.
Non il contrario.
Larghezze Flessibili
Evita larghezze fisse quando possibile.
Male:
.card {
width: 400px;
}
Questo può rompersi su schermi piccoli.
Meglio:
.card {
width: 100%;
max-width: 400px;
}
Oppure lascia che Grid controlli la larghezza:
.cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
Le larghezze fisse non sono sempre sbagliate.
Ma vanno usate con attenzione.
Una larghezza fissa su desktop può diventare un disastro su mobile.
CSS ricorda tutto.
E mobile espone i tuoi peccati.
Testo Responsive
Titoli grandi su desktop possono essere troppo grandi sui telefoni.
Desktop:
.hero-text h2 {
font-size: 48px;
}
Telefono:
@media (max-width: 560px) {
.hero-text h2 {
font-size: 34px;
}
}
Questo mantiene il testo leggibile senza invadere lo schermo.
Il testo grande è bello.
Il testo che mangia tutto lo schermo del telefono non è bello.
Non è un titolo.
È una situazione con ostaggi.
CSS Completo
Il tuo style.css dovrebbe essere così:
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: Arial, sans-serif;
background-color: #f3f4f6;
color: #111827;
}
a {
color: inherit;
text-decoration: none;
}
img {
max-width: 100%;
display: block;
}
.site-header {
background-color: #111827;
color: white;
}
.navbar {
max-width: 1100px;
margin: 0 auto;
padding: 24px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
}
.logo {
margin: 0;
font-size: 24px;
}
.nav-links {
display: flex;
gap: 20px;
font-weight: 700;
}
.hero {
max-width: 1100px;
margin: 0 auto;
padding: 64px 24px;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 40px;
align-items: center;
}
.hero-text h2 {
margin: 0 0 16px;
font-size: 48px;
line-height: 1.1;
}
.hero-text p {
color: #d1d5db;
font-size: 20px;
line-height: 1.7;
}
.button {
display: inline-block;
background-color: #2563eb;
color: white;
padding: 14px 20px;
border-radius: 999px;
font-weight: 700;
margin-top: 16px;
}
.hero-image img {
border-radius: 24px;
border: 2px solid #374151;
}
.page {
max-width: 1100px;
margin: 40px auto;
padding: 0 24px;
}
.intro {
background-color: white;
padding: 32px;
border-radius: 18px;
margin-bottom: 24px;
border-left: 6px solid #2563eb;
}
.intro h2 {
margin-top: 0;
font-size: 32px;
}
.intro p {
color: #4b5563;
font-size: 18px;
line-height: 1.7;
}
.cards {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
.card {
background-color: white;
padding: 28px;
border: 2px solid #e5e7eb;
border-radius: 18px;
}
.card h2 {
margin-top: 0;
font-size: 24px;
}
.card p {
color: #4b5563;
font-size: 18px;
line-height: 1.6;
}
.site-footer {
text-align: center;
padding: 32px 24px;
color: #6b7280;
}
@media (max-width: 800px) {
.hero {
grid-template-columns: 1fr;
}
.cards {
grid-template-columns: repeat(2, 1fr);
}
.hero-text h2 {
font-size: 40px;
}
}
@media (max-width: 560px) {
.navbar {
flex-direction: column;
align-items: flex-start;
}
.nav-links {
flex-direction: column;
gap: 12px;
}
.hero {
padding: 48px 20px;
}
.hero-text h2 {
font-size: 34px;
}
.hero-text p {
font-size: 18px;
}
.cards {
grid-template-columns: 1fr;
}
.intro,
.card {
padding: 24px;
}
}
Salva il file.
Aggiorna il browser.
Ridimensiona la finestra.
Il layout dovrebbe cambiare.
Desktop:
- navbar in una riga;
- hero in due colonne;
- card in tre colonne.
Tablet:
- hero in una colonna;
- card in due colonne.
Telefono:
- navbar verticale;
- card in una colonna;
- testo più piccolo e più leggibile.
Complimenti.
Il tuo layout non ha più paura dei telefoni.
Errori Comuni
Dimenticare il viewport meta tag
Senza questo:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
il layout mobile può comportarsi male.
Includilo sempre.
Non negoziare con questa riga.
È piccola ma potente.
Come una minuscola guardia del corpo CSS.
Creare scroll orizzontale
Lo scroll orizzontale spesso succede perché qualcosa è troppo largo.
Cause comuni:
- larghezza fissa;
- immagine grande;
- testo lungo senza spazi;
- troppe colonne;
- manca
max-width: 100%sulle immagini.
Se la pagina scrolla di lato su mobile, indaga.
Lo scroll laterale di solito è una richiesta d’aiuto.
Testo troppo piccolo
Gli utenti su telefono non dovrebbero usare un microscopio.
Male:
p {
font-size: 12px;
}
Meglio:
p {
font-size: 16px;
line-height: 1.6;
}
Il testo leggibile conta.
Un layout bellissimo con testo illeggibile è solo decorazione con problemi di fiducia.
Pratica
Crea una pagina responsive con:
- navbar;
- hero section;
- immagine;
- tre card;
- footer.
Falla funzionare così:
- desktop: hero in due colonne, card in tre colonne;
- tablet: hero in una colonna, card in due colonne;
- telefono: navbar verticale, card in una colonna.
Usa:
max-width;grid-template-columns;media queries;max-width: 100%per immagini;- spacing flessibile;
- titoli più piccoli sui telefoni.
Testa ridimensionando il browser.
Non fidarti solo dei tuoi occhi su uno schermo.
Uno schermo mente.
Molti schermi dicono la verità.
Mini Sfida
Prendi la card grid della lezione precedente.
Rendila responsive:
- 3 colonne su desktop;
- 2 colonne sotto
800px; - 1 colonna sotto
560px.
Poi aggiungi una hero responsive sopra.
Usa Grid per la hero.
Usa Grid per le card.
Usa Flexbox per la navbar.
Questo è un pattern reale di layout web.
Non stai solo imparando teoria.
Stai costruendo la struttura usata nei siti veri.
Il layout sta crescendo.
Cerca di non piangere.
Riassunto
Oggi hai imparato che:
- responsive design fa adattare i siti a diversi schermi;
- il viewport meta tag è essenziale;
- le immagini dovrebbero usare spesso
max-width: 100%; - le larghezze fisse possono rompere layout mobile;
- media queries applicano CSS solo in certe condizioni;
- i layout spesso hanno bisogno di meno colonne su schermi piccoli;
- le dimensioni del testo possono dover cambiare sui telefoni;
- CSS mobile-first parte dagli schermi piccoli e cresce verso quelli grandi;
- responsive design non è opzionale.
Un sito deve funzionare dove gli utenti sono davvero.
E gli utenti sono ovunque.
Telefoni.
Tablet.
Laptop.
Dispositivi strani.
Forse anche frigoriferi intelligenti.
Non costruire solo per il tuo schermo.
Costruisci per la vita reale.
La vita reale ha molte dimensioni di schermo e pochissima pazienza.
Prossima Lezione
Nella prossima lezione impareremo backgrounds, borders e shadows.
Renderemo sezioni, card e pulsanti più rifiniti.
Non sovradecorati.
Rifiniti.
C’è differenza.
Una differenza molto importante.