Proprietà logiche

Podcast su CSS - 012: Proprietà logiche

Un pattern molto comune dell'interfaccia utente è un'etichetta di testo con un'icona incorporata che la supporta.

L'icona si trova a sinistra del testo con un piccolo spazio tra le due, fornito da margin-right nell'icona. Tuttavia, c'è un problema, perché funziona solo quando la direzione del testo è da sinistra a destra. Se la direzione del testo viene cambiata da destra a sinistra, ovvero come viene letta da lingue come l'arabo, l'icona si posiziona contro il testo.

Come tiene conto di questo aspetto nel CSS? Le proprietà logiche consentono di risolvere queste situazioni. Oltre ad altri vantaggi, offrono un supporto senza costi e automatico per l'internazionalizzazione. Ti aiutano a creare un front-end più resiliente e inclusivo.

Terminologia

Le proprietà fisiche di in alto, a destra, in basso e a sinistra si riferiscono alle dimensioni fisiche dell'area visibile. È una sorta di rosa dei venti su una mappa. Le proprietà logiche, invece, fanno riferimento ai bordi di una casella in relazione al flusso di contenuti. Di conseguenza, possono cambiare anche se la direzione del testo o la modalità di scrittura cambiano. Si tratta di un grande cambiamento rispetto agli stili direzionali e ci offre molta più flessibilità per quanto riguarda lo stile delle interfacce.

Blocca flusso

Il flusso dei blocchi è la direzione in cui sono posizionati i blocchi di contenuti. Ad esempio, se ci sono due paragrafi, il flusso del blocco è quello in cui andrà il secondo paragrafo. In un documento in inglese, il flusso del blocco è dall'alto verso il basso. Immaginala nel contesto di paragrafi di testo che si seguono l'uno all'altro, dall'alto verso il basso.

Tre blocchi, elementi div, con una freccia verso il basso, con l'etichetta "block flow"

Flusso in linea

Il flusso incorporato è il modo in cui il testo scorre in una frase. In un documento in inglese, il flusso incorporato è da sinistra a destra. Se modifichi la lingua del documento della tua pagina web impostandola sull'arabo (<html lang="ar">), il flusso in linea sarebbe da destra a sinistra.

Tre parole, &quot;vende conchiglie&quot;, con una freccia da sinistra a destra, con l&#39;etichetta &quot;flusso in linea&quot;

Il testo scorre nella direzione determinata dalla modalità di scrittura del documento. Puoi modificare la direzione in cui viene disposto il testo con la proprietà writing-mode. Questa opzione può essere applicata all'intero documento o a singoli elementi.

Relativo flusso

Storicamente in CSS, potevamo applicare solo proprietà come il margine rispetto alla direzione dei lati. Ad esempio, margin-top viene applicato alla parte superiore fisica dell'elemento. Con le proprietà logiche, margin-top diventa margin-block-start. Ciò significa che, indipendentemente dalla lingua e dalla direzione del testo, il flusso dei blocchi ha regole sui margini appropriate.

Un diagramma che mostra tutte le diverse dimensioni di una scatola e il punto di inizio e di fine di ogni sezione relativa alle taglie

Taglie

Per evitare che un elemento superi una determinata larghezza o altezza, scrivi una regola come la seguente:

.my-element {
  max-width: 150px;
  max-height: 100px;
}

Gli equivalenti relativi al flusso sono max-inline-size e max-block-size. Puoi anche usare min-block-size e min-inline-size anziché min-height e min-width.

Con le proprietà logiche, la regola di altezza e larghezza massima avrebbe il seguente aspetto:

.my-element {
  max-inline-size: 150px;
  max-block-size: 100px;
}

Inizio e fine

Invece di utilizzare indicazioni come in alto, a destra, in basso e a sinistra, utilizza inizio e fine. Questo ti fornisce block-start, inline-end, block-end e inline-start. che ti consentono di applicare proprietà CSS in grado di rispondere alle modifiche alla modalità di scrittura.

Ad esempio, per allineare il testo a destra puoi utilizzare questo CSS:

p {
  text-align: right;
}

Se il tuo obiettivo non è quello di allinearti al diritto fisico, ma piuttosto all'inizio della direzione di lettura, questo non è utile. Con i valori logici, ci sono valori start e end più utili che vengono mappati alla direzione del testo. Ora la regola di allineamento del testo ha il seguente aspetto:

p {
  text-align: end;
}

Spaziatura e posizionamento

Le proprietà logiche di margin, padding e inset rendono più semplici ed efficienti gli elementi di posizionamento e determinano in che modo interagiscono tra loro nelle modalità di scrittura. Le proprietà relative a margine e spaziatura interna sono ancora mappature dirette alle direzioni, ma la differenza principale è che quando una modalità di scrittura cambia, queste cambiano insieme.

.my-element {
  padding-top: 2em;
  padding-bottom: 2em;
  margin-left: 2em;
  position: relative;
  top: 0.2em;
}

In questo modo viene aggiunto uno spazio verticale interno con padding e lo si spinge fuori da sinistra con margin. Anche la proprietà top la sposta verso il basso. Con gli equivalenti di proprietà logiche, il risultato sarebbe invece questo:

.my-element {
  padding-block-start: 2em;
  padding-block-end: 2em;
  margin-inline-start: 2em;
  position: relative;
  inset-block-start: 0.2em;
}

Questa azione aggiunge uno spazio incorporato all'interno di padding e lo sposta dall'inizio incorporato con margin. La proprietà inset-block la sposta verso l'interno rispetto all'inizio del blocco.

La proprietà inset-block non è l'unica opzione in forma abbreviata con proprietà logiche. Questa regola può essere ulteriormente ridotta utilizzando versioni abbreviate delle proprietà di margine e spaziatura.

.my-element {
  padding-block: 2em;
  margin-inline: 2em 0;
  position: relative;
  inset-block: 0.2em 0;
}

Bordi

L'aggiunta di border e border-radius può anche essere eseguita con proprietà logiche. Per aggiungere un bordo in basso e a destra, con un raggio a destra, potresti scrivere una regola come questa:

.my-element {
  border-bottom: 1px solid red;
  border-right: 1px solid red;
  border-bottom-right-radius: 1em;
}

In alternativa, potresti utilizzare proprietà logiche come la seguente:

.my-element {
  border-block-end: 1px solid red;
  border-inline-end: 1px solid red;
  border-end-end-radius: 1em;
}

end-end in border-end-end-radius è la fine del blocco e la fine in linea.

Unità

Le proprietà logiche introducono due nuove unità: vi e vb. Un'unità vi corrisponde all'1% delle dimensioni dell'area visibile nella direzione in linea. L'equivalente della proprietà non logica è vw. L'unità vb corrisponde all'1% dell'area visibile nella direzione del blocco. L'equivalente della proprietà non logica è vh.

Queste unità saranno sempre mappate alla direzione di lettura. Ad esempio, se vuoi che un elemento occupi l'80% dello spazio in linea disponibile di un'area visibile, con l'unità vi la dimensione verrà impostata automaticamente dall'alto verso il basso se la modalità di scrittura è verticale.

Utilizzo pragmatico delle proprietà logiche

Le proprietà logiche e le modalità di scrittura non servono solo a fini di internazionalizzazione. Puoi utilizzarli per creare un'interfaccia utente più versatile.

Se un grafico contiene etichette sull'asse X e sull'asse Y, è consigliabile che il testo sull'etichetta Y venga letto verticalmente.

Poiché l'etichetta dell'asse Y nella demo ha un valore writing-mode pari a vertical-rl, puoi utilizzare gli stessi valori margin in entrambe le etichette. Il valore margin-block-start si applica a entrambe le etichette perché l'inizio del blocco si trova a destra per l'asse Y e in alto per l'asse X. I lati del blocco-inizio hanno un bordo rosso, così puoi vederli.

Risoluzione del problema dell'icona

Ora che abbiamo esaminato le proprietà logiche, questa conoscenza può essere applicata al problema di progettazione con cui abbiamo iniziato.

p {
  display: inline-flex;
  align-items: center;
}

p svg {
  width: 1.2em;
  height: 1.2em;
  margin-right: 0.5em;
  flex: none;
}

Il margine è stato applicato a destra dell'elemento icona. Affinché la spaziatura tra l'icona e il testo supporti tutte le direzioni di lettura, è necessario utilizzare la proprietà margin-inline-end.

p {
  display: inline-flex;
  align-items: center;
}

p svg {
  width: 1.2em;
  height: 1.2em;
  margin-inline-end: 0.5em;
  flex: none;
}

Indipendentemente dalla direzione di lettura, l'icona si posizionerà e si collocherà in modo appropriato.

Verifica la tua comprensione

Verifica le tue conoscenze delle proprietà logiche

Mentre scrivi con la mano, il polso si muove lungo quale asse logico?

inline
Le parole scorrono in linea, così come la tua mano deve viaggiare durante la scrittura.
block
I contenuti scorrono come blocchi e il tuo polso si muove lungo questo asse quando termina un tipo di contenuto e ne inizia un altro.

Seleziona tutte le opzioni che possono trarre vantaggio dalle proprietà logiche

colori
Il colore non cambia quando cambia la modalità di scrittura di un documento.
alignment
Esempi: flex-start, block-end e inline-start
ombre
Le ombre non cambiano quando cambia la modalità di scrittura di un documento.
lati della scatola
Esempi: block-start e inline.
sizes
Esempi: inline-size e max-block-size.
angoli della scatola
Esempi: border-end-end-radius.

Quale lato logico di una parola viene sottolineato?

inizio in linea
Verrà applicata una sottolineatura a sinistra di una parola in inglese.
fine incorporata
Verrà applicata una sottolineatura a destra di una parola in inglese.
blocca inizio
Verrà applicata una sottolineatura sopra una parola in inglese.
fine blocco
È un piacere che il CSS si occupi di questo posizionamento per te.