Corso di CSS / Bordi, angoli arrotondati e ombre CSS
I bordi CSS definiscono il bordo visibile di una scatola, border-radius arrotonda i suoi angoli e box-shadow aggiunge un'ombra senza aumentare la dimensione del layout. Le ombre possono ancora essere ritagliate dalle impostazioni di overflow di un antenato, e un bordo arrotondato non ritaglia automaticamente ogni elemento figlio.
Imposta larghezza, stile e colore del bordo
.card { border: 2px solid #3d6b89; }
Lo shorthand border combina larghezza, stile e colore. solid traccia una linea continua, dashed traccia linee tratteggiate e dotted traccia punti. Uno stile none sopprime il bordo previsto anche se sono presenti larghezza e colore. Usa border-bottom o border-block-end quando solo un lato necessita di un bordo. Per ulteriori dettagli, vedi Modello a scatola CSS: contenuto, padding, bordo e margine.
| Proprietà | Effetto sulla dimensione del box | Principali usi |
|---|---|---|
| border | In content-box, viene aggiunto esternamente, e in border-box, è incluso nella dimensione specificata. | bordo dell'elemento |
| outline | Non aumenta lo spazio del layout | Mostra contorni intorno agli elementi focalizzati |
| box-shadow | Non aumenta lo spazio del layout | Ombre e profondità visiva |
Con una larghezza fissa border-box, aumentando lo spessore del bordo si riduce lo spazio interno mantenendo la larghezza esterna. Un bordo o un'ombra decorativa ha un ruolo diverso dal contorno di focus che identifica l'obiettivo della tastiera corrente. Mantieni visibile quell'indicatore. Vedi MDN: border.
Confronta lunghezze e percentuali degli angoli
.round { border-radius: 12px; }
.circle { width: 80px; height: 80px; border-radius: 50%; }
.oval { width: 160px; height: 80px; border-radius: 50%; }
Un valore di lunghezza come 12px specifica il raggio dell'angolo. È possibile dare valori diversi ai quattro angoli, ma confrontali prima con un unico valore. Se applichi il 50% a un box con la stessa larghezza e altezza, sembrerà un cerchio, e se le dimensioni orizzontali e verticali sono diverse, sembrerà un'ellisse. Il raggio orizzontale della percentuale si basa sulla larghezza, e il raggio verticale si basa sull'altezza.
Gli angoli arrotondati del contenitore genitore non ritagliano automaticamente l'immagine figlia. Scegli tra applicare il border-radius direttamente all'immagine o ritagliare l'overflow dal genitore, a seconda del tuo scopo. Se aggiungi 'hidden' al genitore, l'ombra o la visualizzazione del focus del figlio potrebbe essere tagliata al bordo. Il confronto seguente distingue quale box viene ritagliato. Puoi verificare il calcolo del raggio nella descrizione del border-radius di MDN.
Leggere i valori dell'ombra
.shadow { box-shadow: 0 8px 24px 4px rgb(0 0 0 / 16%); }
| valore | significato | Risultati da modificare |
|---|---|---|
| primo 0 | spostamento orizzontale | I numeri positivi si spostano verso destra, i numeri negativi si spostano verso sinistra |
| secondo 8px | movimento verticale | I numeri positivi si spostano verso il basso, i numeri negativi si spostano verso l'alto. |
| terzo 24px | raggio di sfocatura | Avvicinandosi a 0 il bordo dell’ombra è più netto; aumentando il valore diventa più sfumato. |
| quarto 4px | raggio di diffusione | I numeri positivi aumentano la dimensione dell'ombra, i numeri negativi la diminuiscono. |
| rgb(0 0 0 / 16%) | Colore e Opacità | Il grado in cui è distinto dallo sfondo varia. |
Le prime due lunghezze sono obbligatorie e blur e spread possono essere omessi. Il raggio di blur non può essere negativo. Aggiungendo inset si ottiene l'ombra interna, il default è l'ombra esterna. Esiste anche un modo per aggiungere più ombre, ma prima controlla modificando separatamente il movimento e la dimensione di un'ombra.
Un'ombra non riserva spazio nel layout. Non spingerà via una scheda successiva in base alla quantità del suo blur o spread. Ombre grandi possono oscurare contenuti vicini, quindi fornisci spazi effettivi con margini o gap di layout quando necessario. Vedi MDN: box shadow.
Trova l'antenato che ritaglia un'ombra
.frame { padding: 12px; overflow: visible; }
.frame.clip { overflow: hidden; }
.frame .card { box-shadow: 0 18px 20px 8px rgb(0 0 0 / 25%); }
Le ultime due schede hanno genitori separati .frame. Le ombre delle schede figlie sono identiche, ma un genitore permette l'overflow visibile mentre l'altro lo ritaglia. L'ombra si estende oltre i 12px di padding del genitore, quindi la versione con overflow nascosto la taglia al confine del genitore. Ispeziona quell'antenato quando diagnostichi un'ombra ritagliata. Vedi Overflow CSS, testo lungo a capo e puntini di sospensione.
Applicare overflow: hidden alla scheda stessa e far ritagliare la sua ombra esterna da un genitore sono due situazioni diverse. Questo esercizio è una situazione in cui un genitore taglia l'ombra esterna di una scheda figlio. Se l'ombra non è visibile nella pagina effettiva, dovresti controllare non solo il valore della scheda stessa, ma anche l'overflow e il bordo dell'elemento genitore.
Esegui l'esempio e confronta le modifiche
Salva il codice qui sotto come UTF-8 in borders.html. Sono inclusi confronti di bordi, angoli arrotondati, ombre esterne, ombre interne, cerchi ed ellissi, e troncamenti.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Comparing borders, corners, and shadows</title>
<style>
* { box-sizing: border-box; }
body { margin: 24px; color: #333; font: 16px/1.6 sans-serif; background: #f6f8fa; }
.card { width: 100%; max-width: 320px; margin-block: 24px; padding: 20px; background: white; }
.border { border: 2px solid #3d6b89; }
.round { border: 2px solid #3d6b89; border-radius: 12px; }
.shadow { border-radius: 12px; box-shadow: 0 8px 24px 4px rgb(0 0 0 / 16%); }
.inset { box-shadow: inset 0 0 12px 2px rgb(0 0 0 / 20%); }
.shape { width: 80px; height: 80px; margin-block: 16px; border-radius: 50%; background: #6eb898; }
.oval { width: 160px; }
.frame { width: 100%; max-width: 320px; padding: 12px; margin-block: 24px; background: #dce8f1; overflow: visible; }
.frame .card { margin: 0; max-width: none; height: 100px; box-shadow: 0 18px 20px 8px rgb(0 0 0 / 25%); }
.clip { overflow: hidden; }
</style>
</head>
<body>
<h1>Card boundaries and shadows</h1>
<div class="card border">Card with a border only</div>
<div class="card round">Border and rounded corners</div>
<div class="card shadow">Outer shadow</div>
<div class="card inset">Inset shadow</div>
<h2>50% Edges: Circles and Ovals</h2><div class="shape" role="img" aria-label="80×80 circle"></div><div class="shape oval" role="img" aria-label="160×80 ellipse"></div>
<h2>Parent: overflow: visible</h2><div class="frame"><div class="card">Child shadow visible outside the parent</div></div>
<h2>Parent: overflow: hidden</h2><div class="frame clip"><div class="card">Child shadow clipped at the parent boundary</div></div>
</body>
</html>
- Cambia lo spessore del .border da 2px a 8px. Nelle finestre larghe, assicurati che la larghezza esterna sia mantenuta e lo spazio interno sia ridotto, poi riportalo a 2px.
- Cambia la larghezza del .shape da 80px a 160px. Assicurati che il cerchio diventi un'ellisse se mantieni l'altezza a 80px. Ripristina alla larghezza originale.
- Modifica lo spostamento orizzontale del .shadow a 20px e lo spostamento verticale a -8px. Mantieni il blur a 24px e confronta solo la direzione del movimento. Successivamente, cambia il blur a 0, confrontalo con il bordo netto e poi riportalo al valore originale.
- Cambia lo spread da 4px a -4px. Nota se la dimensione dell'ombra diminuisce. Nel secondo .frame cambia hidden in visible, verifica che l’ombra oltre il genitore torni visibile e ripristina hidden.
Se l'ombra è sfocata, controlla l'opacità del colore e il contrasto dello sfondo, e se solo un lato è tagliato, controlla il bordo e l'overflow del genitore. Se il contenuto figlio all'interno dell'angolo sporge, confrontiamo anche il metodo di dare angoli arrotondati al figlio stesso. Scegli effetti che mantengano il contenuto leggibile e i controlli riconoscibili.




