{"id":832,"date":"2018-05-29T06:56:06","date_gmt":"2018-05-29T04:56:06","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/faux-grid-tracks\/"},"modified":"2018-05-29T06:56:06","modified_gmt":"2018-05-29T04:56:06","slug":"faux-grid-tracks","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/faux-grid-tracks\/","title":{"rendered":"Faux Grid Tracks"},"content":{"rendered":"<p>Un po&#8217; di tempo fa, \u00e8 stata postata questa domanda su <a href=\"http:\/\/css-discuss.org\/\">css-discuss<\/a>:<\/p>\n<div id=\"figure1\" class=\"quote\">\n<blockquote><p>\u00c8 possibile assegnare uno stile alle righe e alle colonne di una griglia [CSS], ossia alla griglia stessa? Devo fare un layout che usa un tabellone tipo quello del gioco del tris, completo di linee verticali e orizzontali del tabellone del tris, con testo\/icone in ogni cella della griglia.<\/p><\/blockquote>\n<\/div>\n<p>Mi aspetto che questa domanda salti fuori pi\u00f9 e pi\u00f9 volte man mano che si comincia ad esplorare Grid layout. La risposta breve \u00e8: no, non \u00e8 possibile farlo. Ma <em>\u00e8<\/em> possibile simulare tale effetto, che \u00e8 quello che vorrei esplorare.<\/p>\n<div class=\"paragrafo\">\n<h2 id=\"section1\">Definire la griglia<\/h2>\n<p>Dal momento che stiamo parlando di layout del tris, abbiamo bisogno di un elemento contenitore attorno ai nove elementi. Potremmo usare una lista ordinata, o un paragrafo con una serie di <code>&lt;span&gt;<\/code>, o una <code>&lt;section&gt;<\/code> con dei <code>&lt;div&gt;<\/code>. Scegliamo quest&#8217;ultima.<\/p>\n<pre id=\"snippet1\" class=\" language-markup\"><code class=\" language-markup\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>section<\/span> <span class=\"token attr-name\">id<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>ttt<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>1<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>2<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>3<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>4<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>5<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>6<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>7<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>8<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>9<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>section<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/code><\/pre>\n<p>Prendiamo quei nove <code>&lt;div&gt;<\/code> e mettiamoli in una griglia tre per tre, con ogni riga alta cinque em e ogni colonna larga cinque em. Impostare la struttura della griglia \u00e8 piuttosto semplice:<\/p>\n<pre id=\"snippet2\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">#ttt <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> grid<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-columns<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-rows<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Ecco fatto! Grazie all&#8217;algoritmo di auto-flow intrinseco di Grid Layout, questo \u00e8 sufficiente per mettere nove elementi <code>&lt;div&gt;<\/code> in nove celle della griglia. Da qui, creare l&#8217;aspetto di una griglia \u00e8 questione di impostare i bordi sugli elementi <code>&lt;div&gt;<\/code>. Ci sono molti modi per farlo, ma io ho scelto questo:<\/p>\n<pre id=\"snippet3\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">#ttt &gt; * <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">border<\/span><span class=\"token punctuation\">:<\/span> 1px solid black<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">border-width<\/span><span class=\"token punctuation\">:<\/span> 0 1px 1px 0<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> flex<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/* flex styling to center content in divs *\/<\/span>\n\t<span class=\"token property\">align-items<\/span><span class=\"token punctuation\">:<\/span> center<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">justify-content<\/span><span class=\"token punctuation\">:<\/span> center<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">#ttt &gt; *:nth-of-type(3n)  <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">border-right-width<\/span><span class=\"token punctuation\">:<\/span> 0<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">#ttt &gt; *:nth-of-type(n+7) <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">border-bottom-width<\/span><span class=\"token punctuation\">:<\/span> 0<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Il risultato \u00e8 mostrato nel layout di base qui sotto.<\/p>\n<div id=\"figure2\" class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/05\/basic-layout.png\" border=\"0\" alt=\"Screenshot: il layout di base ha una griglia 3x3 con le linee che spezzano la griglia come un tabellone del gioco del tris.\" width=\"100%\" \/><\/p>\n<p>Figura 1: il layout di base<\/p>\n<\/div>\n<p>Questo approccio ha il vantaggio di non essere basato sui nomi delle class e compagnia bella. Tuttavia si sgretola se il grid flow viene cambiato per essere colonnare, come possiamo vedere nella Figura 2.<\/p>\n<pre id=\"snippet4\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">#ttt <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> grid<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-columns<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-rows<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-auto-flow<\/span><span class=\"token punctuation\">:<\/span> column<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* a change in layout! *\/<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<div id=\"figure3\" class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/05\/basic-layout-columnar.png\" border=\"0\" alt=\"Screenshot: se la griglia passa al flow order colonnare, i bordi impazziscono. Invece di un tabellone del tris, i bordi orizzontali pi\u00f9 a destra si spostano sul fondo della griglia e quelli verticali pi\u00f9 in basso si spostano sul lato destro.\" width=\"100%\" \/><\/p>\n<p>Figura 2: il layout di base con grid flow colonnare.<\/p>\n<\/div>\n<p>Se il flow \u00e8 colonnare, allora le regole per l&#8217;applicazione dei bordi si ribaltano, cos\u00ec:<\/p>\n<pre id=\"snippet5\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">#ttt &gt; *:nth-of-type(3n) <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">border-bottom-width<\/span><span class=\"token punctuation\">:<\/span> 0<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">#ttt &gt; *:nth-of-type(n+7) <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">border-right-width<\/span><span class=\"token punctuation\">:<\/span> 0<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Questo ci riporta al risultato che abbiamo visto in Figura 1, ma con il contenuto in ordine colonnare invece che di riga. Non c&#8217;\u00e8 in Grid un <code>row reverse<\/code> o un <code>column reverse<\/code> come c&#8217;\u00e8 in flexbox, quindi dobbiamo solo preoccuparci dei pattern di flusso di righe e colonne.<\/p>\n<p>Ma cosa succede se un cambiamento successivo al design porta gli item della griglia ad essere risistemati in modi diversi? Per esempio, potrebbe esserci una ragione per prendere uno o due degli item e mostrarli per ultimi nella griglia, cos\u00ec:<\/p>\n<pre id=\"snippet6\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">#ttt &gt; *:nth-of-type(4), #ttt &gt; *:nth-of-type(6) <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">order<\/span><span class=\"token punctuation\">:<\/span> 66<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Proprio come in flexbox, questo sposter\u00e0 i grid item mostrati fuori dall&#8217;ordine del sorgente, mettendoli dopo i grid item che non hanno valori espliciti di <code>order<\/code>. Se questo tipo di nuova disposizione \u00e8 una possibilit\u00e0, non c&#8217;\u00e8 un modo semplice per attivare e disattivare i bordi per creare l&#8217;illusione di linee nella griglia interna. Cosa si fa?<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section2\">Attacco dei filler &lt;b&gt;!<\/h2>\n<p>Se vogliamo creare degli stili standalone che seguano le grid track, ossia, gli aspetti di presentazione che non sono direttamente collegati al contenuto verosimilmente risistemato, allora abbiamo bisogno di altri elementi da sistemare e a cui assegnare degli stili. Probabilmente, non avranno alcun contenuto, rendendoli una sorta di filler strutturali per riempire i gap delle capacit\u00e0 di Grid.<\/p>\n<p>Perci\u00f2, all&#8217;elemento <code>&lt;section&gt;<\/code>, possiamo aggiungere due elementi <code>&lt;b&gt;<\/code> con identificatori.<\/p>\n<pre id=\"snippet7\" class=\" language-markup\"><code class=\" language-markup\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>section<\/span> <span class=\"token attr-name\">id<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>ttt<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>b<\/span> <span class=\"token attr-name\">id<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>h<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>b<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>b<\/span> <span class=\"token attr-name\">id<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>v<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>b<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>1<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>2<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>3<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\u2026<\/code><\/pre>\n<p>Questi \u201cfiller <code>&lt;b&gt;<\/code>\u201d, come mi piace definirli, potrebbero essere messi ovunque all&#8217;interno di <code>&lt;section&gt;<\/code>, ma va bene all&#8217;inizio. Ci atterremo a questo. Poi aggiungeremo questi stili alla nostra griglia originale del <a href=\"#snippet2\">layout di base<\/a>:<\/p>\n<pre id=\"snippet8\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">b[id] <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">border<\/span><span class=\"token punctuation\">:<\/span> 1px solid gray<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">b#h <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">grid-column<\/span><span class=\"token punctuation\">:<\/span> 1 \/ -1<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-row<\/span><span class=\"token punctuation\">:<\/span> 2<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">border-width<\/span><span class=\"token punctuation\">:<\/span> 1px 0<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">b#v <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">grid-column<\/span><span class=\"token punctuation\">:<\/span> 2<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-row<\/span><span class=\"token punctuation\">:<\/span> 1 \/ -1<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">border-width<\/span><span class=\"token punctuation\">:<\/span> 0 1px<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Il <code>1 \/ -1<\/code> significa \u201cvai dalla prima grid line all&#8217;ultima grid line dell&#8217;<a href=\"https:\/\/gridbyexample.com\/examples\/example10\/\">explicit grid<\/a>\u201d, indipendentemente da quante grid line possano esserci. \u00c8 un pattern comodo da usare in ogni situazione in cui si ha un grid item che dovrebbe allungarsi da lato a lato di una griglia.<\/p>\n<p>Quindi, il <code>&lt;b&gt;<\/code> orizzontale ha i bordi top e bottom e il <code>&lt;b&gt;<\/code> verticale ha i bordi left e right. Questo crea le linee del tabellone, come mostrato nella Figura 3.<\/p>\n<div id=\"figure4\" class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/05\/basic-filler-b.png\" border=\"0\" alt=\"Screenshot: con i filler tag b, potete vedere di nuovo il tabellone del tris. Ma solo gli angoli della griglia sono riempiti di contenuto e ci sono 5 celle sotto il tabellone perch\u00e9 le grid line hanno spostato il contenuto.\" width=\"100%\" \/><\/p>\n<p>Figura 3: il layout base con i \u201cfiller <code>&lt;b&gt;<\/code>\u201d<\/p>\n<\/div>\n<p>Aspetta un attimo: abbiamo di nuovo la griglia del tris, ma adesso i numeri sono nei posti sbagliati, il che significa che i <code>&lt;div&gt;<\/code> che li contengono sono fuori posto. E il motivo \u00e8 questo: gli elementi <code>&lt;div&gt;<\/code> che contengono il contenuto effettivo non fluiranno pi\u00f9 automaticamente nelle celle della griglia, perch\u00e9 i filler <code>&lt;b&gt;<\/code> stanno gi\u00e0 occupando cinque delle nove celle. (Si tratta delle celle nella colonna e riga centrale della griglia). L&#8217;unico modo per riportare gli elementi <code>&lt;div&gt;<\/code> nelle loro celle della griglia prevista \u00e8 di piazzarceli esplicitamente. Ecco un modo per farlo:<\/p>\n<pre id=\"snippet9\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">div:nth-of-type(3n+1) <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">grid-column<\/span><span class=\"token punctuation\">:<\/span> 1<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">div:nth-of-type(3n+2) <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">grid-column<\/span><span class=\"token punctuation\">:<\/span> 2<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">div:nth-of-type(3n+3) <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">grid-column<\/span><span class=\"token punctuation\">:<\/span> 3<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">div:nth-of-type(-n+3) <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">grid-row<\/span><span class=\"token punctuation\">:<\/span> 1<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">div <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">grid-row<\/span><span class=\"token punctuation\">:<\/span> 2<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">div:nth-of-type(n+7) <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">grid-row<\/span><span class=\"token punctuation\">:<\/span> 3<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Questo funziona se sapete che il contenuto sar\u00e0 sempre disposto in ordine \u201cprima la riga poi la colonna\u201d. Passare a \u201cprima la colonna poi la riga\u201d richiede la riscrittura del CSS. Se i contenuti devono essere piazzati in un ordine confuso, allora dovrete scrivere una regola per ogni <code>&lt;div&gt;<\/code>.<\/p>\n<p>Questo probabilmente \u00e8 sufficiente per la maggior parte dei casi, ma spingiamoci oltre. Supponiamo di voler disegnare quelle linee della griglia senza interferire con il flusso automatico dei contenuti. Come possiamo farlo?<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section3\">Overgridding<\/h2>\n<p>Sarebbe comodo se ci fosse una propriet\u00e0 per marcare gli elementi come non partecipanti al grid flow, ma non c&#8217;\u00e8. Quindi, al contrario, suddivideremo i contenuti e i filler nelle proprie griglie e useremo una terza griglia per mettere una di quelle griglie sopra l&#8217;altra.<\/p>\n<p>Perch\u00e9 ci\u00f2 avvenga, \u00e8 necessario un po&#8217; di cambiamento strutturale, perch\u00e9 funzioni, i contenuti e i filler <code>&lt;b&gt;<\/code> devono avere griglie identiche. Pertanto ci ritroviamo con:<\/p>\n<pre id=\"snippet10\" class=\" language-markup\"><code class=\" language-markup\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>section<\/span> <span class=\"token attr-name\">id<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>ttt<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">id<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>board<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>b<\/span> <span class=\"token attr-name\">id<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>h<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>b<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>b<\/span> <span class=\"token attr-name\">id<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>v<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>b<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">id<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>content<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>1<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>2<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>3<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>4<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>5<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>6<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>7<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>8<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>9<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>section<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/code><\/pre>\n<p>La prima cosa da fare \u00e8 dare ai <code>&lt;div&gt;<\/code> del tabellone e del contenuto griglie identiche. La stessa griglia che abbiamo usato prima, in effetti. Cambiamo solo un pochino il selettore della regola <var>#ttt<\/var>, per selezionare invece i figli di <var>#ttt<\/var>:<\/p>\n<pre id=\"snippet11\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">#ttt &gt; * <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> grid<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-columns<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-rows<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Adesso che queste due griglie hanno lo stesso layout, dobbiamo piazzarne una sull&#8217;altra. Potremmo posizionare relativamente il container <var>#ttt<\/var> e posizionare in maniera assoluta i suoi figli, ma c&#8217;\u00e8 un altro modo: usare Grid.<\/p>\n<pre id=\"snippet12\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">#ttt <\/span><span class=\"token punctuation\">{<\/span> <span class=\"token comment\">\/* new rule added *\/<\/span>\n\t<span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> grid<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">#ttt &gt; * <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> grid<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-columns<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-rows<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Ma aspettate: dove sono le righe e le colonne per <var>#ttt<\/var>? Dove siamo diretti, non servono le righe (o le colonne). Ecco in che modo due griglie finiscono con l&#8217;occupare la stessa area con una sopra l&#8217;altra:<\/p>\n<pre id=\"snippet13\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">#ttt <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> grid<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">#ttt &gt; * <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> grid<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-columns<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-rows<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-column<\/span><span class=\"token punctuation\">:<\/span> 1<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* explicit grid placement *\/<\/span>\n\t<span class=\"token property\">grid-row<\/span><span class=\"token punctuation\">:<\/span> 1<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* explicit grid placement *\/<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Quindi, a <var>#ttt<\/var> viene assegnata una griglia con una cella e i suoi due figli sono esplicitamente sistemati in quella singola cella. Pertanto, uno sta sopra l&#8217;altro, come con il posizionamento, ma a differenza del posizionamento, la dimensione della griglia pi\u00f9 esterna \u00e8 dettata dal layout dei suoi figli. Si ridimensioner\u00e0 per circondarli, anche se poi cambieremo le griglie interne perch\u00e9 siano pi\u00f9 grandi (o pi\u00f9 piccole). Possiamo vedere questo in pratica nella Figura 4, dove la griglia pi\u00f9 esterna \u00e8 delineata in viola nel Grid Inspector Tool di Firefox.<\/p>\n<div id=\"figure5\" class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/05\/overgridded-firefox.png\" border=\"0\" alt=\"Screenshot: Nel Grid Inspector di Firefox, la griglia contenitrice si espande per l'intera larghezza della pagina con un bordo viola. Occupando circa un terzo dello spazio sul lato sinistro del container ci sono due griglie figlie, una con i numeri da 1 a 9 in una griglia 3 per 3 e l'altra con le linee del tris sovrapposte le une alle altre.\" width=\"100%\" \/><\/p>\n<p>Figura 4: Il layout overgridded<\/p>\n<\/div>\n<p>E questo \u00e8 quanto. Potremmo spingerci oltre, magari usando lo <code>z-index<\/code> per disporre il tabellone sopra al contenuto (di default, l&#8217;elemento che viene dopo nel codice viene visualizzato sopra all&#8217;elemento che viene prima), ma questo \u00e8 sufficiente per il caso che abbiamo preso in considerazione.<\/p>\n<p>Il vantaggio \u00e8 che il <code>&lt;div&gt;<\/code> del contenuto, avendo solo da preoccuparsi dei suoi contenuti, pu\u00f2 fare uso di <code>grid-auto-flow<\/code> e <code>order<\/code> per riarrangiare le cose. Come esempio, potete fare cose come la seguente e non vi serviranno tutti i posizionamenti <code>:nth-of-type<\/code> dei grid item del nostro precedente CSS. La Figura 5 mostra il risultato.<\/p>\n<pre id=\"snippet14\" class=\" language-css\"><code class=\" language-css\"><span class=\"token comment\">\/* added to #snippet13 code *\/<\/span>\n<span class=\"token selector\">#ttt &gt; #content <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">grid-auto-flow<\/span><span class=\"token punctuation\">:<\/span> column<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">#ttt &gt; #content &gt; :nth-child(5) <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">order<\/span><span class=\"token punctuation\">:<\/span> 2<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<div id=\"figure6\" class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/05\/overgridded-5last.png\" border=\"0\" alt=\"Screenshot: la versione overgridded, in cui la grid numerata 3 per 3 \u00e8 sovrapposta sul tabellone del tris, continua a funzionare bene se riordinate le celle. In questo caso, il numero 5 si \u00e8 spostato dalla cella della griglia centrale a quella in fondo a destra.\" width=\"100%\" \/><\/p>\n<p>Figura 5: Spostare il #5 alla fine e lasciare che gli altri item rifluiscano in colonne.<\/p>\n<\/div>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section4\">Precisazioni<\/h2>\n<p>Qui lo svantaggio, ed \u00e8 piuttosto grosso, \u00e8 che le griglie del tabellone e del contenuto sono solo minimamente coscienti l&#8217;una dell&#8217;altra. La ragione per cui l&#8217;esempio precedente funziona \u00e8 che le grid track sono di dimensione fissa e nessuna parte del contenuto \u00e8 in overflow. Supponiamo di volere che le colonne e le righe si ridimensionino in base al contenuto, cos\u00ec:<\/p>\n<pre id=\"snippet15\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">#content <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">grid-template-columns<\/span><span class=\"token punctuation\">:<\/span> repeat(3,min-content)<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-rows<\/span><span class=\"token punctuation\">:<\/span> repeat(3,min-content)<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Questo si sgretoler\u00e0 presto, con le linee del tabellone non corrispondenti al layout del contenuto attuale. Per niente.<\/p>\n<p>In altre parole, questa tecnica della sovrapposizione sacrifica uno dei principali punti di forza di Grid: il modo in cui le celle della griglia si relazionano alle altre celle della griglia. Si tratta di un compromesso ragionevole nei casi in cui la dimensione del contenuto \u00e8 prevedibile ma l&#8217;ordinamento non lo \u00e8. In altri casi, probabilmente non \u00e8 una buona idea.<\/p>\n<p>Ricordatevi che questo funziona davvero solo con i layout in cui dimensioni e disposizione sono sempre noti e in cui a volte dovete disporre le griglie una sull&#8217;altra. Se il vostro filler <code>&lt;b&gt;<\/code> viene in contatto con un grid item implicitamente posizionato nella stessa griglia che occupa, gli verr\u00e0 impedito di allungarsi. (I grid item esplicitamente posizionati, ossia quelli in cui l&#8217;autore ha dichiaro i valori sia per <code>grid-row<\/code> sia per <code>grid-column<\/code>, non bloccano i filler <code>&lt;b&gt;<\/code>).<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section5\">Perch\u00e9 \u00e8 utile?<\/h2>\n<p>Ho realizzato che pochi tra noi avranno bisogno di creare un layout che assomigli a quello del tabellone del tris, quindi potreste chiedervi perch\u00e9 dovremmo preoccuparcene. Potremmo non volere delle strutture a forma di hashtag (#), ma ci saranno dei casi in cui vorremo dare uno stile all&#8217;intera column track o evidenziare una riga.<\/p>\n<p>Dal momento che (per ora) CSS non offre un modo per assegnare direttamente uno stile alle celle, aree o track della griglia, dobbiamo allungare gli elementi lungo le parti a cui vogliamo assegnare uno stile indipendentemente dagli elementi che contengono il contenuto. C&#8217;\u00e8 <a href=\"https:\/\/github.com\/w3c\/csswg-drafts\/issues\/499\">una discussione riguardante l&#8217;aggiunta di questa capacit\u00e0<\/a> direttamente a CSS nel repository GitHub del Working Group, dove <em>voi<\/em> potete aggiungere i vostri pensieri e le vostre proposte.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section6\">Ma perch\u00e9 i <code>&lt;b&gt;<\/code>? Perch\u00e9?<\/h2>\n<p>Uso i <code>&lt;b&gt;<\/code> per le porzioni decorative del layout perch\u00e9 sono elementi puramente decorativi. Non c&#8217;\u00e8 contenuto da enfatizzare molto o da rendere in grassetto e semanticamente un <code>&lt;b&gt;<\/code> non \u00e8 n\u00e9 meglio n\u00e9 peggio di uno <code>&lt;span&gt;<\/code>. \u00c8 solo un hook a cui agganciare degli effetti visivi. Ed \u00e8 pi\u00f9 corto, quindi minimizza il page bloat (alcuni caratteri in pi\u00f9 non farebbero <em>tutta<\/em> sta differenza).<\/p>\n<p>Ancora pi\u00f9 in tema, la completa mancanza di significato semantico di <code>&lt;b&gt;<\/code> lo evidenzia subito nel markup come intenzionalmente non semantico. \u00c8, in questo senso meta, auto-documentante.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section7\">\u00c8 tutto quello che c&#8217;\u00e8?<\/h2>\n<p>C&#8217;\u00e8 un altro modo per ottenere questo preciso effetto: i background e i grid gap. Ha anch&#8217;esso i suoi svantaggi, ma vediamo prima come funziona. Per prima cosa, impostiamo uno sfondo nero al grid container e degli sfondi bianchi a ogni item nella griglia. Poi, usando <code>grid-gap: 1px<\/code>, facciamo apparire lo sfondo nero del container tra i grid item.<\/p>\n<pre id=\"snippet16\" class=\" language-markup\"><code class=\" language-markup\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>section<\/span> <span class=\"token attr-name\">id<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>ttt<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>1<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>2<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>3<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>4<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>5<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>6<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>7<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>8<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\t<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>9<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>section<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/code><\/pre>\n<pre id=\"snippet17\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">#ttt <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> grid<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-columns<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-rows<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> black<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-gap<\/span><span class=\"token punctuation\">:<\/span> 1px<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">#ttt &gt; div <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span> white<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Semplice e non c&#8217;\u00e8 bisogno di alcun filler <code>&lt;b&gt;<\/code>. Cosa non va?<\/p>\n<p>Il primo problema \u00e8 che se mai rimuoveste un item, ci sarebbe un grosso blocco nero nel layout. Magari va bene, ma \u00e8 pi\u00f9 probabile che non vada bene. Il secondo problema \u00e8 che i grid container, di default, non applicano \u201cshrink-wrap\u201d ai loro item. Al contrario, riempiranno l&#8217;elemento padre, come fanno i box block. Entrambe questi problemi sono illustrati nella Figura 6.<\/p>\n<div id=\"figure7\" class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/05\/background-problems.png\" border=\"0\" alt=\"Screenshot: quando manca una cella della griglia con la soluzione background e grid-gap, rimane un grosso box nero al suo posto. C'\u00e8 anche un box nero gigante che riepie il resto dello spazio alla destra delle celle della griglia.\" width=\"100%\" \/><\/p>\n<p>Figura 6: alcuni possibili problemi di background.<\/p>\n<\/div>\n<p>Potete usare del CSS extra per restringere la larghezza del grid container ma non si pu\u00f2 davvero evitare il background che appare dove manca un item.<\/p>\n<p>D&#8217;altro canto, questi problemi potrebbero trasformarsi in vantaggi se, invece di un background nero, volessimo mostrare un&#8217;immagine di background che faccia \u201cforare\u201d lo spazio ai grid item, come ha fatto Jen Simmons <a href=\"http:\/\/labs.jensimmons.com\/2016\/examples\/grid-content-1.html\">nella sua demo \u201cJazz At Lincoln Center Poster\u201d<\/a>.<\/p>\n<p>Un terzo problema nell&#8217;uso dei background \u00e8 quando volete semplicemente delle grid line solide rispetto a un background di pagina variegato e volete che quel background di mostri attraverso i grid item. In quel caso, i grid item (in questo caso, i <code>&lt;div&gt;<\/code>) devono avere i background trasparenti, il che impedisce l&#8217;uso di grid-gap per rivelare un colore.<\/p>\n<p>Se i <code>&lt;b&gt;<\/code> vi fanno <em>davvero<\/em> andare in fumo il cervelletto, potete usare al loro posto il contenuto generato. Quando generate gli pseudo-elementi before- e after-content, Grid li tratta come elementi effettivi e li fa diventare dei grid item. Quindi, usando il semplice markup usato nell&#8217;esempio precedente, potremmo scrivere questo CSS invece:<\/p>\n<pre id=\"snippet18\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">#ttt <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> grid<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-columns<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-rows<\/span><span class=\"token punctuation\">:<\/span> repeat(3,5em)<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">#ttt::before <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">grid-column<\/span><span class=\"token punctuation\">:<\/span> 1 \/ -1<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-row<\/span><span class=\"token punctuation\">:<\/span> 2<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">border-width<\/span><span class=\"token punctuation\">:<\/span> 1px 0<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">#ttt::after <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">grid-column<\/span><span class=\"token punctuation\">:<\/span> 2<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-row<\/span><span class=\"token punctuation\">:<\/span> 1 \/ -1<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">border-width<\/span><span class=\"token punctuation\">:<\/span> 0 1px<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>\u00c8 identico a quello con i filler <code>&lt;b&gt;<\/code>, tranne che qui gli elementi generati disegnano le grid line.<\/p>\n<p>Questo approccio funziona bene per ogni griglia 3&#215;3 come quella con cui ho giocato, ma andando oltre, si va sul complicato. Supponiamo di avere una griglia 5&#215;4 invece di una 3&#215;3. Usando i gradienti e le ripetizioni, possiamo disegnare quante linee desideriamo, al costo di rendere pi\u00f9 complicato il CSS.<\/p>\n<pre id=\"snippet19\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">#ttt <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> grid<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-columns<\/span><span class=\"token punctuation\">:<\/span> repeat(5,5em)<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-template-rows<\/span><span class=\"token punctuation\">:<\/span> repeat(4,5em)<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">#ttt::before <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">content<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"\"<\/span><span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-column<\/span><span class=\"token punctuation\">:<\/span> 1 \/ -1<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-row<\/span><span class=\"token punctuation\">:<\/span> 1 \/ -2<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span>\n\t\tlinear-gradient(to bottom,transparent 4.95em, 4.95em, black 5em)\n\t\ttop left \/ 5em 5em<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">#ttt::after <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">content<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">\"\"<\/span><span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-column<\/span><span class=\"token punctuation\">:<\/span> 1 \/ -2<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">grid-row<\/span><span class=\"token punctuation\">:<\/span> 1 \/ -1<span class=\"token punctuation\">;<\/span>\n\t<span class=\"token property\">background<\/span><span class=\"token punctuation\">:<\/span>\n\t\tlinear-gradient(to right,transparent 4.95em, 4.95em, black 5em)\n\t\ttop left \/ 5em 5em<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Questo funziona piuttosto bene, come mostrato in Figura 7, supponendo che facciate l&#8217;esercizio di assegnare le grid cell in maniera simile a come <a href=\"#snippet9\">abbiamo fatto nella #snippet9<\/a>.<\/p>\n<div id=\"figure8\" class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2018\/05\/generate-gradients.png\" border=\"0\" alt=\"Screenshot: una griglia 5 per 4 con i bordi distribuiti uniformemente a dividere le celle internamente usando i gradienti di background.\" width=\"100%\" \/><\/p>\n<p>Figura 7: elementi generati e gradienti di background<\/p>\n<\/div>\n<p>Questo approccio usa i gradienti linear per costruire immagini quasi interamente trasparenti che hanno solo 1\/20mo di un em di nero e poi ripetono quelli o verso destra o verso il basso. Il gradiente verso il basso (che crea linee orizzontali) viene fermato una gridline prima della fine del container, dal momento che altrimenti ci sarebbe una linea orizzontale sotto l&#8217;ultima riga di item. In maniera simile, il gradiente verso destra (che crea le linee verticali) si ferma una colonna prima del bordo a destra. Questo \u00e8 il motivo per cui ci sono i valori -2 per <code>grid-column<\/code> e <code>grid-row<\/code>.<\/p>\n<p>Uno svantaggio di questo \u00e8 lo stesso dell&#8217;approccio dei filler <code>&lt;b&gt;<\/code>: dal momento che gli elementi generati coprono la maggior parte del background, tutti gli item devono essere assegnati esplicitamente alle loro celle della griglia invece di lasciare che fluiscano automaticamente. L&#8217;unico modo per aggirare ci\u00f2 \u00e8 di usare qualcosa come la tecnica overgridding esplorata in precedenza. Potreste anche riuscire a eliminare gli elementi generati se fate l&#8217;overgridding, a seconda della specifica situazione.<\/p>\n<p>Un altro svantaggio \u00e8 che se mai dovesse cambiare il font size, la larghezza delle linee potrebbe cambiare. Mi aspetto che ci sia un modo per aggirare questo problema usando <code>calc()<\/code>, ma lascer\u00f2 alle vostre brillanti menti trovarlo e condividerlo con il mondo.<\/p>\n<p>La parte divertente per me \u00e8 che se <em>effettivamente<\/em> usate questo approccio basato sul gradiente, state riempiendo di immagini il background del container, mettendoci sopra degli item\u2026  Esattamente come facevamo con le Faux Columns.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section8\">Conclusioni<\/h2>\n<p>\u00c8 divertente come alcuni concetti si ripetano negli anni. Pi\u00f9 di un decennio fa, Dan Cederholm <a href=\"https:\/\/alistapart.com\/article\/fauxcolumns\">ci ha mostrato come creare l&#8217;effetto di colonne a tutta altezza<\/a> con le immagini di background. Ora io vi mostro come simulare box con colonne e righe a tutta altezza con degli elementi vuoti e, ove necessario, con le immagini di background.<\/p>\n<p>Col tempo, il trucco che sta dietro le Faux Columns \u00e8 caduto in disgrazia e il web design ha lasciato perdere quel tipo di effetto visuale. Forse lo stesso destino attende le Faux Grid Tracks, ma spero di vedere il sorgere di nuove capacit\u00e0 CSS che permettano questo tipo di effetto senza il bisogno di questi trucchi.<\/p>\n<p>Abbiamo superato cos\u00ec tanti dei nostri vecchi trucchi. Eccone un altro da usare finch\u00e9 ce n&#8217;\u00e8 bisogno e che spero un giorno ci potremo lasciare alle spalle.<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>L&#8217;unico modo per vincere \u00e8 giocare. Viaggiate con Eric Meyer attraverso i meccanismi interni di CSS Grid mentre testa varie tecniche per costruire un tabellone per il gioco del tris riempito con dei contenuti. Prestando attenzione alle fasi iniziali di CSS e di A List Apart, questi hack giocosi riattivano lo spirito della sperimentazione.<\/p>\n","protected":false},"author":818,"featured_media":7000839,"comment_status":"open","ping_status":"open","template":"","categories":[244,214],"tags":[],"coauthors":[304],"class_list":["post-832","article","type-article","status-publish","has-post-thumbnail","hentry","category-css","category-numero-235-28-novembre-2017"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/832","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article"}],"about":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/types\/article"}],"author":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/users\/818"}],"replies":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/comments?post=832"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000839"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=832"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=832"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=832"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=832"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}