{"id":696,"date":"2017-01-31T15:58:20","date_gmt":"2017-01-31T14:58:20","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/imparare-dal-lego-un-passo-avanti-nel-modular-web-design\/"},"modified":"2017-01-31T15:58:20","modified_gmt":"2017-01-31T14:58:20","slug":"imparare-dal-lego-un-passo-avanti-nel-modular-web-design","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/imparare-dal-lego-un-passo-avanti-nel-modular-web-design\/","title":{"rendered":"Imparare dal Lego: un passo avanti nel modular web design"},"content":{"rendered":"<p>Con centinaia di framework e UI kit, stiamo assemblando ogni tipo di blocchi di contenuto per creare pagine web. Tuttavia, una tale modularit\u00e0 e versatilit\u00e0 non \u00e8 ancora stata raggiunta a livello degli elementi web. Imparando dal Lego, possiamo spingere il web design modulare un passo pi\u00f9 in l\u00e0.<\/p>\n<p>Il modular atomic design \u00e8 in giro da un po&#8217;. Concettualmente, lo amiamo tutti: i componenti web dovrebbero essere versatili e riutilizzabili. Dovremmo essere in grado di posizionarli come mattoni, incastrandoli in qualsivoglia maniera senza preoccuparsi di cambiare alcunch\u00e9 nel codice.<\/p>\n<p>Finora, l&#8217;abbiamo fatto a livello del blocco di contenuto: ogni blocco occupa un&#8217;intera riga, ha una larghezza consistente ed \u00e8 self-contained. Adesso, siamo in grado di assemblare diversi blocchi per realizzare pagine web senza dover considerare gli stili e gli elementi all&#8217;interno di ciascun blocco. \u00c8 un grande passo in avanti e ha portato all&#8217;esplosione di framework e UI kit, rendendo il design delle pagine web modulare e anche pi\u00f9 accessibile alle masse.<\/p>\n<p>Ottenere una simile modularit\u00e0 a livello dell&#8217;elemento web non \u00e8 cos\u00ec semplice. <a href=\"http:\/\/patternlab.io\/\">Pattern Lab<\/a> dice che dovremmo essere in grado di mettere i pattern UI uno all&#8217;interno dell&#8217;altro come le matrioske. Ma, pensando alle matrioske, ogni layer ha il suo spessore, l&#8217;equivalente di padding e margin nel web design. Quando una matrioska a tre layer viene messa vicino a una matrioska a sette layer, lo spazio tra queste \u00e8 incostante. Mentre non \u00e8 un grande problema con le matrioske, sulle pagine web potrebbe portare o a un white space mal distribuito o a sovrascrivere pi\u00f9 livelli di CSS.<\/p>\n<p>Per anni, ho utilizzato <a href=\"http:\/\/getbootstrap.com\/\">Bootstrap<\/a> e <a href=\"http:\/\/foundation.zurb.com\/\">Foundation<\/a> e questo \u00e8 esattamente quello che succede quando cercavo di scrivere layout complessi all&#8217;interno di quei framework: righe annidate in colonne annidate in righe, piccoli elementi in elementi pi\u00f9 grandi, tutti con i propri padding e margin come le matrioske. Poi dovevo gestire i problemi di nesting, togliere il padding eccessivo su <code>first-<\/code> e <code>last-child<\/code>, calcolare, sovrascrivere, aggiungere commenti qua e l\u00e0.<\/p>\n<p>Non era la cosa pi\u00f9 carina che avrei potuto fare ai miei fogli di stile, ma era ancora tollerabile. Poi sono andata a lavorare in <a href=\"https:\/\/www.graphiq.com\/\">Graphiq<\/a>, una knowledge company che realizza data visualization su pi\u00f9 di 700 argomenti diversi. Qui, ai content editor \u00e8 permesso inserire qualsiasi dato vogliano, in qualunque formato vogliano, per creare la miglior esperienza possibile per i propri lettori. Tale flessibilit\u00e0 ha senso per le piccole startup e noi abbiamo un&#8217;interfaccia drag-and-drop che aiuta ad organizzare tutto da un singolo data point a infografiche e grafici, a colonne, blocchi e card. I content editor possono anche aggiungere logica al layout della pagina. Due grafici a barre uno accanto all&#8217;altro potrebbero finire in strutture HTML piuttosto diverse. Come potete immaginare, questo livello di versatilit\u00e0 risulta spesso in un inferno di styling per i designer e i developer. Sebbene una soluzione davvero promettente, <a href=\"https:\/\/drafts.csswg.org\/css-grid\/\">CSS Grid Layout<\/a>, sia all&#8217;orizzonte, non \u00e8 ancora approdata in Chrome. E potrebbero volerci anni per noi per adattarci completamente a un nuovo attributo <code>display<\/code>. Questo mi ha portato a pensare che se possiamo cambiare la mentalit\u00e0 matrioska, possiamo fare un altro passo avanti verso il design modulare con gli strumenti che abbiamo a disposizione.<\/p>\n<div class=\"paragrafo\">\n<h2 id=\"section2\">Imparare dal Lego<\/h2>\n<p>Per trovare una metafora migliore, sono tornata al Lego, l&#8217;epitomo del modular atomic design. \u00c8 saltato fuori che non dobbiamo mai preoccuparci di padding e margin quando \u201cannidiamo\u201d una piccola struttura Lego in una grande struttura Lego e poi in una struttura Lego ancora pi\u00f9 grande. In effetti, non c&#8217;\u00e8 un concetto simile al \u201cnesting\u201d nel Lego. Tutti gli elementi sembrano vivere allo stesso livello, non su layer multipli.<\/p>\n<p>Ma questo cosa significa per il web design? Noi dobbiamo annidare gli elementi web per la struttura semantica e per selezionare facilmente. Non sto dicendo che dovremmo cambiare le nostre strutture HTML, ma nei nostri fogli di stile potremmo mettere la spaziatura solo sugli elementi web di livello pi\u00f9 basso (o \u201catomi\u201d per citare la terminologia dell&#8217;atomic design) e non i molti layer che si trovano in mezzo.<\/p>\n<p>Date uno sguardo alla parte superiore di ogni singolo mattoncino Lego. Se immaginate che lo spazio attorno l&#8217;esterno dei piroli sia il padding di un elemento web e tutto quello che sta all&#8217;interno del padding sia il contenuto, scoprirete che tutti i mattoncini Lego hanno un padding consistente attorno al contenuto, che \u00e8 esattamente la met\u00e0 dello spazio tra gli elementi.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/01.jpg\" border=\"0\" alt=\"Mattoncini Lego visti dall'alto con i piroli che rappresentano il contenuto del box e il padding evidenziato per mostrare la sua larghezza consistente indipendentemente dal numero di piroli che ci sono su un mattoncino\" width=\"100%\" style=\"border: 0px;\" \/> Non importa quanti piroli abbia un mattoncino: il padding attorno a questi \u00e8 lo stesso che c&#8217;\u00e8 su ogni altro Lego.<\/p>\n<p>E quando si mettono assieme i mattoncini Lego, tutti gli elementi avranno tra loro lo stesso gutter.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/02.jpg\" border=\"0\" alt=\"Un rettangolo di mattoncini Lego visti dall'alto, ognuno dei quali con una sottile riga tra i piroli e il padding\" width=\"100%\" style=\"border: 0px;\" \/> Il padding si estende dal punto pi\u00f9 esterno dei piroli di un mattoncino al punto pi\u00f9x esterno dei piroli del mattoncino vicino.<\/p>\n<p>Non serve altro padding o margin: gli spazi si formano naturalmente. Tutti gli elementi, non importa quanto siano annidati profondamente, appaiono sullo stesso livello e non servono altre sovrascritture CSS o aggiustamenti, nemmeno i reset di <code>first-<\/code> e <code>last-child<\/code>.<\/p>\n<p>Mettendo tutto questo nel codice, possiamo creare una class che aggiunga la spaziatura half-gutter e applicarla a tutti gli elementi web di livello pi\u00f9 basso sulla pagina. Poi possiamo rimuovere tutta la spaziatura sui <code>div<\/code> strutturali come <code>.row<\/code> e <code>.col<\/code>.<\/p>\n<pre id=\"snippet1\" class=\"  language-css\"><code class=\"\u201c\u201d  language-css\"><span class=\"token selector\">$gutter: 20px;\n.element <\/span><span class=\"token punctuation\">{<\/span>\n\t <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> $gutter \/ 2<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Una piccolissima modifica di cui essere consapevoli \u00e8 che quando il padding \u00e8 solo su <code>.element<\/code>, il padding tra gli elementi pi\u00f9 esterni e il <code>div<\/code> padre dovr\u00e0 essere solo la met\u00e0 del gutter.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/03.jpg\" border=\"0\" alt=\"Rettangolo bianco che rappresenta l'assemblaggio completo dei mattoncini della figura precedente con rettangoli grigi rappresentanti l'area occupata dai piroli, che mostra che il padding crea dei gutter a dimensione intera tra le aree dei piroli ma solo met\u00e0 gutter attorno al margine esterno.\" width=\"100%\" \/> Il margine esterno \u00e8 solo la met\u00e0 del gutter, per ora.<\/p>\n<p>Dobbiamo aggiungere lo stesso padding anche al container pi\u00f9 esterno.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/04.jpg\" border=\"0\" alt=\"Le aree dei piroli mostrati come rettangoli grigi attorno al rettangolo bianco che rappresentano l'assemblaggio completo, i bordi fra i mattoncini sono mostrati come linee nere e la linea rosa extra attorno al bordo pi\u00f9 esterno mostra il padding aggiunto.\" width=\"100%\" \/> Il container pi\u00f9 esterno con met\u00e0 gutter aggiunto tutto intorno.<\/p>\n<pre id=\"snippet2\" class=\"  language-css\"><code class=\"\u201c\u201d  language-css\"><span class=\"token selector\">$gutter: 20px;\n.container,\n.element <\/span><span class=\"token punctuation\">{<\/span>\n\t<span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> $gutter \/ 2<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>E tutto ci\u00f2 risulter\u00e0 in questo:<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/05.jpg\" border=\"0\" alt=\"Rettangolo bianco con rettangoli grigi e padding consistente tra e attorno ad essi.\" width=\"100%\" \/> Con l&#8217;aggiunta del padding pi\u00f9 esterno, tutto il padding sembra uguale.<\/p>\n<p>Pensate a quanti layer di sovrascrittura avremmo bisogno per creare questo layout con l&#8217;attuale mentalit\u00e0 a righe e colonne. Il meglio che possiamo fare probabilmente \u00e8 qualcosa cos\u00ec:<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/06.jpg\" border=\"0\" alt=\"Diagramma che rappresenta la precedente disposizione del rettangolo di mattoncini Lego sistemato in righe e colonne.\" width=\"100%\" \/> Lo stesso layout con righe e colonne.<\/p>\n<p>E nel codice: <a href=\"http:\/\/codepen.io\/moyicat\/pen\/zKYzLp\">Vedi su Codepen<\/a>.<\/p>\n<p>Con la mentalit\u00e0 Lego, la spaziatura e il codice possono essere molto pi\u00f9 semplici, come mostrato nei due esempi sottostanti:<\/p>\n<p>Esempio con div: <a href=\"http:\/\/codepen.io\/moyicat\/pen\/ORLKXR\">Vedi su Codepen<\/a>.<\/p>\n<p>Esempio con Flexbox: <a href=\"http:\/\/codepen.io\/moyicat\/pen\/qaWPba\">Vedi su Codepen<\/a>.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section3\">Pi\u00f9 flessibile del Lego<\/h2>\n<p>Il Lego \u00e8 davvero una soluzione adatta a tutto. Con il Lego, non dobbiamo modificare leggermente il padding dei mattoncini a seconda dei nostri progetti e non possiamo avere padding orizzontali e verticali diversi. Il web design ci offre molte pi\u00f9 variazioni in quest&#8217;area.<\/p>\n<p>Invece di impostare un unico valore come il gutter, possiamo impostare quattro variabili diverse e ottenere un layout pi\u00f9 flessibile in questo modo:<\/p>\n<pre id=\"snippet3\" class=\"  language-css\"><code class=\"\u201c\u201d  language-css\"><span class=\"token selector\">$padding-x: 10px;\n$padding-y: 20px;\n$padding-outer-x: 40px;\n$padding-outer-y: 30px;\n\n.container <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> $padding-outer-y $padding-outer-x<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">.element <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> ($padding-y \/ 2) ($padding-x \/ 2)<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Il risultato ha questo aspetto:<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/07.jpg\" border=\"0\" alt=\"La stessa disposizione di rettangoli che rappresentano i mattoncini, ma con valori diversi per i padding x e y.\" width=\"100%\" \/> A differenza dei pezzi Lego reali, possiamo impostare diversi valori per il padding.<\/p>\n<p>\u00c8 ancora modulare, ma ha anche spazi variabili per creare uno stile pi\u00f9 dinamico.<\/p>\n<p>Con il responsive design, potremmo anche volere spaziature diverse per media query diverse. Possiamo spingere questo approccio un passo pi\u00f9 in l\u00e0 e scrivere la logica in un mixin <a href=\"http:\/\/sass-lang.com\/\">Sass<\/a> (in alternativa, potete farlo anche con <a href=\"http:\/\/lesscss.org\/\">LESS<\/a>):<\/p>\n<pre id=\"snippet4\" class=\"  language-css\"><code class=\"\u201c\u201d  language-css\"><span class=\"token atrule\">@mixin layout ($var) <\/span><span class=\"token punctuation\">{<\/span>\n\n  <span class=\"token selector\">$padding-x: map-get($var, padding-x);\n  $padding-y: map-get($var, padding-y);\n  $padding-outer-x: map-get($var, padding-outer-x);\n  $padding-outer-y: map-get($var, padding-outer-y);\n\n  .container <\/span><span class=\"token punctuation\">{<\/span>\n    <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> $padding-outer-y $padding-outer-x<span class=\"token punctuation\">;<\/span>\n  <span class=\"token punctuation\">}<\/span>\n  <span class=\"token selector\">.element <\/span><span class=\"token punctuation\">{<\/span>\n    <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> ($padding-y \/ 2) ($padding-x \/ 2)<span class=\"token punctuation\">;<\/span>\n  <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<p>Usando questo mixin, possiamo inserirgli diverse mappature di spaziature per generare regole CSS per differenti media query:<\/p>\n<pre id=\"snippet5\" class=\"  language-css\"><code class=\"\u201c\u201d  language-css\">\/\/ Variabili di spaziatura\n$<span class=\"token property\">spacing<\/span><span class=\"token punctuation\">:<\/span> (\n  <span class=\"token property\">padding-x<\/span><span class=\"token punctuation\">:<\/span> 10px,\n  <span class=\"token property\">padding-y<\/span><span class=\"token punctuation\">:<\/span> 20px,\n  <span class=\"token property\">padding-outer-x<\/span><span class=\"token punctuation\">:<\/span> 40px,\n  <span class=\"token property\">padding-outer-y<\/span><span class=\"token punctuation\">:<\/span> 30px\n)<span class=\"token punctuation\">;<\/span>\n$<span class=\"token property\">spacing-tablet<\/span><span class=\"token punctuation\">:<\/span> (\n  <span class=\"token property\">padding-x<\/span><span class=\"token punctuation\">:<\/span> 5px,\n  <span class=\"token property\">padding-y<\/span><span class=\"token punctuation\">:<\/span> 10px,\n  <span class=\"token property\">padding-outer-x<\/span><span class=\"token punctuation\">:<\/span> 20px,\n  <span class=\"token property\">padding-outer-y<\/span><span class=\"token punctuation\">:<\/span> 15px\n)<span class=\"token punctuation\">;<\/span>\n\n\n\/\/ Genera regole CSS di default\n<span class=\"token atrule\">@include layout($spacing)<\/span><span class=\"token punctuation\">;<\/span>\n\n\n\/\/ Genera regole CSS per la visualizzazione tablet\n<span class=\"token atrule\">@media (max-width: 768px) <\/span><span class=\"token punctuation\">{<\/span> \n  <span class=\"token atrule\">@include layout($spacing-tablet)<\/span><span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>E in maniera altrettanto semplice, tutti i nostri elementi avranno ora una spaziatura diversa nella vista desktop e in quella tablet.<\/p>\n<p>Esempio live: <a href=\"http:\/\/codepen.io\/moyicat\/pen\/wzabao\">Vedi su Codepen<\/a>.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section4\">Discussione<\/h2>\n<p>Dopo aver usato questo metodo per quasi un anno, mi sono imbattuta in alcune domande frequenti e casi limite che vorrei affrontare.<\/p>\n<h3 id=\"section5\">Background e border<\/h3>\n<p>Quando aggiungete background e border agli elementi web, non applicateli al <code>div<\/code> <code>.element<\/code>. Il background coprir\u00e0 sia il contenuto sia le aree di padding dell&#8217;elemento, quindi romper\u00e0 la griglia visivamente in questo modo:<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/08.jpg\" border=\"0\" alt=\"Rettangoli grigi con padding bianco, con nuo dei rettangoli e i suoi padding rimpiazzati da una immagine.\" width=\"100%\" \/> Un background applicato a <code>.element<\/code> rompe la griglia.<\/p>\n<p>Al contrario, applicate il background al <code>div<\/code> figlio all&#8217;interno del <code>div<\/code> <code>.element<\/code>:<\/p>\n<pre id=\"snippet6\" class=\"  language-markup\"><code class=\"\u201c\u201d  language-markup\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>element<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">style<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>background-image:url();<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>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/09.jpg\" border=\"0\" alt=\"Rettangoli grigi con padding bianco, con uno dei rettangoli sostituito da un'immagine.\" width=\"100%\" \/> Un <code>div<\/code> figlio contiene l&#8217;immagine, cos\u00ec non si rompe la griglia.<\/p>\n<p>Ho usato questa struttura in tutti i miei esempi precedenti.<\/p>\n<p>In maniera simile, il border va attorno al padding nel box model, cos\u00ec dovremmo applicare anche il border dell&#8217;elemento a un <code>div<\/code> figlio per mantenere la corretta spaziatura.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/10.jpg\" border=\"0\" alt=\"Rettangolo bianco con bordi blu attorno alle aree di contenuto.\" width=\"100%\" \/> Come con il background, applicate il bordo a un <code>div<\/code> figlio.<\/p>\n<h3 id=\"section6\">Elementi full row<\/h3>\n<p>Un&#8217;altra questione comune si ha quando occasionalmente vogliamo degli elementi full row, concettualmente cos\u00ec:<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/11.jpg\" border=\"0\" alt=\"Un rettangolo grigio orizzontale con le parole Title Here sopra a un rettangolo bianco che contiene dei rettangoli grigi pi\u00f9 piccoli.\" width=\"100%\" \/> A volte vogliamo interrompere la griglia con degli elementi a riga intera.<\/p>\n<p>Per assegnare degli stili agli elementi riga seguendo la struttura di <code>.container<\/code> e <code>.element<\/code>, dobbiamo usare il margin negativo:<\/p>\n<pre id=\"snippet7\" class=\"  language-css\"><code class=\"\u201c\u201d  language-css\"><span class=\"token selector\">.element-full-row <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">margin<\/span><span class=\"token punctuation\">:<\/span> 0 (-$padding-outer-x)<span class=\"token punctuation\">;<\/span>\n  <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> ($padding-y \/ 2) ($padding-x \/ 2 + $padding-outer-x)<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Notate che dobbiamo aggiungere di nuovo il <code>$padding-outer-x<\/code> al padding, cos\u00ec che il contenuto in <code>.element-full-row<\/code> sia allineato al contenuto in <code>.element<\/code>.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/12.jpg\" border=\"0\" alt=\"Un rettangolo grigio orizzontale con le parole Title Here sopra a un rettangolo bianco che contiene dei rettangoli grigi pi\u00f9 piccoli e una linea tratteggiata che mostra in che modo le parole si allineino a sinistra con i rettangoli piccoli pi\u00f9 a sinistra.\" width=\"100%\" \/> Il contenuto di <code>.element-full-row<\/code> si allinea con il contenuto di <code>.element<\/code> align.<\/p>\n<p>Il codice di prima gestisce la spaziatura orizzontale e la stessa logica pu\u00f2 essere applicata anche per sostituire la spaziatura verticale (come mostrato nell&#8217;esempio sopra: l&#8217;elemento header sostituisce il padding superiore). Possiamo aggiungere anche un margine negativo molto facilmente nei nostri fogli di stile.<\/p>\n<pre id=\"snippet8\" class=\"  language-css\"><code class=\"\u201c\u201d  language-css\"><span class=\"token selector\">.element-full-row:first-child <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">margin<\/span><span class=\"token punctuation\">:<\/span> (-$padding-outer-y) (-$padding-outer-x) 0<span class=\"token punctuation\">;<\/span>\n  <span class=\"token property\">padding<\/span><span class=\"token punctuation\">:<\/span> ($padding-y \/ 2 + $padding-outer-y) ($padding-x \/ 2 + $padding-outer-x) ($padding-y \/ 2)<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Potete applicarla come regola standalone o includerla nel mixin Sass o LESS, poi non dovrete pi\u00f9 preoccuparvene.<\/p>\n<h3 id=\"section7\">Annidamento<\/h3>\n<p>La libert\u00e0 completa nell&#8217;annidamento \u00e8 quello in cui eccelle questo metodo CSS Lego. Tuttavia, c&#8217;\u00e8 un tipo di annidamento che non possiamo fare: non possiamo annidare un <code>.element<\/code> all&#8217;interno di un <code>.element<\/code>. Questo creerebbe un padding doppio e la ragion d&#8217;essere di questo metodo andrebbe persa. Questo \u00e8 il motivo per cui si dovrebbe applicare la class <code>.element<\/code> solo agli elementi web di livello pi\u00f9 basso (o \u201catomi\u201d per usare la terminologia dell&#8217;atomic design) come un pulsante, una input box, una text box, un&#8217;immagine, etc.<\/p>\n<p>Prendiamo in considerazione questa comment box molto generica.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/13.jpg\" border=\"0\" alt=\"Comment box generica con titolo, text area, helper text e button.\" width=\"100%\" \/><\/p>\n<p>Invece di trattarla come un singolo \u201celemento\u201d, dobbiamo trattarla come un gruppo pre-definito di elementi (titolo, textarea, button e helper text):<\/p>\n<pre id=\"snippet9\" class=\"  language-markup\"><code class=\"\u201c\u201d  language-markup\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>comment<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>h3<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>comment-title element<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>Add a new comment<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>h3<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>textarea<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>element<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>textarea<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>clearfix<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n     <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>float-left<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n       <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>element<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n         <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>button<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>btn-post<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>Post comment<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>button<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n       <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>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n     <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>float-right<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n       <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>helper-text element<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n         <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>i<\/span> <span class=\"token attr-name\">class<\/span><span class=\"token attr-value\"><span class=\"token punctuation\">=<\/span><span class=\"token punctuation\">\"<\/span>icon-question<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>i<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n           Some HTML is OK.\n       <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>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n   <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>div<\/span><span class=\"token punctuation\">&gt;<\/span><\/span><\/code><\/pre>\n<p>Poi, possiamo trattare <code>.comment<\/code> come un componente riutilizzabile o, nel contesto dell&#8217;atomic design, come una \u201cmolecola\u201d, che si comporter\u00e0 bene con altri componenti riutilizzabili scritti nella stessa maniera e potr\u00e0 essere raggruppata in strutture HTML di pi\u00f9 alto livello. E, indipendentemente da come le organizzerete, la spaziatura tra esse sar\u00e0 sempre corretta.<\/p>\n<h3 id=\"section8\">Altezze e layout variabili<\/h3>\n<p>Per la maggior parte di questo articolo, abbiamo usato lo stesso esempio di fitted row. Questo potrebbe portare alcuni a pensare che questo metodo funzioni solo per elementi con altezza e larghezza definiti.<\/p>\n<p>In realt\u00e0, \u00e8 pi\u00f9 versatile di cos\u00ec. Non importa in che modo gli elementi cambino in altezza e larghezza, lazy load, o float attorno, il padding simile al Lego assicura lo stesso spazio consistente tra gli elementi.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2017\/01\/14.jpg\" border=\"0\" alt=\"Il flow layout di Pinterest a 5 colonne.\" width=\"100%\" \/> Ho creato un rapido flow layout di Pinterest per dimostrare in che modo funziona questa mentalit\u00e0 con elementi fluidi e che cambiano.<\/p>\n<p><a href=\"http:\/\/codepen.io\/moyicat\/pen\/amoZXo\">Vedi su Codepen<\/a>.<\/p>\n<h3 id=\"section9\">Mantenimento<\/h3>\n<p>Alcuni tra voi potrebbero anche preoccuparsi dei costi di mantenimento. In effetti, ci vuole del tempo per apprendere questo nuovo metodo, ma una volta che si inizia ad adottare questa mentalit\u00e0 e a scrivere i CSS in questo modo, il mantenimento diventa estremamente semplice.<\/p>\n<p>Specialmente con i layout mixin, tutte le regole di spaziatura sono centralizzate e controllate da alcuni gruppi di variabili. Un singolo cambiamento nelle variabili verr\u00e0 propagato automaticamente a tutti gli elementi sulla pagina web.<\/p>\n<p>In confronto, potremmo dover cambiare padding e margin in 20 posti diversi con il vecchio metodo e poi dovremmo testare per essere sicuri che funzioni ancora tutto. Sarebbe un processo molto pi\u00f9 movimentato.<\/p>\n<h3 id=\"section10\">Grid layout<\/h3>\n<p>Infine, c&#8217;\u00e8 il Grid layout, che supporta layout molto complicati e annida in maniera molto pi\u00f9 graceful che i blocchi. Potreste pensare che si tratti di un lavoro piuttosto duro per un problema che va scomparendo.<\/p>\n<p>Mentre molte delle questioni di cui abbiamo parlato in questo articolo potrebbero sparire con Grid, potrebbero volerci degli anni perch\u00e9 Grid venga supportato dai browser. E poi, potrebbe volerci molto tempo perch\u00e9 la community acquisisca familiarit\u00e0 con il nuovo metodo e sviluppi delle best practice e dei framework attorno ad esso. Come Flex, \u00e8 gi\u00e0 supportato dalla maggior parte dei browser, ma \u00e8 ben lungi dall&#8217;essere ampiamente adottato.<\/p>\n<p>E dopo tutto, potrebbe volerci molto tempo per un tipico utente web per capire Grid e il suo funzionamento. In maniera simile richiederebbe a noi molto sviluppo tradurre lo user layout input in buon codice CSS Grid. Il vecchio metodo a colonne e righe \u00e8 molto pi\u00f9 semplice da capire e quando il nesting non \u00e8 un problema, potrebbe essere una buona soluzione per siti web che permettono agli utenti di fare delle configurazioni.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section11\">Conclusioni<\/h2>\n<p>Abbiamo cominciato ad implementare questo metodo in <a href=\"https:\/\/www.graphiq.com\/\">Graphiq<\/a> all&#8217;inizio del 2016. Dopo quasi un anno, lo adoriamo e crediamo sia il modo in cui dovremmo scrivere i layout web nel futuro. Man mano che facciamo il refactor di ogni pagina, stiamo cancellando centinaia di righe di vecchio codice CSS e rendendo i fogli di stile molto pi\u00f9 logici e molto pi\u00f9 semplici da leggere. Abbiamo anche molti meno bug nei layout e nelle spaziature rispetto a tutti i nostri refactor del passato. Ora, non importa come i nostri content editor decidano di annidare i loro data point, abbiamo molto poco di cui preoccuparci.<\/p>\n<p>Da quello che abbiamo visto questo \u00e8 un vero game changer nel modo in cui pensiamo ai nostri layout e come li trasformiamo in codice. Quando i componenti web sono flessibili come i mattoncini Lego fino a livello degli elementi, diventano molto pi\u00f9 versatili e facili da mantenere. Crediamo che questo sia il prossimo passo da fare nel web design modulare. Provatelo voi stessi: potrebbe cambiare il modo in cui scrivete le vostre pagine web.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u00c8 ora di riesaminare i giocattoli nella vostra scatola dei giochi concettuale. Quando capite come rendere modulari i web component fino al livello degli elementi, potete lasciare la metafora della matrioska e cominciare a visualizzare i blocchi di contenuto come mattoncini Lego. Samantha Zhang dice che \u00e8 una rivoluzione.<\/p>\n","protected":false},"author":818,"featured_media":0,"comment_status":"open","ping_status":"open","template":"","categories":[4,244,168],"tags":[],"coauthors":[498],"class_list":["post-696","article","type-article","status-publish","hentry","category-codice","category-css","category-numero-190-31-gennaio-2017"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/696","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=696"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=696"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=696"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=696"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=696"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}