{"id":668,"date":"2016-11-15T16:19:47","date_gmt":"2016-11-15T15:19:47","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/usare-css-mod-queries-con-range-selector\/"},"modified":"2016-11-15T16:19:47","modified_gmt":"2016-11-15T15:19:47","slug":"usare-css-mod-queries-con-range-selector","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/usare-css-mod-queries-con-range-selector\/","title":{"rendered":"Usare le CSS Mod Queries con i range selectors"},"content":{"rendered":"<p>Recentemente, mi \u00e8 stato chiesto di costruire una semplice lista che venisse visualizzata in una griglia, che sarebbe cominciata con un singolo elemento e sarebbe cresciuta durante il giorno, pur rimanendo ordinata, indipendentemente dalla sua lunghezza. Quindi, come si fa a volte quando si \u00e8 indaffarati con una cosa e ci viene chiesto di farne una completamente diversa, ho cercato di pensare ad una qualsiasi ragione per cui non si potesse fare, non ne ho trovate e ho distrattamente risposto \u201cS\u00ec\u201d.<\/p>\n<p>All&#8217;epoca, lavoravo al sito web di un&#8217;organizzazione che si occupa di notizie con sede a Londra. Avevamo passato l&#8217;anno precedente a migrare il loro CMS alla piattaforma Adobe AEM e al contempo stavamo implementando una UI responsive, entrambe grandi miglioramenti. Dal momento che quella fase era completa, stavamo cominciando a concentrarci sui dettagli della UI e sulla realizzazione di nuove feature. Il progetto di sviluppo era diviso tra un numero di piccoli team semi-autonomi. Il mio team si stava concentrando sulle pagine hub e io guidavo il lavoro sulla UI.<\/p>\n<p>Sostanzialmente, ogni pagina hub \u00e8 una lista di liste, messe l\u00ec semplicemente per aiutare i lettori a trovare dei contenuti che possano interessarli. Come potete immaginare, un sito web di news \u00e8 quasi esclusivamente fatto di liste di contenuto! Una pagina piena di liste verticali generiche non sarebbe di aiuto n\u00e9 tantomeno gradevole: volevamo che ai lettori piacesse scorrere il contenuto collegato alla loro sfera di interesse. Le sezioni dovevano essere distinte e le liste avrebbero dovuto essere sia distinguibili individualmente sia formare un tutto armonioso. In breve, la visualizzazione era cruciale per l&#8217;usabilit\u00e0 e l&#8217;efficacia dell&#8217;intera pagina.<\/p>\n<p>Quella \u201csemplice lista\u201d che ho detto che avrei creato sarebbe stata di alto profilo, posizionata nel suo pannello vicino al top della pagina hub, con lo scopo di sottolineare uno specifico punto di interesse. Cominciando con un item e crescendo durante tutto il giorno man mano che vengono pubblicati nuovi articoli, la lista doveva essere una griglia rettangolare piuttosto che una singola colonna e non aver mai degli item che avanzano nell&#8217;ultima riga. E non importa quanti elementi figlio contenga in un qualunque momento, deve rimanere ordinata e pulita perch\u00e9 dovrebbe apparire prima del fold. Ogni item dovrebbe essere pi\u00f9 o meno quadrato, con un primo item con larghezza impostata al 100%, i secondi due al 50% e tutti i seguenti item al 33%, sistemati in righe di tre. Improvvisamente, la mia semplice lista \u00e8 tutt&#8217;altro che semplice.<\/p>\n<p>Non tutti vogliono una griglia generica o uno stack di item identici: c&#8217;\u00e8 qualcosa di bello nel selezionare gli elementi prominenti, nel raggrupparli e nel terminare con grazia i fine riga. Questi stili possono essere \u201chard coded\u201d se sapete che la lista sar\u00e0 sempre di una lunghezza esatta, ma diventa pi\u00f9 difficile quando la lunghezza pu\u00f2 cambiare. In che modo posso garantire che quell&#8217;ultima riga rimanga in ordine quando ci sono meno di tre item?<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2016\/11\/listlayouts.jpg\" border=\"0\" alt=\"Varie sistemazioni dei list item che distruggono o meno il layout pianificato nella riga in fondo.\" width=\"100%\" \/> Il nostro layout pianificato si distruggerebbe visivamente man mano che si aggiungono item alla lista.<\/p>\n<p>Quando si \u00e8 trattato di costruire effettivamente questa cosa, ho realizzato che conoscere la lunghezza della lista non era molto utile. Siccome avevo adorato <a href=\"http:\/\/alistapart.com\/article\/quantity-queries-for-css\">l&#8217;eccellente articolo di Heydon Pickering sulle quantity queries per CSS<\/a>, ho supposto di poter scoprire la lunghezza della lista usando le QQ, poi di assegnarle uno stile di conseguenza e che tutto sarebbe andato bene.<\/p>\n<p>Ma dal momento che la mia lista avrebbe potuto essere di una qualsiasi lunghezza, avevo bisogno di un numero infinito di QQ per soddisfare le richieste! Non potevo fare una QQ per ogni eventualit\u00e0. Inoltre, giravano voci che prima o poi si sarebbe aggiunto un pulsante \u201cLoad More\u201d, permettendo agli utenti di aggiungere dinamicamente un&#8217;altra decina di item. Avevo bisogno di una soluzione diversa.<\/p>\n<p>Dopo un piccolo crollo nervoso, mi sono chiesto: <em>Cosa farebbe <a href=\"http:\/\/lea.verou.me\/\">Lea Verou<\/a>?<\/em> Beh, non andare in panico sarebbe un buon inizio. Inoltre, potrebbe essere utile semplificare e identificare i requisiti sottostanti. Dal momento che la lista sarebbe fondamentalmente composta da righe di tre elementi, avevo bisogno di sapere il resto della divisione mod 3.<\/p>\n<div class=\"paragrafo\">\n<h2 id=\"section1\">La \u201cmod\u201d query<\/h2>\n<p>Essere in grado di selezionare e assegnare stili agli elementi in base al numero di fratelli \u00e8 ottimo, ma c&#8217;\u00e8 di pi\u00f9 che la semplice lunghezza. In questo caso, sarebbe molto meglio sapere se la mia lista sia divisibile per un certo numero piuttosto che sapere quanto \u00e8 lunga.<\/p>\n<p>Sfortunatamente, non c&#8217;\u00e8 una mod query nativa in CSS, ma possiamo crearne una combinando due selettori: <code>:nth-child(3n)<\/code> (aka il selettore \u201cmodulo\u201d) e il selettore <code>:first-child<\/code>.<\/p>\n<p>La query seguente seleziona tutto se la lista \u00e8 divisibile per tre:<\/p>\n<pre id=\"snippet1\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">li:nth-last-child(3n):first-child,\nli:nth-last-child(3n):first-child ~ li <\/span><span class=\"token punctuation\">{<\/span> \n \u2026 selects everything in a list divisible by three \u2026 \n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2016\/11\/divisibleby3.jpg\" border=\"0\" alt=\"Quattro righe di list items (gatti nelle scatole). Le righe top e bottom sono selezionate (colore pieno, non ingrigite) perch\u00e9 ciascuna \u00e8 divisibile per 3.\" width=\"100%\" \/> Sono selezionate solo le righe divisibili per 3. <span class=\"codepen\">Vedi il Pen <a href=\"http:\/\/codepen.io\/clanceyp\/full\/vXEQPQ\/\">Using CSS Mod Queries with Range Selectors: Fig 2<\/a> di Patrick (<a href=\"http:\/\/codepen.io\/clanceyp\">@clanceyp<\/a>) su <a href=\"http:\/\/codepen.io\/\">CodePen<\/a>. Immagine del gatto di <a href=\"http:\/\/www.paperbirdpublishing.co.uk\/\">Paper Bird Publishing<\/a>.<\/span><\/p>\n<p>Esaminiamo quel codice. (Negli esempi, uso \u201cli\u201c per \u201clist item\u201d).<\/p>\n<p>Il selettore css:<\/p>\n<pre id=\"snippet2\"><code>li:nth-last-child(3n):first-child ~ li<\/code><\/pre>\n<p><strong>Seleziona tutti i sibling seguenti:<\/strong><\/p>\n<pre id=\"snippet3\"><code>... ~ li<\/code><\/pre>\n<p><strong>Il primo figlio (il primo \u201cli\u201c nell&#8217;elenco, in questo caso):<\/strong><\/p>\n<pre id=\"snippet4\"><code>...:first-child ...<\/code><\/pre>\n<p><strong>Ogni terzo item partendo dalla fine della lista:<\/strong><\/p>\n<pre id=\"snippet5\"><code>...:nth-last-child(3n):...<\/code><\/pre>\n<p>Questa combinazione in sostanza significa che se il primo figlio \u00e8 <code>3n<\/code> dalla fine, allora selezioni tutti i suoi sibling.<\/p>\n<p>La query seleziona tutti i sibling del primo item, ma non include il primo item stesso, perci\u00f2 dobbiamo aggiungere un selettore separatamente per questo.<\/p>\n<pre id=\"snippet6\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">li:nth-last-child(3n):first-child,\nli:nth-last-child(3n):first-child ~ li <\/span><span class=\"token punctuation\">{<\/span> \n\u2026 styles for list items in a list divisible by 3 \u2026  \n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<p>Guardate la demo e <a href=\"http:\/\/codepen.io\/clanceyp\/full\/amzQgE\/\">provatela!<\/a><\/p>\n<h2 id=\"section2\">Cosa succede coi resti?<\/h2>\n<p>Con la mia mod query, posso selezionare tutti gli item in un elenco se l&#8217;elenco \u00e8 divisibile per tre, ma dovr\u00f2 applicare stili diversi se ci sono dei resti. (Nel caso del reso 1, avr\u00f2 solo bisogno di contare alla rovescia nel CSS dal penultimo elemento invece che dall&#8217;ultimo. Posso fare ci\u00f2 semplicemente aggiungendo <code>+1<\/code> alla query.)<\/p>\n<pre id=\"snippet7\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">li:nth-last-child(3n+1):first-child,\nli:nth-last-child(3n+1):first-child ~ li <\/span><span class=\"token punctuation\">{<\/span> \n\u2026 styles for elements in list length, mod 3 remainder = 1 \u2026  \n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<p>Lo stesso vale per il resto 2: devo solo aggiungere <code>+2<\/code> alla query.<\/p>\n<pre id=\"snippet8\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">li:nth-last-child(3n+2):first-child,\nli:nth-last-child(3n+2):first-child ~ li <\/span><span class=\"token punctuation\">{<\/span> \n\u2026 styles for elements in list length, mod 3 remainder = 2 \u2026  \n<span class=\"token punctuation\">}<\/span> \n<\/code><\/pre>\n<h2 id=\"section3\">Creare un selettore di intervallo (range)<\/h2>\n<p>Adesso ho un modo per determinare se la lunghezza della lista \u00e8 divisibile per un qualsiasi numero, con o senza resto, ma ho ancora bisogno di selezionare un range. Cos\u00ec come per le mod query, non c&#8217;\u00e8 in CSS un selettore di range nativo, ma possiamo crearne uno combinando due selettori: <code>:nth-child(n)<\/code> (i.e., \u201ctutto ci\u00f2 che sta sopra\u201d) e <code>:nth-child(-n)<\/code> (i.e., \u201ctutto ci\u00f2 che sta sotto\u201d).<\/p>\n<p>Questo ci permette di selezionare gli item dal 3 al 5, inclusi:<\/p>\n<pre id=\"snippet9\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">li:nth-child(n+3):nth-child(-n+5)<\/span><span class=\"token punctuation\">{<\/span> \n... styles for items 3 to 5 inclusive ...\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2016\/11\/singlerow.jpg\" border=\"0\" alt=\"Una riga di sei list item (grafica dei gatti nelle scatole). I due a sinistra sono in scala di grigi, seguiti da tre gatti \u201cselezionati\u201d a colori e quello sulla destra \u00e8 grigio.\" width=\"100%\" \/> Abbiamo selezionato un range: i gatti 3, 4 e 5.<\/p>\n<p>Vero, si potrebbe ottenere lo stesso risultato in maniera altrettanto semplice con la sintassi <code>:nth-child(n)<\/code> e puntando direttamente alle posizioni dell&#8217;item &#8211; <code>li:nth-child(3), li:nth-child(4), li:nth-child(5){ ... }<\/code> &#8211; ma definire l&#8217;inizio e la fine di un range \u00e8 ovviamente molto pi\u00f9 versatile. Scomponiamo brevemente il selettore per vedere come funziona.<\/p>\n<p><strong>Seleziona tutti gli item fino al quinto item incluso:<\/strong><\/p>\n<pre id=\"snippet10\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">li:nth-child(n+3):nth-child(-n+5)<\/span><span class=\"token punctuation\">{<\/span> \u2026 <span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p><strong>Seleziona tutti gli item dal terzo in poi:<\/strong><\/p>\n<pre id=\"snippet11\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">li:nth-child(n+3):nth-child(-n+5)<\/span><span class=\"token punctuation\">{<\/span> \u2026 <span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>Combinando i due \u2014 <code>li:nth-child(n+3):nth-child(-n+5)<\/code> \u2014 si crea il selettore di range.<\/p>\n<p>Se osserviamo un esempio, potremmo avere una griglia di prodotti in cui i list item contengono un&#8217;immagine, il titolo e la descrizione. Supponiamo che l&#8217;immagine del prodotto parli da sola, cos\u00ec nella prima riga promuoviamo l&#8217;immagine e nascondiamo tutto il testo. Nella seconda e terza riga, mostriamo il titolo e l&#8217;immagine come una thumbnail, mentre nelle righe seguenti nascondiamo l&#8217;immagine e mostriamo il titolo e la descrizione su una singola riga.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2016\/11\/catstotext.jpg\" border=\"0\" alt=\"Una griglia con la grafica di tre gatti nella riga superiore, poi due righe di blocchi comprendenti ciascuno una grafica di un gatto e un titolo di prodotto, poi quattro righe, ciascuna elencante il testo del titolo del prodotto e i dettagli del prodotto.\" width=\"100%\" \/> Una griglia di prodotti per i nostri gatti. Abbiamo una grafica isolata nella riga superiore, piccole grafiche pi\u00f9 i titoli prodotto nella seconda e nella terza riga e poi perdiamo le grafiche e mostriamo solo il testo per le righe seguenti. <span class=\"codepen\">Vedi il Pen <a href=\"https:\/\/codepen.io\/clanceyp\/full\/ONdNoy\/\">Using CSS Mod Queries with Range Selectors: Fig 4<\/a> di Patrick (<a href=\"http:\/\/codepen.io\/clanceyp\">@clanceyp<\/a>) su <a href=\"http:\/\/codepen.io\/\">CodePen<\/a>.<\/span><\/p>\n<p>Usando il range selector, possiamo selezionare i primi tre, dal quarto al nono e dal decimo in poi. Questo ci permette di cambiare i range nei vari breakpoint nel CSS cos\u00ec la nostra griglia prodotto rimane bellina e responsive.<\/p>\n<h2 id=\"section4\">Note sui mixin SCSS<\/h2>\n<p>Dal momento che stavo usando un preprocessore CSS, ho semplificato il mio codice usando le funzioni di questo: ecco i mixin SCSS per la creazione di range selector e mod query.<\/p>\n<pre id=\"snippet12\" class=\" language-css\"><code class=\" language-css\">\/\/ range selector mixin\n<span class=\"token atrule\">@mixin select-range($start, $end)<\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token selector\">&amp;:nth-child(n+#<\/span><span class=\"token punctuation\">{<\/span>$start<span class=\"token punctuation\">}<\/span><span class=\"token selector\">):nth-child(-n+#<\/span><span class=\"token punctuation\">{<\/span>$end<span class=\"token punctuation\">}<\/span><span class=\"token selector\">)<\/span><span class=\"token punctuation\">{<\/span>\n   <span class=\"token atrule\">@content<\/span><span class=\"token punctuation\">;<\/span>\n   <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span>\n\/\/ mod query mixin\n<span class=\"token atrule\">@mixin mod-list($mod, $remainder)<\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token selector\">&amp;:nth-last-child(#<\/span><span class=\"token punctuation\">{<\/span>$mod<span class=\"token punctuation\">}<\/span><span class=\"token selector\">n+#<\/span><span class=\"token punctuation\">{<\/span>$remainder<span class=\"token punctuation\">}<\/span><span class=\"token selector\">):first-child,\n  &amp;:nth-last-child(#<\/span><span class=\"token punctuation\">{<\/span>$mod<span class=\"token punctuation\">}<\/span><span class=\"token selector\">n+#<\/span><span class=\"token punctuation\">{<\/span>$remainder<span class=\"token punctuation\">}<\/span><span class=\"token selector\">):first-child ~ li <\/span><span class=\"token punctuation\">{<\/span>\n    <span class=\"token atrule\">@content<\/span><span class=\"token punctuation\">;<\/span>\n    <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<p>Poi posso annidare i mixin nel mio codice.<\/p>\n<pre id=\"snippet13\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">li <\/span><span class=\"token punctuation\">{<\/span>\n<span class=\"token atrule\">@include mod-list(3, 0)<\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token atrule\">@include select-range(3, 5)<\/span><span class=\"token punctuation\">{<\/span>\n    \/\/ styles for items 3 to 5 in a list mod 3 remainder = 0\n    <span class=\"token punctuation\">}<\/span>\n  <span class=\"token punctuation\">}<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<p>Il che, se non altro, \u00e8 molto pi\u00f9 semplice da leggere!<\/p>\n<h2 id=\"section5\">Unire tutti i pezzi<\/h2>\n<p>Cos\u00ec, adesso che ho un piccolo arsenale di tool che mi aiutano a gestire i mod, i range e i range all&#8217;interno dei mod, posso staccarmi dall&#8217;implementazione standard di liste a lunghezza fissa o a layout fisso. L&#8217;uso creativo delle mod queries e dei selettori di range mi permette di applicare stili per cambiare il layout degli elementi.<\/p>\n<p>Tornando ai requisiti originali (far s\u00ec che la mia lista si comporti bene) \u00e8 stato subito chiaro che se avessi assegnato degli stili alla lista assumendo che fosse un multiplo di tre, allora ci sarebbero stati solo altri due use case da supportare:<\/p>\n<ul>\n<li>Mod 3, resto 1<\/li>\n<li>Mod 3, resto 2<\/li>\n<\/ul>\n<p>Se c&#8217;era un item rimanente, avrei fatto prendere tre item alla seconda riga (invece che i due di default), ma se il resto fosse stato 2, avrei fatto prendere due item alla terza riga (con il quarto e il quinto item al 50%).<\/p>\n<p>Alla fine, non mi servivano numerose query e le uniche di cui avevo bisogno in realt\u00e0 erano piuttosto semplici.<\/p>\n<p><em>C&#8217;era<\/em> un caso speciale: <em>cosa succede se la lista contiene solo due elementi?<\/em><\/p>\n<p>Ho risolto questo caso con una query per selezionare il secondo item quando \u00e8 anche l&#8217;ultimo figlio.<\/p>\n<pre id=\"snippet14\" class=\" language-css\"><code class=\" language-css\"><span class=\"token selector\">li:nth-child(2):last-child <\/span><span class=\"token punctuation\">{<\/span> \n... styles for the last item if it\u2019s also the second item ...\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<p>In fin dei conti, le queries non erano cos\u00ec difficili come mi aspettavo: avevo solo bisogno di combinare i selettori mod e range.<\/p>\n<pre id=\"snippet15\" class=\" language-css\"><code class=\" language-css\"><span class=\"token property\">li<\/span><span class=\"token punctuation\">:<\/span>nth-last-child(3n)<span class=\"token punctuation\">:<\/span>first-child <span class=\"token comment\">\/* mod query *\/<\/span> \n<span class=\"token selector\">~ li:nth-child(n+3):nth-child(-n+5)<\/span><span class=\"token punctuation\">{<\/span> <span class=\"token comment\">\/* range selector *\/<\/span>\n... styles for 3rd to 5th elements, in a list divisible by 3 ...\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<p>Alla fine, il mio CSS aveva pi\u00f9 o meno questo aspetto:<\/p>\n<pre id=\"snippet16\" class=\" language-css\"><code class=\" language-css\"><span class=\"token comment\">\/* \n  default settings for list (when its mod 3 remainder 0)\n  list items are 33% wide\n  except; the first item is 100% \n          the second and third are 50%\n*\/<\/span>\n<span class=\"token selector\">li <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">width<\/span><span class=\"token punctuation\">:<\/span> 33.33%<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token selector\">li:first-child <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">width<\/span><span class=\"token punctuation\">:<\/span> 100%<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token comment\">\/* range selector for 2nd and 3rd *\/<\/span>\n<span class=\"token selector\">li:nth-child(n+2):nth-child(-n+3)<\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">width<\/span><span class=\"token punctuation\">:<\/span> 50%<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token comment\">\/* overrides *\/<\/span>\n<span class=\"token comment\">\/* mod query override, check for mod 3 remainder = 1 *\/<\/span>  \n<span class=\"token selector\">li:nth-last-child(3n+1):first-child ~ li:nth-child(n+2):nth-child(-n+3) <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">width<\/span><span class=\"token punctuation\">:<\/span> 33.33%<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/* override default 50% width for 2nd and 3rd items *\/<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token comment\">\/* mod query override, check for mod 3 remainder = 2 *\/<\/span> \n<span class=\"token selector\">li:nth-last-child(3n+2):first-child ~ li:nth-child(n+4):nth-child(-n+5) <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">width<\/span><span class=\"token punctuation\">:<\/span> 50%<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/* override default 33% width for 4th and 5th items *\/<\/span>\n<span class=\"token punctuation\">}<\/span>\n<span class=\"token comment\">\/* special case, list contains only two items *\/<\/span>\n<span class=\"token selector\">li:nth-child(2):last-child <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">margin-left<\/span><span class=\"token punctuation\">:<\/span> 25%<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n<\/code><\/pre>\n<div class=\"paragrafo\">\n<h2 id=\"section6\">Sperimentate da soli (e una nota sul supporto dei browser)<\/h2>\n<p>Le mod queries e i selettori di range usati in questo articolo si basano sui selettori CSS3, quindi funzioneranno in <a href=\"http:\/\/css3test.com\/#css3-selectors\">tutti i browser moderni che supportano CSS3<\/a>, incluso Internet Explorer dal 9 in poi (ma ricordate, IE si aspetta una doctype valida).<\/p>\n<p>Ho creato <a href=\"http:\/\/www.modqueries.com\/\">un piccolo mod query generator<\/a> che potete usare per sperimentare con le mod queries.<\/p>\n<p>Quando mi sono imbattuto per la prima volta nelle QQ ho pensato che fossero grandiose ed interessanti ma perlopi\u00f9 teoriche, senza molti use-case pratici nel mondo reale. Tuttavia, con l&#8217;uso da mobile che ha battuto quello da desktop e con il responsive design che \u00e8 ormai la norma, il bisogno di mostrare liste, puntare a parti di liste a seconda della lunghezza\/mod e mostrare liste in maniera diversa a diversi breakpoint \u00e8 diventato molto pi\u00f9 comune. Tutto questo porta davvero all&#8217;applicazione pratica delle QQ e sto scoprendo sempre di pi\u00f9 che esse sono una parte essenziale del toolkit dello sviluppatore di UI.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2 id=\"section7\">Risorse aggiuntive<\/h2>\n<ul>\n<li><a href=\"http:\/\/alistapart.com\/article\/quantity-queries-for-css\">\u201cQuantity Queries for CSS\u201d<\/a><\/li>\n<li><a href=\"http:\/\/www.modqueries.com\/\">modqueries.com<\/a><\/li>\n<li><a href=\"https:\/\/css-tricks.com\/examples\/nth-child-tester\">:nth Tester<\/a><\/li>\n<li><a href=\"http:\/\/www.quantityqueries.com\/\">quantityqueries.com\/<\/a><\/li>\n<li><a href=\"http:\/\/nth-test.com\/\">Nth-Test<\/a><\/li>\n<li><a href=\"http:\/\/lea.verou.me\/demos\/nth.html\">CSS3 structural pseudo-class selector tester<\/a><\/li>\n<li><a href=\"http:\/\/caniuse.com\/#feat=css-sel3\">Can I use\u2026 Support tables for HTML5, CSS3, etc.<\/a><\/li>\n<li><a href=\"https:\/\/www.smashingmagazine.com\/2015\/07\/constructing-css-quantity-queries-on-the-fly\/\">Constructing CSS Quantity Queries On The Fly<\/a><\/li>\n<li><a href=\"http:\/\/alistapart.com\/article\/understandingprogressiveenhancement\">Understanding Progressive Enhancement<\/a><\/li>\n<li><a href=\"https:\/\/www.w3.org\/TR\/css3-roadmap\/\">CSS Snapshot 2015<\/a><\/li>\n<li><a href=\"http:\/\/css3test.com\/#css3-selectors\">The CSS3 Test<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Quando accettate distrattamente di fare qualcosa che poi realizzate di non saper davvero come fare, cosa fate? Andate un attimo in panico e vi mettete al lavoro. Patrick Clancey se ne esce con un piccolo arsenale di tool che lo aiutano a gestire i mod, range e range all&#8217;interno di mod, permettendogli di allontanarsi dall&#8217;implementazione standard delle liste con lunghezza fissa o layout fisso.<\/p>\n","protected":false},"author":818,"featured_media":7000811,"comment_status":"open","ping_status":"open","template":"","categories":[244,159],"tags":[],"coauthors":[490],"class_list":["post-668","article","type-article","status-publish","has-post-thumbnail","hentry","category-css","category-numero-181-15-novembre-2016"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/668","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=668"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000811"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=668"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=668"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=668"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=668"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}