Comprensione delle proprietà e dei valori logici

Pubblicato: 2022-03-10
Riepilogo rapido ↬ Le proprietà ei valori logici CSS non sono ancora pronti per essere utilizzati, tuttavia conoscerli può aiutarti a comprendere il layout CSS e l'interazione con le modalità di scrittura.

In passato, i CSS si sono legati a dimensioni e direzioni fisiche, mappando fisicamente il posizionamento degli elementi a sinistra, a destra e in alto e in basso. float un elemento a left oa right , utilizziamo le proprietà di offset di posizionamento in top , a left , in bottom ea right . Impostiamo margini, riempimento e bordi come margin-top e padding-left . Queste proprietà e valori fisici hanno senso se si lavora in modalità e direzione di scrittura orizzontali, dall'alto verso il basso, da sinistra a destra.

Hanno meno senso se utilizzi una modalità di scrittura verticale, sia per l'intero layout che per alcuni elementi. In questo articolo, spiegherò come stanno cambiando i CSS per supportare le modalità di scrittura e, così facendo, chiarirò alcune delle cose che potrebbero confonderti su Flexbox e Grid.

Quando ho iniziato a lavorare con CSS Grid e a spiegare la nuova specifica alle persone, ho notato che la proprietà grid-area potrebbe essere utilizzata come scorciatoia di una riga per impostare tutte e quattro le righe. Pertanto, i tre esempi seguenti risulteranno nello stesso posizionamento dell'elemento. Il primo utilizza le proprietà longhand, il secondo specifica le linee di inizio e fine per ciascuna quota e il terzo utilizza grid-area .

 .item { grid-row-start: 1; grid-column-start: 2; grid-row-end: 3; grid-column-end: 4; }
 .item { grid-row: 1 / 3; grid-column: 2 / 4; }
 .item { grid-area: 1 / 2 / 3 / 4; }
Altro dopo il salto! Continua a leggere sotto ↓

L'ordine delle linee quando utilizziamo grid-area è il seguente:

  • griglia-riga-inizio
  • griglia-colonna-inizio
  • fine riga della griglia
  • griglia-colonna-fine

La prima domanda che mi sono posto (e molte persone nel mio pubblico) è stata: "perché questi non seguono l'ordine in alto, a destra, in basso, a sinistra a cui siamo abituati da tutto il resto nei CSS ?" In realtà vanno nell'ordine inverso a quei valori: in alto, a sinistra, in basso, a destra! Il CSS Working Group sta cercando attivamente di rendere le cose difficili?

La risposta è che questi valori si sono allontanati dal presupposto di base che il contenuto sul Web corrisponda alle dimensioni fisiche dello schermo, con la prima parola di una frase in alto a sinistra della casella in cui si trova. L'ordine delle righe nella grid-area ha perfettamente senso se non hai mai incontrato il modo esistente in cui impostiamo questi valori in una scorciatoia. Impostiamo prima le due linee di inizio, poi le due linee di fine.

Ciò significa che se cambiamo la modalità di scrittura del nostro documento in verticale, la posizione di un blocco rimane relativa alla modalità di scrittura del documento, piuttosto che alle proprietà fisiche dello schermo. Puoi provarlo nell'esempio seguente, cambiare il valore della modalità di scrittura per il nostro layout e vedere l'intera griglia ruotare.

Vedi la griglia della penna e le modalità di scrittura di Rachel Andrew (@rachelandrew) su CodePen.

Vedi la griglia della penna e le modalità di scrittura di Rachel Andrew (@rachelandrew) su CodePen.

Conoscere questo fatto sulle modalità di scrittura spiega anche perché CSS Grid e Flexbox si riferiscono a linee di start e end piuttosto che mappare la griglia alle dimensioni fisiche di alto, destra, basso e sinistra come useremmo con il posizionamento assoluto. Nell'esempio precedente, il primo elemento viene posizionato utilizzando grid-area e il posizionamento basato sulla linea.

 grid-area: 1 / 2 / 3 / 4;

Se dovessimo usare la mano lunga questo sarebbe simile a questo:

 grid-row-start: 1; grid-column-start: 2; grid-row-end: 3; grid-column-end: 4;

Impostiamo entrambe le linee di partenza, prima l'asse del blocco, poi l'asse in linea, quindi seguiamo lo stesso schema per le linee finali in ciascuna dimensione. In qualunque modo sia disposta la griglia, le linee di inizio e fine rimangono relative alla griglia e alla modalità di scrittura del documento.

Blocco e dimensioni in linea

Ho già accennato a qualcosa che è fondamentale per comprendere il nuovo layout, il concetto delle dimensioni Block e Inline. Questi termini continueranno a venire fuori mentre lavori con il nuovo CSS. Le due dimensioni sono ragionevolmente facili da capire nel contesto di Grid Layout poiché lavoriamo sempre con un blocco e un asse in linea quando lavoriamo in Grid Layout, quindi userò una demo Grid per spiegare.

La dimensione Blocco corrisponde all'ordine in cui i blocchi sono disposti nella pagina. Se pensi a un paragrafo di testo in inglese. Ogni paragrafo è disposto uno sotto l'altro, la direzione in cui sono disposti è la dimensione del blocco, quindi in Grid Layout, questo è l'asse del blocco.

In CSS Grid Layout, Block Axis viene anche chiamato Row Axis, motivo per cui le proprietà Block Axis sono grid-row-start e grid-row-end .

Una griglia con una modalità di scrittura orizzontale, l'asse del blocco che corre dall'alto verso il basso
L'asse del blocco o della riga

L'asse in linea, quindi, corre attraverso l'asse del blocco, nella direzione in cui le parole si dispongono in una frase. In inglese, quell'asse va da sinistra a destra. In Grid Layout, l'asse in linea è l'asse della colonna con le proprietà grid-column-start e grid-column-end .

Una griglia con una modalità di scrittura orizzontale, l'asse in linea che scorre verticalmente
L'asse in linea o colonna

Se cambiamo la modalità di scrittura del nostro esempio in vertical-lr la modalità di scrittura è ora verticale, il che significa che l'asse del blocco corre verticalmente e l'asse in linea lungo le linee (dall'alto in basso).

Una griglia che mostra come il blocco e gli assi in linea cambiano quando si è in modalità di scrittura verticale
Gli assi in una modalità di scrittura verticale

Quindi, se parliamo della dimensione Blocco, stiamo descrivendo la direzione in cui i paragrafi di testo verrebbero disposti nel normale flusso del documento, essendo la dimensione Inline la direzione in cui scorre una frase.

Proprietà logiche

Una volta che ti sei abituato a lavorare con le dimensioni Block e Inline, le righe di inizio e fine, il collegamento alle dimensioni fisiche nel resto del CSS inizia a sembrare imbarazzante. Esiste, tuttavia, una specifica che definisce le versioni logiche di tutte le proprietà fisiche esistenti: la specifica CSS per le proprietà ei valori logici, che è una prima bozza di lavoro pubblica. Attualmente l'unico browser con un buon supporto per queste proprietà è Firefox, tuttavia capire come funzionano può essere un buon modo per pensare ai nuovi CSS, quindi diamo un'occhiata.

Ho illustrato ogni sezione con esempi di CodePen, per vederli funzionare dovrai usare Firefox!

Dimensioni logiche

Le proprietà logiche definiscono una proprietà iniziale e finale per il blocco e la quota in linea. Per le proprietà di altezza e larghezza, utilizziamo invece block-size e inline-size . Possiamo anche impostare max-block-size , min-block-size , max-inline-size e min-inline-size . Se lavori in inglese, una lingua orizzontale dall'alto verso il basso block-size si riferisce height fisica del blocco sullo schermo, la inline-size la width fisica dell'elemento. Se stai lavorando in una lingua in cui i blocchi corrono verticalmente, quando guardi lo schermo apparirà la block-size per controllare la width e la inline-size l'altezza.

Puoi vederlo in azione nella demo qui sotto. Il mio blocco ha una block-size di 150 pixel e una inline-size di 250 pixel. Modificare la proprietà della writing-mode per vedere come si adatta il layout.

Guarda la demo di Pen Block e Inline Size di Rachel Andrew (@rachelandrew) su CodePen.

Guarda la demo di Pen Block e Inline Size di Rachel Andrew (@rachelandrew) su CodePen.

Confini logici

Abbiamo quindi proprietà per controllare i bordi che funzionano allo stesso modo. Le proprietà fisiche dei bordi sono:

  • border-top
  • border-top-width
  • border-top-style
  • border-top-color
  • border-right
  • border-right-width
  • border-right-style
  • border-right-color
  • border-bottom
  • border-bottom-width
  • border-bottom-style
  • border-bottom-color
  • border-left
  • border-left-width
  • border-left-style
  • border-left-color

Questi poi hanno mappature logiche che diventano un po' prolisse come mani lunghe, ma sono:

  • border-block-start
  • border-block-start-width
  • border-block-start-style
  • border-block-start-color
  • border-inline-start
  • border-inline-start-width
  • border-inline-start-style
  • border-inline-start-color
  • border-block-end
  • border-block-end-width
  • border-block-end-style
  • border-block-end-color
  • border-inline-end
  • border-inline-end-width
  • border-inline-end-style
  • border-inline-end-color

Nell'esempio seguente, sono presenti due blocchi, il primo che utilizza le proprietà logiche per impostare un border-block-start-color verde e uno border-inline-end-style punteggiato. Il secondo blocco utilizza le proprietà fisiche di border-top-color e border-right . Cambia la modalità di scrittura per vedere come si comportano.

Vedi Pen Logical Borders di Rachel Andrew (@rachelandrew) su CodePen.

Vedi Pen Logical Borders di Rachel Andrew (@rachelandrew) su CodePen.

Margini e imbottitura

I margini e il riempimento hanno una mano lunga simile alle nostre proprietà del bordo, con le proprietà fisiche che sono:

  • margin-top
  • margin-left
  • margin-bottom
  • margin-right
  • padding-top
  • padding-right
  • padding-bottom
  • padding-left

Questi hanno proprietà logiche come segue:

  • margin-block-start
  • margin-inline-start
  • margin-inline-start
  • margin-inline-end
  • padding-block-start
  • padding-inline-start
  • padding-inline-start
  • padding-inline-end

In questo prossimo esempio, ho impostato padding-block-start sul primo blocco e padding-top sul secondo, ho cambiato la modalità di scrittura per vedere la differenza quando gli assi Block e Inline vengono scambiati.

Vedi le proprietà logiche della penna - Padding di Rachel Andrew (@rachelandrew) su CodePen.

Vedi le proprietà logiche della penna - Padding di Rachel Andrew (@rachelandrew) su CodePen.

Spostamenti di posizionamento

Un altro luogo in cui vengono utilizzate le proprietà fisiche è quando si posizionano le cose utilizzando la proprietà position . Dopo aver impostato position: absolute o un altro valore di position diverso da quello predefinito di static , possiamo quindi posizionare un elemento utilizzando gli offset, dalla finestra o da un genitore che ha creato un nuovo contesto di posizionamento.

Le proprietà fisiche dell'offset sono:

  • top
  • right
  • bottom
  • left

Seguendo lo schema delle altre nostre proprietà logiche abbiamo quindi:

  • offset-block-start
  • offset-inline-start
  • offset-block-end
  • offset-inline-end

Provali nell'esempio qui sotto. La casella con un bordo ha position: relative e il quadratino viola position: absolute . Nell'esempio fisico il quadrato è posizionato in top: 50px ea right: 20px . La versione logica ha offset-block-start: 50px e offset-inline-end: 20px .

Guarda gli offset logici della penna di Rachel Andrew (@rachelandrew) su CodePen.

Guarda gli offset logici della penna di Rachel Andrew (@rachelandrew) su CodePen.

Valori logici

Un altro luogo in cui siamo abituati a usare le dimensioni fisiche è quando galleggiamo o schiariamo le cose. Per float , clear abbiamo alcune versioni logiche dei valori left e right .

  • inline-start
  • inline-end

Guarda la penna fluttuante con valori logici di Rachel Andrew (@rachelandrew) su CodePen.

Guarda la penna fluttuante con valori logici di Rachel Andrew (@rachelandrew) su CodePen.

Nella demo, sto fluttuando il blocco viola nella versione logica inline-start . Sto anche usando le proprietà logiche per il margine; questo assicura che il margine venga sempre dopo il blocco e prima del contenuto che lo avvolge. Selezionando il valore vertical-rl nell'elenco a discesa, puoi vedere come nell'esempio fisico il margine finisce a destra del blocco, anziché essere applicato nella direzione -end .

Due caselle contenenti blocchi viola, il blocco di sinistra è disallineato
Il blocco posizionato nell'esempio fisico a sinistra ha un margine a destra

Esistono anche valori di start e end per text-align . Allineare qualcosa all'inizio lo allineerà all'inizio dell'asse in linea, alla end alla fine dell'asse in linea, indipendentemente dal fatto che la modalità di scrittura sia orizzontale o verticale.

Utilizzo di proprietà e valori logici oggi

Il sito Web Can I Use che mostra il supporto delle proprietà logiche
Lo stato del supporto del browser a febbraio 2018

Come già accennato, al momento c'è poco supporto del browser per proprietà e valori logici. Tuttavia, se vuoi iniziare a lavorare con loro ora, un'opzione sarebbe quella di scrivere il tuo CSS usandoli e quindi utilizzare un plug-in PostCSS per convertire le proprietà e i valori logici nelle loro controparti fisiche. Questo plugin di Jonathan Neal copre tutte le proprietà e i valori che ho descritto in questo articolo.

Puoi anche aiutare a incoraggiare l'adozione da parte dei fornitori di browser di queste proprietà contrassegnando il bug di Chrome e votandoli sul sito Edge Developer Feedback.

Anche se decidi di non utilizzare queste proprietà ora, capire come funzionano è un elemento chiave per la comprensione per lavorare con un nuovo layout. Descrivendo il tuo layout Grid o Flex come avente linee di inizio e fine, pensando alle dimensioni del blocco e in linea, queste cose renderanno molto più facile capire come funziona il layout.

Ulteriori letture

  • I documenti Web MDN hanno tutte le proprietà logiche e i valori elencati con esempi aggiuntivi.
  • Griglia CSS, valori logici e modalità di scrittura, MDN
  • Modalità di scrittura CSS, Jen Simmons, 24 modi