Come stilizzare gli elementi HTML con bordi, ombre e contorni in CSS

L’autore ha selezionato il Fondo per la Diversità nel Settore Tecnologico per ricevere una donazione come parte del programma Scrivi per Donazioni.

Introduzione

Lavorare con ombre, bordi e contorni è un componente chiave dello sviluppo web e può fornire una definizione visiva intorno agli elementi HTML e agli elementi di testo. L’aspetto dei bordi e delle ombre può essere manipolato tramite cinque proprietà principali del CSS: border, border-radius, box-shadow, text-shadow e outline. Le ombre forniscono profondità e aiutano gli elementi a risaltare, mentre le proprietà border possono svolgere molte funzioni visive diverse, dalla creazione di un divisore lineare tra i contenuti alla definizione dello spazio di una griglia. La proprietà border-radius crea angoli arrotondati su scatole e può persino creare una forma circolare. Infine, outline è una proprietà spesso trascurata che fornisce gran parte della stessa funzionalità della proprietà border senza interrompere il flusso dei contenuti.

In questo tutorial, lavorerai con queste proprietà per creare un avviso di legalità per una società di turismo spaziale fittizia. Durante la dimostrazione, creerai contenitori visivamente ricchi utilizzando proprietà basate sui bordi. Inoltre, terrai conto delle sfumature riguardanti valori più complessi, come ombre multiple e come diversi browser possono implementare determinate proprietà in modo diverso.

Prerequisiti

Configurazione della Base HTML e CSS

In questa sezione, configurerai la base HTML per tutti gli stili visivi che scriverai durante il tutorial. Creerai anche il tuo file styles.css e aggiungerai stili che impostano il layout del contenuto.

Inizia aprendo index.html nel tuo editor di testo. Quindi, aggiungi il seguente HTML al file:

index.html
<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Travel Disclosure - Destination: Moon</title>
    <link href="styles.css" rel="stylesheet" />
  </head>
  <body>
  </body>
</html>

Ci sono molte impostazioni di pagina definite all’interno dell’elemento <head>. Il primo elemento <meta> definisce il set di caratteri da utilizzare per il testo. In questo modo la maggior parte dei caratteri speciali, come gli accenti, verranno visualizzati senza codici HTML speciali. Il secondo elemento <meta> indica ai browser, e in particolare ai browser mobili, come trattare la larghezza del contenuto; altrimenti, il browser simulerà una larghezza desktop di 960px. L’elemento <title> fornisce al browser il titolo della pagina. L’elemento <link> carica il file CSS in cui scriverai i tuoi stili durante questo tutorial.

La pagina avrà anche bisogno di contenuto da stilizzare. Per il testo legale, userai contenuti di esempio da Legal Ipsum come riempimento, destinato solo a scopi di stile.

Torna a index.html nel tuo editor di testo e aggiungi l’HTML evidenziato dal seguente blocco di codice:

index.html
<!doctype html>
<html>
  ...
  <body>
    <section class="disclosure-alert">
      <header class="disclosure-header">
        <h2  class="disclosure-title"><em>Destination: Moon</em> Travel Disclosure</h2>
      </header>
      <div class="disclosure-content">
        <p>Although space travel is routine practice, there are many unknown possibilities that any traveller must be aware of before traveling with <em>Destination: Moon</em>. Agreeing to this disclosure of knowns is required prior to purchase of tickets with <em>Destination: Moon</em>. PLEASE, READ AND AGREE TO THE FOLLOWING DISCLOSURE OF TRAVEL UNKNOWNS BEFORE PROCEEDING TO PURCHASE.</p>
        <div class="legal-contents">
          <p>Effect of Termination. Upon termination, You agree not to use it under the terms of Sections 4(a) through 4(e) for that Covered Code, or any third party. Description of Modifications.<p>
          <p>You must make sure that you know you can do these things. To make sure the requirements of this Agreement. REQUIREMENTS A Contributor may participate in any way. Notwithstanding the foregoing, if applicable law or agreed to in writing, the Copyright Holder, but only to the terms applicable to Covered Code. Inability to Comply Due to Statute or Regulation.</p>
          <p>If it is impossible for You to the Recipient retains any such Additional Terms. Versions of This License. If you are re-using, b) a hyperlink (where possible) or URL to the terms of Sections 4(a) through 4(e) for that Work shall terminate if it fails to comply with the exception of content that is granting the License. License Terms 1.</p>
          <p>Grant of Patent Infringement. If you have knowledge of patent infringement litigation, then the only applicable Base Interpreter is a "commercial item" as defined in 48 C.F.R. Consistent with 48 C.F.R.</p>
          <p>U.S. Government End Users acquire Covered Code (Original Code and/or as part of a Larger Work; and b) allow the Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Distributor in writing of such Contributor, if any, to grant more extensive warranty protection to some or all of these conditions: (a) You must make it clear that any Modifications made by such Respondent, or (ii) withdraw Your litigation claim is resolved (such as Wikimedia-internal copying), it is Recipient's responsibility to secure any other exploitation. Program, and in any of the provisions set forth in Section 4(b), you shall terminate if it fails to comply with.</p>
          <p>Please note that these licenses do allow commercial uses of your company or organization, to others outside of this License Agreement), provided that You meet the following terms which differ from this License) and (b) You must duplicate the notice in Exhibit A in each changed file stating how and when you changed the files and the definitions are repeated for your past or future use of the Original Code; or 3) for infringements caused by: i) third party against the drafter will not be used as a handle): 1895.22/1011. This Agreement shall be held by the terms of this agreement. If any provision of this license which gives you legal permission to modify NetHack, or otherwise using this software in source and binary forms, with or without modification in printed materials or in related documentation, stating that you provide a service, including but not limited to the terms under which you distribute, wherever you describe the origin or ownership of such termination, the Recipient a non-exclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 1.6b1 or any part of Derivative Works. If You initiate litigation by asserting a patent infringement against You in that instance.</p>
          <p>Effect of New York and the like. While this license document the following disclaimer in the Work contain all the conditions listed in Clause 6 above, concerning changes from the Work. If you created a Modification, you may at your option offer warranty protection to some or all of the Licensed Program as a product of your Modifications available to others outside of this License.</p>
          <p>Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted to Licensor for inclusion in the documentation and/or other rights consistent with this program; if not, write to the modified files to carry prominent notices stating that You distribute, all copyright, patent, trademark, and attribution notices from the Public Domain or from the Original Code; 2) separate from the Public Domain or from the Work, you may distribute a Compiled Work on their system exactly as it is being maintained, then ask the Current Maintainer to update their communication data within one month. If the program is free software; you can change the License will not have to defend and indemnify every other Contributor to control, and cooperate with the Source Code version of the Licensed Program, or any Contributor.</p>
        </div>
        <div class="button-group">
          <a href="#" class="button button-primary">
            Agree
          </a>
          <a href="#" class="button button-secondary">
            Disagree
          </a>
        </div>
      </div>
    </section>
  </body>
</html>

Salva le tue modifiche su index.html e poi apri il tuo browser web. Seleziona la voce di menu File e poi seleziona l’opzione Apri e carica il tuo file index.html nel browser. L’immagine seguente mostra come questo HTML verrà visualizzato nel browser:

Crea un nuovo file chiamato styles.css nella stessa directory di index.html, quindi aprilo nel tuo editor di testo. Questo file conterrà tutti gli stili utilizzati durante il tutorial. Il primo set di stili applicherà un’estetica generale da cui partirai. Applica il CSS dal seguente blocco di codice al tuo file styles.css:

styles.css
html, body {
  height: 100%;
}

body {
  display: flex;
  margin: 0;
  font: 100% / 1.5 sans-serif;
  background: url("images/moon-bg.jpg") no-repeat fixed center / cover black;
}
.disclosure-alert {
  background-color: hsl(0, 0%, 95%);
  width: 85%;
  max-width: 48rem;
  margin: auto;
  color: hsl(0, 0%, 20%);
}
.disclosure-header {
  background: linear-gradient(hsl(300, 50%, 20%), hsl(300, 50%, 10%));
  padding: 2rem 0.5rem;
  text-align: center;
  color: hsl(300, 50%, 95%);
}
.disclosure-title {
  margin: 0;
  font-size: 2rem;
  line-height: 1.25;
}
.disclosure-content {
  margin: 1.5rem;
}
.legal-contents {
  margin-top: 1.5rem;
  background-color: white;
  padding: 0.75rem;
  font-family: "Times New Roman", serif;
}
.button-group {
  margin-top: 1.5rem;
  display: flex;
  justify-content: center;
}
.button {
  display: inline-block;
  text-align: center;
  padding: 0.5rem 1rem;
  background: black;
  text-decoration: none;
  color: white;
  width: 50%;
  max-width: 8rem;
}
.button + .button {
  margin-left: 1.5rem;
}
.button-primary {
  background: linear-gradient(to bottom, hsl(200, 100%, 30%), hsl(200, 100%, 20%));
}
.button-primary:hover {
  background: linear-gradient(to bottom, hsl(200, 100%, 25%), hsl(200, 100%, 15%));
}
.button-secondary {
  background: linear-gradient(to bottom, hsl(200, 10%, 30%), hsl(200, 10%, 20%));
}
.button-secondary:hover {
  background: linear-gradient(to bottom, hsl(200, 10%, 25%), hsl(200, 10%, 15%));
}

Lo stile in questo file imposta la disposizione iniziale della pagina, con un avviso legale centrato, pulsanti con spaziatura e resi con un gradiente lineare, e un’immagine della luna utilizzata come sfondo. Prima di continuare, assicurati di salvare il file styles.css.

Per visualizzare l’immagine collegata nella proprietà background del set di regole body, avrai bisogno dell’immagine di sfondo della Luna. Innanzitutto, crea una directory images nella stessa cartella del tuo file index.html:

  1. mkdir images

Utilizza il tuo browser per scaricare questo file nella directory images appena creata, oppure utilizza il seguente comando curl per scaricarlo tramite la riga di comando:

  1. curl -sL https://assets.digitalocean.com/articles/68102/moon-bg.jpg -o images/moon-bg.jpg

Successivamente, torna e aggiorna il tuo browser. Il browser ora renderà e applicherà gli stili al contenuto della pagina. L’immagine seguente mostra come viene visualizzata l’intera pagina:

La lunghezza del contenuto rende la pagina molto lunga. Poiché si tratta di copia legale, il contenuto di .legal-contents può diventare uno spazio scorrevole. Questo viene fatto attraverso una combinazione delle proprietà height, max-height e overflow.

Per creare un’area scorrevole, apri styles.css nel tuo editor di testo. Successivamente, regola l’altezza del contenuto legale con il seguente codice:

styles.css
...
.legal-contents {
  height: 50vh;
  max-height: 20rem;
  overflow: auto;
  margin-top: 1.5rem;
  background-color: white;
  padding: 0.75rem;
  font-family: "Times New Roman", serif;
}
...

In questo codice, hai creato una proprietà height nel blocco selettore .legal-contents, quindi hai impostato il suo valore su 50vh, che significa il 50% dell’altezza della finestra di visualizzazione. Hai anche creato una proprietà max-height con il valore impostato su 20rem. Infine, hai aggiunto una proprietà overflow con un valore di auto, che crea la barra di scorrimento se il contenuto supera il contenitore.

Salva queste aggiunte nel tuo file styles.css, poi torna al browser e aggiorna index.html. L’altezza totale della pagina e del contenitore principale si è ridotta. Ora, il testo Legal Ipsum può essere fatto scorrere all’interno del suo contenitore designato, come illustrato nell’animazione seguente:

In questa sezione, hai impostato l’HTML principale che utilizzerai per il resto del tutorial. Hai anche creato uno spazio scrollabile con la proprietà overflow. Nella prossima sezione, lavorerai con la proprietà border per applicare un bordo a questi contenitori.

Utilizzo della proprietà border

La proprietà border è uno dei modi originali per applicare stili ai bordi degli elementi. Applica una linea di qualsiasi colore al perimetro esterno di un contenitore. Il valore della proprietà consiste in tre componenti: lo spessore, lo stile e il colore. La proprietà border applica questi valori a tutti e quattro i lati di un elemento. È possibile specificare i lati individuali con le varianti di direzione di border, come ad esempio la proprietà border-top, che si applicherà solo alla parte superiore di un elemento.

Per iniziare a lavorare con la proprietà border, aprire styles.css nel proprio editor di testo e andare al selettore di classe .disclosure-alert. All’interno del blocco selettore, aggiungere una proprietà border con un valore impostato su 1px solid hsl(0, 0%, 0%), come evidenziato nel seguente blocco di codice:

styles.css
...
.disclosure-alert {
  background-color: hsl(0, 0%, 95%);
  width: 85%;
  max-width: 48rem;
  margin: auto;
  color: hsl(0, 0%, 20%);
  border: 1px solid hsl(0, 0%, 0%);
}
...

Questa proprietà border è una proprietà shorthand, il cui valore è una combinazione di altri valori. In questo caso, lo spessore di 1px rappresenta il valore della proprietà border-width. Questo valore può essere qualsiasi valore numerico con un’unità insieme a pochi valori nominati: thin, medium e thick. Successivamente, solid è il valore di border-style, che definisce come apparirà la linea intorno all’elemento, in questo caso come una linea continua e solida. Altri valori per border-style includono dotted, dashed, double e none. Il valore finale definisce la proprietà border-color, che può essere qualsiasi valore di colore valido.

Salva le tue modifiche a styles.css, quindi apri index.html in un browser web. Il contenitore del contenuto principale avrà ora un sottile bordo nero intorno ad esso, che è più evidente in quanto si sovrappone all’immagine di sfondo della luna. L’immagine seguente mostra come appare il bordo nell’area del contenuto principale:

Successivamente, puoi utilizzare la proprietà bordo per creare un senso di profondità applicando luci e ombre a un elemento. Puoi ottenere questo risultato utilizzando un bordo direzionale su un lato più chiaro del colore dello sfondo, quindi un colore più scuro sul lato adiacente.

Torna a styles.css nel tuo editor di testo, quindi vai al blocco selettore della classe .disclosure-header. Il linear-gradient() sulla proprietà sfondo definisce un gradiente viola scuro che passa a una tonalità leggermente più scura. Per creare più profondità rispetto al solo gradiente, regola il bordo con il seguente codice:

styles.css
...
.disclosure-header {
  background: linear-gradient(hsl(300, 50%, 20%), hsl(300, 50%, 10%));
  padding: 2rem 0.5rem;
  text-align: center;
  color: hsl(300, 50%, 95%);
  border-top: 1px solid hsl(300, 50%, 35%);
  border-bottom: 1px solid hsl(300, 50%, 5%);
}
...

Hai aggiunto una proprietà bordo superiore con un valore di 1px solido hsl(300, 50%, 35%), che è leggermente più chiaro rispetto al valore iniziale del gradiente. Successivamente, hai creato una proprietà bordo inferiore impostata su un valore di 1px solido hsl(300, 50%, 5%), che è leggermente più scuro della fine del gradiente.

Salva le tue modifiche a styles.css, quindi torna al browser e aggiorna index.html. L’area dell’intestazione viola ora presenta un leggero punto di luce viola lungo la parte superiore dell’intestazione e una leggera ombra lungo il fondo. L’immagine seguente mostra come apparirà nel browser:

Poiché border è una proprietà abbreviata, è possibile aggiungere ulteriori proprietà estese. Un border può essere applicato per definire la larghezza e lo stile delle due classi di pulsanti, mentre un border-color può essere applicato sulle singole classi.

Per iniziare a lavorare con border-color, apri styles.css nel tuo editor di testo. Nel blocco selettore per .button, aggiungi una proprietà border con un valore di 1px solid, quindi aggiungi una proprietà border-color per .button-primary e .button-secondary:

styles.css
...
.button {
  ...
  border: 1px solid;
}
...
.button-primary {
  background: linear-gradient(to bottom, hsl(200, 100%, 30%), hsl(200, 100%, 20%));
  border-color: hsl(200, 100%, 15%);
}
.button-primary:hover {
  background: linear-gradient(to bottom, hsl(200, 100%, 25%), hsl(200, 100%, 15%));
  border-color: hsl(200, 100%, 10%);
}
.button-secondary {
  background: linear-gradient(to bottom, hsl(200, 10%, 30%), hsl(200, 10%, 20%));
  border-color: hsl(200, 10%, 15%);
}
.button-secondary:hover {
  background: linear-gradient(to bottom, hsl(200, 10%, 25%), hsl(200, 10%, 15%));
  border-color: hsl(200, 10%, 10%);
}

Ciò definisce un bordo di stile solid con larghezza 1px per entrambi i pulsanti. Quindi, hai aggiunto una proprietà border-color per personalizzare i colori per .button-primary, .button-secondary e i relativi selettori di stato :hover.

Salva queste modifiche in styles.css, quindi aggiorna la pagina nel tuo browser web. Come mostrato nell’immagine seguente, i pulsanti ora hanno un po’ più di definizione fornita da un bordo di colore più scuro abbinato:

Infine, ciascuna direzione del border è anch’essa una proprietà abbreviata. Ciò significa che -width, -style e -color possono essere applicati singolarmente a una proprietà di direzione. Ad esempio, la proprietà estesa border-right-color applicherà solo un colore al bordo destro.

Per lavorare con queste proprietà direzionali scritte a mano border, torna a styles.css nel tuo editor di testo. Vai al blocco selettore .legal-contents e imposta la larghezza e lo stile per tutti e quattro i lati del bordo, quindi personalizza i colori di ogni lato:

styles.css
...
.legal-contents {
  height: 50vh;
  max-height: 20rem;
  margin-top: 1.5rem;
  overflow: auto;
  background-color: white;
  border: 1px solid;
  border-top-color: hsl(0, 0%, 65%);
  border-bottom-color: hsl(0, 0%, 100%);
  border-right-color: hsl(0, 0%, 80%);
  border-left-color: hsl(0, 0%, 80%);
  padding: 0.75rem;
  font-family: "Times New Roman", serif;
}
...

In questo codice, hai aggiunto border: 1px solid alla fine del file. Dopo di ciò, hai creato ulteriormente le proprietà border-top-color, border-bottom-color, border-right-color e border-left-color. Per i valori, hai utilizzato diversi valori hsl() per i grigi.

Salva le tue modifiche su styles.css, quindi ricarica la pagina nel browser. Il contenitore del contenuto scorrevole ora ha un bordo grigio scuro lungo la parte superiore, leggermente più chiaro sui lati e un bordo bianco nella parte inferiore. Questo per dare la percezione che il contenuto sia inserito dietro lo sfondo grigio chiaro, causando un effetto in cui l’evidenziazione è sul bordo inferiore, come mostrato nell’immagine seguente:

In questa sezione, hai utilizzato la proprietà border e le sue variazioni scritte a mano. Hai creato diversi bordi, che sono stati applicati ai lati diversi se necessario. Nella prossima sezione, lavorerai con la proprietà border-radius, che consente di arrotondare gli angoli dei contenitori.

Applicazione di un border-radius

Gli angoli arrotondati sono stati un’estetica di design sul web molto prima che la proprietà border-radius fosse disponibile per realizzare il compito. Questa proprietà può accettare qualsiasi unità numerica o valore percentuale, ed è una proprietà abbreviata come le proprietà margin o padding. Ciò significa che ogni angolo può essere regolato individualmente secondo necessità.

Per iniziare a lavorare con la proprietà border-radius, apri styles.css nel tuo editor di testo. Vai al blocco selettore .disclosure-alert e alla proprietà border-radius. Quindi, imposta il valore su 1.5rem, che applicherà quel valore a tutti e quattro gli angoli della proprietà. Il CSS evidenziato nel seguente blocco di codice mostra come è scritto questo:

styles.css
...
.disclosure-alert {
  ...
  border: 1px solid hsl(0, 0%, 0%);
  border-radius: 1.5rem;
}
...

Salva questa aggiunta in styles.css quindi apri o aggiorna index.html in un browser web. Solo i due angoli inferiori sembreranno essere arrotondati, mentre i due angoli superiori rimarranno spigoli appuntiti. L’immagine seguente illustra come viene renderizzato questo nel browser:

Il motivo per cui sono visibili solo due angoli arrotondati è dovuto a come gli elementi discendenti interagiscono tra loro sul web. Il browser tende a mantenere visibile il contenuto. Il .disclosure-alert ha effettivamente quattro angoli arrotondati, ma poiché il .disclosure-header è all’interno dell’elemento e non ha angoli arrotondati, sovrappone gli angoli arrotondati. Una soluzione rapida è aggiungere overflow: hidden al .disclosure-alert, facendo in modo che il contenitore ritagli eventuali contenitori e contenuti discendenti. Tuttavia, questo approccio può rendere illeggibile o invisibile il contenuto necessario. Una pratica migliore è applicare un border-radius alla classe .disclosure-header per adattare la curva dell’angolo dell’antenato.

Per regolare gli angoli sovrapposti, torna a styles.css nel tuo editor di testo. Vai al blocco selettore .disclosure-header e aggiungi la proprietà border-radius. Poiché solo i primi due angoli hanno bisogno di essere regolati, il valore sarà 1.5rem 1.5rem 0 0:

styles.css
...
.disclosure-header {
  ...
  border-top: 1px solid hsl(300, 50%, 35%);
  border-bottom: 1px solid hsl(300, 50%, 5%);
  border-radius: 1.5rem 1.5rem 0 0;
}
...

Il formato esteso di questo valore applicherà una curva di 1.5rem agli angoli in alto a sinistra e in alto a destra.

Salva le tue modifiche a styles.css e aggiorna index.html nel browser. L’intestazione viola ora ha un angolo arrotondato e non copre il contenitore principale. È però emerso un nuovo problema, poiché un sottile bordo bianco dal contenitore genitore è visibile dietro l’intestazione viola, come mostrato nell’immagine ingrandita seguente:

Gli angoli sia per .disclosure-alert che per .disclosure-header hanno la stessa dimensione di 1,5rem, ma le loro larghezze hanno una differenza di dimensione. Questa differenza di dimensione è causata dal border sul lato sinistro e destro dell’elemento .disclosure-alert. Poiché la larghezza del border è di 1px su entrambi i lati, la differenza di dimensione è di 2px o 0,125rem. Per far coincidere le curve, il border-radius per .disclosure-header deve essere 0,125rem più piccolo rispetto a quanto è attualmente. Cambia i valori di border-radius da 1,5rem a 1,375rem, come evidenziato nel seguente blocco di codice:

styles.css
...
.disclosure-header {
  background: linear-gradient(hsl(300, 50%, 20%), hsl(300, 50%, 10%));
  padding: 2rem 0.5rem;
  text-align: center;
  color: hsl(300, 50%, 95%);
  border-top: 1px solid hsl(300, 50%, 35%);
  border-bottom: 1px solid hsl(300, 50%, 5%);
  border-radius: 1.375rem 1.375rem 0 0;
}
...

Salva questa modifica in styles.css e quindi aggiorna la pagina nel browser web. Il sottile strato di bianco è ora scomparso e le curve dei due elementi si incontrano nel punto appropriato. La seguente schermata ingrandita mostra come queste curve si allineano:

Infine, applicherai un angolo arrotondato ai pulsanti in fondo al contenitore principale. Questi pulsanti avranno una forma a pillola, con un top e un bottom lunghi e piatti e lati completamente arrotondati. Per realizzare questo, il valore di border-radius deve essere un valore basato sull’unità più grande dell’altezza dell’elemento.

Per creare un pulsante a forma di pillola, apri styles.css nel tuo editor di testo. Nel blocco selettore .button, aggiungi la proprietà border-radius e impostane il valore su 2rem. Questo può essere un numero arbitrario purché sia maggiore dell’altezza calcolata, la combinazione di font-size, line-height, padding e border-width che possono influenzare l’altezza complessiva di un elemento. Il CSS evidenziato nel seguente blocco di codice mostra dove aggiungere questa proprietà:

styles.css
...
.button {
  ...
  border: 1px solid;
  border-radius: 2rem;
}
...

Ci sono due cose da notare riguardo a questo approccio. La prima è che non viene impostato un valore di height su questo elemento. Dovrebbe essere evitato di impostare un valore di height, poiché il contenuto può e sarà posizionato al di fuori del contenitore. Evitando di impostare un’altezza definita, il pulsante può crescere per adattarsi al contenuto totale. La seconda è che questo non funzionerà correttamente con un valore basato su percentuale. I valori basati su percentuale su una proprietà border-radius curvano una percentuale dell’altezza e della larghezza, causando una forma ovale anziché un angolo arrotondato.

Salva le tue modifiche in styles.css, quindi torna al browser e aggiorna index.html. La pagina renderizzerà ora due pulsanti oblungi a forma di pillola, come mostrato nell’immagine seguente:

In questa sezione, hai utilizzato la proprietà border-radius per applicare angoli arrotondati a più elementi, scoprendo che un border-radius non impedisce agli elementi discendenti di uscire dallo spazio curvo. Hai anche regolato il valore di un border-radius per corrispondere alla larghezza di un elemento quando più elementi arrotondati sono sovrapposti l’uno all’altro. Nella prossima sezione, utilizzerai la proprietà text-shadow per applicare ombre a contenuti di testo.

Utilizzo della proprietà text-shadow

Applicare ombre al testo ha molti usi nello sviluppo web quotidiano. Le ombre possono creare profondità, un effetto di bagliore o aiutare il testo a risaltare in luoghi dove potrebbe passare inosservato. In questa sezione, applicherai text-shadow a più elementi per creare vari effetti visivi.

La proprietà text-shadow consiste in fino a quattro valori: spostamento sull’asse x, spostamento sull’asse y, raggio di sfocatura e colore. Ad esempio, i valori potrebbero essere così: 2px 4px 10px rosso. Di questi quattro valori, solo i valori di spostamento sono richiesti. Il colore dell’ombra per impostazione predefinita è il colore del testo.

Per iniziare a lavorare con text-shadow, inizierai creando un effetto di bagliore sull’intestazione. Apri styles.css nel tuo editor di testo e vai al selettore di classe .disclosure-header. All’interno del blocco del selettore, aggiungi la seguente proprietà text-shadow:

styles.css
...
.disclosure-header {
  ...
  border-radius: 1.375rem 1.375rem 0 0;
  text-shadow: 0 0 0.375rem hsl(300, 50%, 50%);
}
...

A glow effect means the color will emanate from every edge of the text, so the x- and y-axis offset values here are set to 0. You set the blur for the glow to 0.375rem (equivalent to 6px) to give a subtle halo of color to the text. Lastly, the color value was set to a bit darker than the color property: hsl(300, 50%, 50%).

Salva questa aggiunta nel tuo file styles.css. Successivamente, apri index.html in un browser web. Il testo dell’intestazione in grassetto sullo sfondo sfumato viola ora ha un alone di un viola medio intorno ad esso. L’immagine seguente illustra come questo effetto viene reso nel browser:

Successivamente, è possibile posizionare ombre multiple sugli elementi di testo, consentendo la creazione di un effetto in rilievo sul testo. Questo effetto viene realizzato posizionando un’ombra di colore più chiaro sotto l’oggetto e un’ombra di colore più scuro sopra.

Per creare un effetto in rilievo, torna a styles.css nel tuo editor di testo. L’effetto verrà aggiunto ai pulsanti in fondo al contenitore. Per i selettori .button-primary, .button-primary:hover, .button-secondary e .button-secondary:hover, aggiungi una proprietà text-shadow. Verifica il CSS evidenziato nel seguente blocco di codice per i valori:

styles.css
...
.button-primary {
  border: 1px solid hsl(200, 100%, 5%);
  background: linear-gradient(to bottom, hsl(200, 100%, 30%), hsl(200, 100%, 20%));
  text-shadow: 0 1px hsl(200, 100%, 50%),
               0 -1px hsl(200, 100%, 5%);
}
.button-primary:hover {
  border: 1px solid hsl(200, 100%, 0%);
  background: linear-gradient(to bottom, hsl(200, 100%, 25%), hsl(200, 100%, 15%));
  text-shadow: 0 1px hsl(200, 100%, 45%),
               0 -1px hsl(200, 100%, 0%);
}
.button-secondary {
  border: 1px solid hsl(200, 10%, 5%);
  background: linear-gradient(to bottom, hsl(200, 10%, 30%), hsl(200, 10%, 20%));
  text-shadow: 0 1px hsl(200, 10%, 50%),
               0 -1px hsl(200, 10%, 5%);
}
.button-secondary:hover {
  border: 1px solid hsl(200, 10%, 0%);
  background: linear-gradient(to bottom, hsl(200, 10%, 25%), hsl(200, 10%, 15%));
  text-shadow: 0 1px hsl(200, 10%, 45%),
               0 -1px hsl(200, 10%, 0%);
}

La prima ombra è un chiaro evidenziatore inferiore in rilievo. Questo viene fatto con l’offset 0 1px, quindi la versione più chiara delle tonalità dello sfondo sfumato. Successivamente, hai creato l’ombra sopra il testo con un offset 0 -1px, che solleva l’ombra di 1px e utilizza una variazione più scura dei colori dello sfondo.

Salva queste modifiche in styles.css, quindi aggiorna la pagina nel tuo browser web. Il testo all’interno dei pulsanti ora ha un leggero evidenziatore sotto il testo e una leggera ombra sopra il testo. La combinazione di questi valori text-shadow crea l’effetto in rilievo come mostrato nell’immagine seguente:

In questa sezione, hai applicato la proprietà text-shadow a alcuni elementi. Hai creato un effetto di bagliore sull’intestazione e un effetto in rilievo con più ombre sui pulsanti. Nella prossima sezione, applicherai ombre agli elementi HTML con la proprietà box-shadow.

Aggiunta di box-shadow agli Elementi

Proprio come la proprietà text-shadow permette al contenuto testuale di avere ombre, la proprietà box-shadow permette anche agli elementi e ai contenitori di avere ombre. La box-shadow ha due caratteristiche aggiuntive che esplorerai in questa sezione, tra cui la capacità di controllare la diffusione dello sfocato e impostare l’ombra all’interno dell’elemento.

Per iniziare a lavorare con la proprietà box-shadow, apri styles.css nel tuo editor di testo. Nel blocco selettore .disclosure-alert, aggiungi la proprietà box-shadow. Proprio come per text-shadow, i valori di offset sull’asse x e y sono richiesti, e se un colore non viene fornito, viene utilizzato il valore della proprietà color. Per questa prima box-shadow, imposta gli offset su 0, lo sfocato su 0.5rem, e il colore su un buio hsl(300, 40%, 5%), come evidenziato nel seguente blocco di codice:

styles.css
...
.disclosure-alert {
  ...
  border-radius: 1.5rem;
  text-shadow: 0 0 0.375rem hsl(300, 50%, 50%);
  box-shadow: 0 0 0.5rem hsl(300, 40%, 5%);
}
...

Salva le modifiche al styles.css e aggiorna la pagina nel tuo browser web. Ora c’è un’ombra quasi nera che si espande dal contenitore. Nota, inoltre, che l’ombra rispetta e segue le curve che hai creato con la proprietà border-radius. L’immagine seguente mostra come viene renderizzata nel browser:

Successivamente, torna a styles.css e inizia a creare un effetto più complesso aggiungendo due ulteriori grandi effetti di glow al box-shadow. Aggiungi una virgola tra ogni nuova ombra, impostando ciascuna con uno spostamento sull’asse y di 0.5rem. Quindi imposta ampi sfocature e utilizza variazioni più chiare del blu e del viola dalla tavolozza dei colori, come evidenziato nel blocco di codice seguente:

styles.css
...
.disclosure-alert {
  ...
  box-shadow: 0 0 0.5rem hsl(300, 40%, 5%),
              0 0.5rem 6rem hsl(200, 40%, 30%),
              0 0.5rem 10rem hsl(300, 40%, 30%);
}
...

L’ordine di queste ombre è importante. La prima ombra con il colore quasi nero verrà presentata sopra le nuove ombre, e ogni successiva ombra viene aggiunta dietro alla successiva.

Salva le modifiche al styles.css e aggiorna la pagina nel tuo browser. Come illustrato nell’immagine seguente, la combinazione di più ombre rende un effetto unico:

La funzione di diffusione della sfocatura della proprietà box-shadow può essere utilizzata per creare una sensazione di profondità. Il valore di diffusione accetta valori positivi e negativi. Un valore di diffusione negativo combinato con un forte offset e sfocatura crea un’ombra che sembra distante e lontana dal contenitore di origine.

Per iniziare, torna a styles.css nel tuo editor di testo. Tra la piccola ombra scura e la più grande ombra blu sul selettore .disclosure-alert, aggiungi il seguente CSS evidenziato dal blocco di codice:

styles.css
...
.disclosure-alert {
  ...
  box-shadow: 0 0 0.5rem hsl(300, 40%, 5%),
              0 6rem 4rem -2rem hsl(300, 40%, 5%),
              0 0.5rem 6rem hsl(200, 40%, 30%),
              0 0.5rem 10rem hsl(300, 40%, 30%);
}
...

Questa aggiunta al set di ombre mantiene lo spostamento sull’asse x a 0, ma sposta notevolmente l’asse y a 6rem. Successivamente, lo sfocatura non è così ampia come il bagliore, ma ha una dimensione decente di 4rem. Poi viene il valore di diffusione dello sfocatura, che in questo caso è impostato su -2rem. Il valore predefinito per la diffusione è 0, che è uguale al contenitore. A -2rem la diffusione si condenserà verso l’interno dal contenitore per creare un effetto visivo di profondità.

Salva le modifiche su styles.css, quindi aggiorna index.html nel browser. L’ombra è di un colore viola profondo che crea una sensazione che la scatola del contenuto principale stia galleggiando ben al di sopra della superficie della luna, come reso nell’immagine seguente:

Un altro uso di un box-shadow è quello di creare un leggero effetto di smussatura in rilievo e ombra, come hai fatto in precedenza con la proprietà border nell’intestazione. Il vantaggio nell’usare un box-shadow invece di un border è che non influisce sul modello della scatola, causando spostamenti nel flusso di contenuti. Può anche essere utilizzato in combinazione con un border. Quando si utilizza questo effetto con un border, il valore inset deve essere aggiunto al box-shadow in modo che l’ombra sia all’interno del contenitore.

Per iniziare a utilizzare un valore inset sulla box-shadow, apri styles.css nel tuo editor di testo. Questo effetto verrà aggiunto ai pulsanti, quindi applicherai questi stili a .button-primary, .button-primary:hover, .button-secondary, e .button-secondary:hover. Come per il text-shadow, questo consisterà in una combinazione di offset 0 1px e 0 -1px. La differenza è che la parola inset può essere aggiunta all’inizio o alla fine del valore, come evidenziato nel seguente blocco di codice:

styles.css
...
.button-primary {
  ...
  text-shadow: 0 1px hsl(200, 100%, 50%),
               0 -1px hsl(200, 100%, 5%);
  box-shadow: inset 0 1px hsl(200, 100%, 50%),
              inset 0 -1px hsl(200, 100%, 15%);
}
.button-primary:hover {
  ...
  text-shadow: 0 1px hsl(200, 100%, 45%),
               0 -1px hsl(200, 100%, 0%);
  box-shadow: inset 0 1px hsl(200, 100%, 45%),
              inset 0 -1px hsl(200, 100%, 10%);
}
.button-secondary {
  ...
  text-shadow: 0 1px hsl(200, 10%, 50%),
               0 -1px hsl(200, 10%, 5%);
  box-shadow: inset 0 1px hsl(200, 10%, 50%),
              inset 0 -1px hsl(200, 10%, 15%);
}
.button-secondary:hover {
  ...
  text-shadow: 0 1px hsl(200, 10%, 45%),
               0 -1px hsl(200, 10%, 0%);
  box-shadow: inset 0 1px hsl(200, 10%, 45%),
              inset 0 -1px hsl(200, 10%, 10%);
}

Salva queste modifiche in styles.css e quindi aggiorna index.html nel tuo browser. I pulsanti ora hanno un’evidenziazione e un’ombra, simili al testo. Questo, combinato con lo sfondo a gradiente, crea un effetto semplice ma distinto per i pulsanti. L’immagine seguente mostra come viene renderizzato nel browser:

Infine, puoi anche applicare un valore di diffusione sfocatura a un’ombra inset. La diffusione sposta il punto di inizio dello sfocatura verso l’esterno dal bordo, ma quando si utilizza inset, la diffusione sposta il punto di inizio verso l’interno. Ciò significa che quando viene applicato un valore negativo alla diffusione su un’ombra inset, l’ombra si espande fuori dall’area di visualizzazione dell’elemento. L’espansione verso l’esterno della diffusione può creare un’ombra che sembra un breve gradiente. Questo può creare l’illusione che un elemento abbia degli angoli arrotondati poiché l’ombra viene applicata sotto il contenuto dell’elemento.

Per iniziare a creare questo effetto, apri styles.css nel tuo editor di testo. Naviga fino al selettore di classe .legal-contents e aggiungi una proprietà box-shadow. Questa ombra sarà composta da tre ombre. La prima imposterà un’ombra breve intorno all’interno del contenitore completo, e le due successive forniranno un’ombra leggera allungata nella parte superiore e inferiore dell’elemento. Il CSS evidenziato nel blocco di codice seguente mostra come è configurato questo:

styles.css
...
.legal-contents {
  ...
  font-family: "Times New Roman", serif;
  box-shadow: 0 0 0.25rem hsl(0, 0%, 80%) inset,
              0 4rem 2rem -4rem hsl(0, 0%, 85%) inset,
              0 -4rem 2rem -4rem hsl(0, 0%, 85%) inset;
}
...

Salva le modifiche a styles.css, quindi aggiorna la pagina nel browser. Le ombre ora stanno creando un effetto che fa apparire il testo legale come se fosse impostato come una finestra nel contenitore. Le ombre aiutano anche a migliorare i colori del border che sono stati applicati a questo elemento. L’immagine seguente illustra come viene renderizzato ciò nel browser:

In questa sezione, hai messo in pratica la proprietà box-shadow. Hai anche utilizzato lo sfocatura e lo spread e le funzionalità di inset di box-shadow per consentire più opzioni di stile. Nell’ultima sezione, implementerai la proprietà outline, quindi utilizzerai box-shadow per creare un outline più versatile.

Utilizzo della proprietà outline

L’ultima proprietà che influenza i bordi degli elementi è la proprietà outline. In tutti i browser, lo stato :focus degli elementi viene realizzato utilizzando la proprietà outline. Tuttavia, l’implementazione predefinita dello stile :focus di ciascun browser varia significativamente. La proprietà outline è simile alla proprietà border, tranne per due differenze fondamentali: non ha variazioni di proprietà direzionali e non influisce sul modello di casella. Quest’ultima delle due differenze la rende ideale per gli stili :focus, poiché fornisce un indicatore visivo dell’elemento attivo senza interrompere il flusso del contenuto.

Per osservare il predefinito del browser di uno stato :focus, apri index.html nel tuo browser. Usa il tasto TAB per navigare sulla pagina fino a quando uno dei pulsanti inferiori ha il focus. A seconda del browser che stai utilizzando, potresti o meno vedere gli stili predefiniti :focus. Ad esempio, Firefox mostra un contorno tratteggiato bianco, ma non è percepibile sullo sfondo grigio chiaro. L’immagine seguente mostra da sinistra a destra come appare lo stile di focus predefinito in Firefox, Safari e Chrome:

Per iniziare a personalizzare il tuo stato :focus con la proprietà outline, apri styles.css nel tuo editor di testo. Vai al selettore di classe .button e aggiungi la proprietà outline:

styles.css
...
.button {
  ...
}
.button:focus {
  outline: 0.25rem solid hsl(200, 100%, 50%);
}
...

Come con la proprietà border, il valore per outline include una larghezza, uno stile e un valore di colore. Poiché l’obiettivo di uno stato di focus è attirare l’attenzione su un elemento, la larghezza aumenta a 0.25rem, che equivale a 4px. Successivamente, si imposta lo stile su solid, in modo che lo stato di focus sia più simile a quello di Safari e Chrome. Infine, si imposta il colore su un blu profondo con hsl(200, 100%, 50%).

Salva le tue modifiche su styles.css, quindi torna al browser e aggiorna la pagina. Ancora una volta, il browser determina come viene reso l’outline. L’immagine seguente mostra come appaiono questi stili in Firefox, Safari e Chrome, da sinistra a destra:

Attraverso tutti e tre i browser, la proprietà outline viene visualizzata in modo abbastanza diverso. Firefox si adatta attorno alla forma arrotondata del pulsante. Safari crea un riquadro ad angolo retto, ma tocca i bordi del pulsante. Chrome è simile a Safari, ma aggiunge un po’ di spazio extra tra il pulsante e l’outline.

Per creare uno stile che assomigli a quello di Firefox su tutti i browser è necessario utilizzare box-shadow anziché outline.

Per iniziare a creare uno stato di :focus più personalizzato, torna al tuo file styles.css nel tuo editor di testo. La prima cosa da fare è disabilitare lo stile predefinito dell’outline del browser cambiando il valore su none nel selettore .button:focus, come evidenziato nel seguente blocco di codice:

styles.css
...
.button {
  ...
}
.button:focus {
  outline: none;
}
...

Successivamente, scendi ai selettori button-primary:hover e button-secondary:hover e aggiungi una virgola seguita da una variazione dello stato :focus, come evidenziato nel seguente blocco di codice:

styles.css
...

.button-primary {
  ...
}
.button-primary:hover,
.button-primary:focus {
  ...
}
.button-secondary {
  ...
}
.button-secondary:hover,
.button-secondary:focus {
  ...
}

Infine, crea due nuovi selettori per ogni :focus dei pulsanti, .button-primary:focus e .button-secondary:focus. All’interno dei nuovi blocchi selettori, aggiungi una nuova proprietà box-shadow con le stesse ombre inset da :hover, :focus. Poi, aggiungi un’altra ombra alla serie con offset e sfocatura entrambi impostati su 0. Dopo di ciò, aggiungi una diffusione di 0.25rem, che creerà una linea solida e non sfocata intorno all’elemento. Infine, aggiungi lo stesso colore in entrambi i casi. Il codice CSS evidenziato nel blocco seguente mostra come è scritto questo:

styles.css
...

.button-primary {
  ...
}
.button-primary:hover,
.button-primary:focus {
  ...
}
.button-primary:focus {
  box-shadow: inset 0 1px hsl(200, 100%, 45%),
              inset 0 -1px hsl(200, 100%, 10%),
              0 0 0 0.25rem hsl(200, 100%, 50%);
}
.button-secondary {
  ...
}
.button-secondary:hover,
.button-secondary:focus<^> {
  ...
}
.button-secondary:focus {
  box-shadow: inset 0 1px hsl(200, 10%, 45%),
              inset 0 -1px hsl(200, 10%, 10%),
              0 0 0 0.25rem hsl(200, 100%, 50%);
}

Salva queste modifiche in styles.css e torna al browser per aggiornare index.html. Ora, utilizzando il tasto TAB per navigare attraverso la pagina, indipendentemente dal browser, lo stile :focus sui pulsanti avrà lo stesso aspetto. L’immagine seguente mostra come appare la versione con box-shadow di un contorno nel browser insieme all’intera pagina:

Quest’ultima sezione ti ha introdotto alla proprietà outline e a come ciascun browser la utilizza in modi diversi. Almeno un indicatore :focus è necessario per l’accessibilità, e la proprietà outline svolge il compito. Espandendo su questo, hai anche creato uno stile :focus più avanzato e visivamente coerente creando una box-shadow con un grande valore di diffusione.

Conclusione

Lo stile dei bordi degli elementi consente al design di un sito web di ottenere varietà e attenzione. La proprietà border può aiutare a fornire definizione e separazione tra i contenuti. La proprietà border-radius ammorbidisce l’estetica e aiuta a definire l’atteggiamento del design. Ombre su testo e riquadri portano profondità e aiutano a focalizzare l’attenzione sui contenuti. Infine, la proprietà outline fornisce modi accessibili per attirare l’attenzione sugli elementi con il focus da tastiera. In questo tutorial, hai utilizzato tutte queste proprietà per creare una pagina web visivamente interessante e utilizzabile. Comprendere ciascuna di queste proprietà e come e quando utilizzarle aiuterà a risolvere ogni tipo di problema di interfaccia front-end e a creare nuove esperienze.

Se desideri leggere altri tutorial CSS, prova gli altri tutorial della serie Come Stilizzare HTML con CSS.

Source:
https://www.digitalocean.com/community/tutorials/how-to-style-html-elements-with-borders-shadows-and-outlines-in-css