Miglioramenti del layout logico con scorciatoie relative ai flussi

Nuove scorciatoie per le proprietà logiche e nuove proprietà integrate per Chromium.

Da Chromium 69 (3 settembre 2018), le proprietà logiche e i valori logici hanno aiutato gli sviluppatori a mantenere il controllo dei loro layout internazionali tramite stili logici, anziché fisici, di direzione e dimensioni. In Chromium 87, sono stati inviati comandi abbreviati e offset per semplificare la scrittura di queste proprietà e valori logici. In questo modo Chromium fino a Firefox, che supportava le scorciatoie dal 66. Safari le ha pronte nell'anteprima tecnologica.

Vengono mostrati in latino, ebraico e giapponese un testo segnaposto scomposto all'interno del frame di un dispositivo. Le frecce e i colori seguono il testo per associare le due direzioni di blocco e in linea.

Flusso di documenti

Se hai già familiarità con le proprietà logiche, gli assi in linea e a blocchi e non ti serve un ripasso, puoi saltare. In caso contrario, ecco un breve riepilogo.

In inglese, lettere e parole scorrono da sinistra a destra, mentre i paragrafi sono impilati dall'alto verso il basso. Nel cinese tradizionale, le lettere e le parole sono posizionate dall'alto verso il basso, mentre i paragrafi sono impilati da destra a sinistra. In questi 2 casi, se scriviamo CSS che inserisce "margin top" in un paragrafo, interponiamo correttamente una sola lingua in uno stile. Se la pagina viene tradotta dall'inglese in cinese tradizionale, il margine potrebbe non avere senso con la nuova modalità di scrittura verticale.

Di conseguenza, il lato fisico della scatola non è molto utile a livello internazionale. Inizia così il processo di supporto di più lingue, scoprendo i lati fisici e logici del modello box.

Hai mai controllato l'elemento p in Chrome DevTools? Se è così, potresti aver notato che gli stili predefiniti dello user agent non sono fisici, ma logici.

p {
  margin-block-start: 1em;
  margin-block-end: 1em;
  margin-inline-start: 0px;
  margin-inline-end: 0px;
}

CSS del foglio di stile user agent di Chromium

Il margine non è in alto o in basso come potrebbe credere un lettore inglese. Sono block-start e block-end! Queste proprietà logiche sono simili alla parte superiore e inferiore di un lettore inglese, ma anche al lettore giapponese, a destra e a sinistra. Scritto una volta, funziona ovunque.

Il flusso normale si verifica quando la pagina web fa parte di questa multidirezionale intenzionalmente. Quando i contenuti della pagina vengono aggiornati in base alle modifiche di direzione del documento, il layout e i relativi elementi sono considerati come flusso. Scopri di più su "in entrata" e "uscita" dal flusso su MDN o nelle specifiche del modulo display CSS. Sebbene non sia necessario mantenere le proprietà logiche, svolgono gran parte del lavoro pesante in quanto cambia la direzionalità. Il flusso implica la direzione, ovvero le lettere, le parole e i contenuti che devono percorrere. Questo ci porta a bloccare e incorporare le direzioni logiche.

La direzione di un blocco è la direzione in cui seguono i nuovi blocchi di contenuti, ad esempio chiedendoti "dove posizionare il paragrafo successivo?". Potresti pensare a un "blocco di contenuti" o a un "blocco di testo". Ogni lingua organizza i propri blocchi e li ordina insieme al rispettivo block-axis. block-start è il lato in cui viene posizionato per primo un paragrafo, mentre block-end è il lato verso cui scorre i nuovi paragrafi.

Nella scrittura a mano libera tradizionale giapponese, ad esempio, la direzione di blocco scorre da destra a sinistra:

La direzione in linea è la direzione in cui si muovono le lettere e le parole. Considera la direzione di spostamento del braccio e della mano quando scrivi, poiché si spostano lungo il inline-axis. inline-start è il lato in cui inizi a scrivere, mentre inline-end è il lato in cui la scrittura finisce o va a capo. Nel video qui sopra, il inline-axis è dall'alto verso il basso, ma nel prossimo video il inline-axis è mostrato da destra a sinistra.

Il valore flow-relative significa che gli stili scritti per una lingua saranno contestuali e applicati correttamente in altre lingue. Il flusso dei contenuti avverrà in base alla lingua di destinazione.

Nuovi comandi rapidi

Alcune delle seguenti scorciatoie non sono nuove funzionalità per il browser, ma piuttosto modi più semplici per scrivere stili grazie alla possibilità di impostare valori contemporaneamente su entrambi i bordi dei blocchi o in linea. Le proprietà logiche inset-* offrono nuove funzionalità, poiché non esistevano modi lunghi per specificare posizioni assolute con proprietà logiche prima dell'origine. Tuttavia, gli insiemi e le scorciatoie scorrono così bene insieme, ma ti parlerò contemporaneamente di tutte le nuove funzionalità delle proprietà logiche disponibili in Chromium 87.

Margini abbreviati

Non sono state inviate nuove funzionalità, ma è stato possibile usare alcune scorciatoie utilissime:
margin-block e margin-inline.

A mano libera
margin-block-start: 2ch;
margin-block-end: 2ch;
Nuova forma abbreviata
margin-block: 2ch;
/* or */
margin-block: 2ch 2ch;

Non esiste una scorciatoia per "superiore e inferiore" o "sinistra e destra"... finora! Probabilmente farai riferimento a tutti e quattro i lati usando l'abbreviazione di margin: 10px; e ora puoi facilmente fare riferimento a due lati complementari utilizzando l'abbreviazione della proprietà logica.

A mano libera
margin-inline-start: 4ch;
margin-inline-end: 2ch;
Nuova forma abbreviata
margin-inline: 4ch 2ch;

Semplicità di spaziatura

Non sono state fornite nuove funzionalità, ma sono state trovate altre scorciatoie super utili:
padding-block e padding-inline.


A mano libera
padding-block-start: 2ch;
padding-block-end: 2ch;
Nuova forma abbreviata
padding-block: 2ch;
/* or */
padding-block: 2ch 2ch;

E il set di comandi rapidi inclusi in inline:

A mano libera
padding-inline-start: 4ch;
padding-inline-end: 2ch;
Nuova forma abbreviata
padding-inline: 4ch 2ch;

Inset e Short

Le proprietà fisiche top, right, bottom e left possono essere scritte come valori per la proprietà inset. Qualsiasi valore di position può trarre vantaggio dall'impostazione dei lati con un riquadro.

.cover {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  inset: 0;
}


Fisico a lungo
position: absolute;
top: 1px;
right: 2px;
bottom: 3px;
left: 4px;
Nuova forma abbreviata fisica
position: absolute;
inset: 1px 2px 3px 4px;

Dovrebbe risultare immediatamente pratico. "Inset" è un'abbreviazione per i lati fisici e funziona come margine e spaziatura interna.

Nuove funzionalità

Per quanto entusiasmante per quanto riguarda l'aspetto fisico, c'è ancora di più nelle caratteristiche logiche offerte da ulteriori scorciatoie di inset. Queste scorciatoie offrono agli sviluppatori maggiore praticità (sono più brevi da digitare), ma aumentano anche la potenziale copertura del layout in quanto sono relativi al flusso.

Fisico a lungo
position: absolute;
top: 10px;
bottom: 10px;
Scorciatoia logica
position: absolute;
inset-block: 10px;


Fisico a lungo
position: absolute;
left: 10px;
right: 20px;
Scorciatoia logica
position: absolute;
inset-inline: 10px 20px;

Su MDN sono disponibili ulteriori letture e un elenco completo dei testi in versione abbreviata e lunga.

Scorciatoie da tastiera per i bordi

Anche il bordo e le relative proprietà nidificate color, style e width hanno nuove scorciatoie logiche.


Fisico a lungo
border-top-color: hotpink;
border-bottom-color: hotpink;
Scorciatoia logica
border-block-color: hotpink;
/* or */
border-block-color: hotpink hotpink;


Fisico a lungo
border-left-style: dashed;
border-right-style: dashed;
Scorciatoia logica
border-inline-style: dashed;
/* or */
border-inline-style: dashed dashed;


Fisico a lungo
border-left-width: 1px;
border-right-width: 1px;
Scorciatoia logica
border-inline-width: 1px;
/* or */
border-inline-width: 1px 1px;

Su MDN sono disponibili ulteriori letture e un elenco completo dei caratteri stenografici e a mano libera delle frontiere.

Esempio di proprietà logica <figure>

Facciamo un piccolo esempio. Le proprietà logiche possono modificare il layout di un'immagine con una didascalia per gestirla.

Oppure prova!

Non devi fare molto per rendere una scheda adattabile a livello internazionale con <figure> e alcune proprietà logiche. Se vuoi sapere come tutti questi CSS considerati a livello internazionale funzionano in sintonia, spero che questa sia una piccola introduzione importante.

Polyfilling e supporto cross-browser

Gli strumenti Cascade o di creazione sono opzioni valide per avere browser vecchi e nuovi allo stesso modo, correttamente distanziati con le proprietà logiche aggiornate. Per i fallback di Cascade, segui una proprietà fisica con una proprietà logica e il browser utilizzerà l'"ultima" proprietà trovata durante la risoluzione dello stile.

p {
  /* for unsupporting browsers */
  margin-top: 1ch;
  margin-bottom: 2ch;

  /* for supporting browsers to use */
  /* and unsupporting browsers to ignore and go 🤷‍♂️ */
  margin-block: 1ch 2ch;
}

Tuttavia, non è una soluzione del tutto completa per tutti. Ecco un fallback scritto a mano che sfrutta lo pseudo-selettore :lang() per scegliere come target lingue specifiche, regola la spaziatura fisica in modo appropriato e, alla fine, offre la spaziatura logica per il supporto dei browser:

/* physical side styles */
p {
  margin-top: 1ch;
  margin-bottom: 2ch;
}

/* adjusted physical side styles per language */
:lang(ja) {
  p {
    /* zero out styles not useful for traditional Japanese */
    margin-top: 0;
    margin-bottom: 0;

    /* add appropriate styles for traditional Japanese */
    margin-right: 1ch;
    margin-left: 2ch;
  }
}

/* add selectors and adjust for languages all supported */
:lang(he) {…}
:lang(mn) {…}

/* Logical Sides */
/* Then, for supporting browsers to use */
/* and unsupporting browsers to ignore #TheCascade */
p {
  /* remove any potential physical cruft.. */
  margin: 0;
  /* explicitly set logical value */
  margin-block: 1ch 2ch;
}

Puoi anche utilizzare @supports per determinare se fornire o meno i fallback delle proprietà fisiche:

p {
  margin-top: 1ch;
  margin-bottom: 2ch;
}

@supports (margin-block: 0) {
  p {
    margin-block: 1ch 2ch;
  }
}

Sass, PostCSS, Emotion e altri offrono bundler automatici e/o offerte di tempo di creazione con un'ampia gamma di soluzioni o soluzioni di riserva. Dai un'occhiata a ciascuno di questi per vedere quello che corrisponde alla tua toolchain e alla strategia complessiva del sito.

Passaggi successivi

Un maggior numero di CSS offrirà proprietà logiche, ma non è ancora possibile. Manca un grande insieme di comandi rapidi, ma c'è ancora una soluzione per questo problema di GitHub. Esiste una soluzione temporanea in bozza. E se volessi assegnare uno stile a tutti i lati logici di una scatola?

Stenografia fisica
margin: 1px 2px 3px 4px;
margin: 1px 2px;
margin: 2px;
Scorciatoia logica
margin: logical 1px 2px 3px 4px;
margin: logical 1px 2px;
margin: logical 2px;

L'attuale bozza di proposta significherebbe che devi scrivere logical in ogni abbreviazione per applicare l'equivalente logico, che per alcuni non suona molto DRY.

Esistono altre proposte per cambiarla a livello di blocco o di pagina, ma ciò potrebbe far trapelare utilizzi logici in stili che assumono ancora lati fisici.

html {
  flow-mode: physical;
  /* or */
  flow-mode: logical;
  /* now all margin/padding/etc references are logical */
}

/* hopefully no 3rd/1st party code is hard coded to top/left/etc ..? */

È difficile! Vota e esprimi la tua opinione, vogliamo conoscere la tua opinione.

Vuoi imparare o studiare le proprietà logiche di più? Ecco un riferimento dettagliato, insieme a guide ed esempi, su MDN 🤓

Feedback