{"id":556,"date":"2015-09-07T13:34:46","date_gmt":"2015-09-07T11:34:46","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/quantity-queries-per-css\/"},"modified":"2015-09-07T13:34:46","modified_gmt":"2015-09-07T11:34:46","slug":"quantity-queries-per-css","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/quantity-queries-per-css\/","title":{"rendered":"Quantity Queries per CSS"},"content":{"rendered":"<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2015\/09\/n115query 2.jpg\" border=\"0\" width=\"250px\" style=\"float: left;\" \/>Non odiate anche voi i documentari che alla fine non mantengono le promesse? Hanno titoli attraenti come <cite>Alla ricerca del Calamaro Gigante<\/cite> e vi stuzzicano con inquadrature sottomarine di forme misteriose e vi fanno vedere scienziati esaltati che indicano un non meglio precisato punto, laggi\u00f9 nel mare. Vi mettete comodi per guardare questo documentario, aguzzate la vista con sospetto, pensando \u201cSar\u00e0 meglio che io veda qualche calamaro o qualcuno di questo newtork ricever\u00e0 una lettera che non dimenticher\u00e0 facilmente.\u201d<\/p>\n<p>Ovviamente, dopo 90 minuti di interviste con pescatori annoiati, il presentatore \u00e8 costretto a concludere \u201cNo\u2026 no, non abbiamo trovato nessun calamaro gigante. Ma magari un giorno [orchestra suona musica maestosa].\u201d Grandioso. Volevate <cite>Alla ricerca di Nemo<\/cite> e invece vi hanno dato <cite>Non abbiamo trovato Nemo<\/cite>.<\/p>\n<p>Io non vi farei mai una cosa del genere, amici. Questa \u00e8 la vostra guida alla creazione di breakpoint di stile per quantit\u00e0 di elementi HTML, pi\u00f9 o meno come fate gi\u00e0 con le <code>@media<\/code> queries per le dimensioni della viewport. Non vi indirizzer\u00f2 verso specifiche fumose o a un vago pensiero di uno sviluppatore. Le creiamo <em>oggi<\/em>, con quello che CSS mette gi\u00e0 a nostra disposizione.<\/p>\n<div class=\"paragrafo\">\n<h2>Contenuto dinamico<\/h2>\n<p>Principalmente il <a href=\"http:\/\/www.abookapart.com\/products\/responsive-web-design\">Responsive web design<\/a> ruota attorno ad una variabile: lo spazio. Per testare i layout responsive, prendiamo una certa quantit\u00e0 di contenuto e vediamo a quale spazio si adatta bene. Il contenuto viene considerato una costante, lo spazio una variabile.<\/p>\n<p>La <code>@media<\/code> query \u00e8 la beniamina del responsive web design perch\u00e9 ci permette di inserire dei \u201cbreakpoints\u201d ovunque non funzioni pi\u00f9 la strategia di layout e andrebbe meglio un altro layout. Tuttavia, non sono solo le dimensioni della viewport che possono mettere sotto pressione lo spazio, ma anche la <em>quantit\u00e0<\/em> di contenuto.<\/p>\n<p>Proprio come i vostri utenti finali possono usare device con una moltitudine di dimensioni di schermo diverse, cos\u00ec i vostri content editor potranno aggiungere o rimuovere il contenuto. I content management systems servono proprio a questo. Ci\u00f2 rende due volte vecchi i mockup Photoshop delle pagine web: sono solo un&#8217;istantanea di un&#8217;unica viewport, con il contenuto in un unico stato.<\/p>\n<p>In questo articolo, delineer\u00f2 una tecnica per rendere CSS <em>quantity-aware<\/em> (consapevole della quantit\u00e0) utilizzando dei selettori formati ad hoc. In particolare, applicher\u00f2 questi selettori ad un problema classico: come alterare la visualizzazione delle voci di un menu di navigazione orizzontale quando ce ne sono troppe per andare bene nella modalit\u00e0 di layout iniziale, cio\u00e8, dimostrer\u00f2 come passare da un layout <code>display: table-cell<\/code> a un layout <code>display: inline-block<\/code> quando il numero delle voci del menu diventa \u201cmaggiore o uguale a 6\u201d.<\/p>\n<p>Non far\u00f2 affidamento su nessun JavaScript n\u00e9 su alcuna logica di template e il markup dell&#8217;elenco del menu rimarr\u00e0 senza attribuzione di class. Utilizzando solo CSS, la tecnica onora il principio di <a href=\"http:\/\/www.w3.org\/TR\/html-design-principles\/#separation-of-concerns\">separation of concerns<\/a> secondo il quale il contenuto (HTML) e la presentazione (CSS) hanno ruoli chiaramente definiti. Il layout \u00e8 affare del CSS e, ove possibile, solo del CSS.<\/p>\n<div class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2015\/09\/fig1_menu.png\" border=\"0\" alt=\"Confronto tra il layout della barra del menu iniziale per meno di sei voci di menu con il layout che ne ha sei o pi\u00f9\" width=\"100%\" \/><\/div>\n<p>La dimostrazione \u00e8 <a href=\"http:\/\/codepen.io\/heydon\/pen\/QwjGZp\">disponibile su CodePen<\/a> e vi far\u00f2 riferimento per tutto l&#8217;articolo.<\/p>\n<p>Per aiutarmi a illustrare questo requisito di quantit\u00e0, utilizzer\u00f2 in questo articolo dei grafici di calamari, che rappresenteranno gli elementi HTML. I calamari verdi con le spunte verdi rappresentano gli elementi che si abbinano al selettore CSS in questione, i calamari rossi con le croci sono gli elementi non selezionati e i calamari grigi denotano gli elementi che non esistono.<\/p>\n<div class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2015\/09\/fig2_squid.png\" border=\"0\" alt=\"Una legenda per i tre simboli dei calamari che verranno usati nei seguenti diagrammi. Un calamaro verde (per gli elementi selezionati), un calamaro rosso (per gli elementi non selezionati) e un calamaro grigio per gli elementi che non esistono\" width=\"100%\" \/><\/div>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Contare<\/h2>\n<p>La chiave per determinare la quantit\u00e0 di elementi in un dato contesto \u00e8 contarli. CSS non fornisce un&#8217;esplicita \u201cAPI per i conteggi\u201d ma possiamo risolvere lo stesso problema con una combinazione fantasiosa di selettori.<\/p>\n<h3>Contare fino a uno<\/h3>\n<p>Il selettore <code>:only-child<\/code> fornisce un mezzo per assegnare stili agli elementi se appaiono isolati. Sostanzialmente, ci permette di \u201cassegnare uno stile a tutti gli elementi figlio (child) di un particolare elemento, se contando questi figli (children) si ha 1 come totale\u201d.  A parte il suo compagno di scuderia <code>:only-of-type<\/code>, \u00e8 l&#8217;unico selettore semplice che pu\u00f2 essere descritto come \u201cquantity-based\u201d.<\/p>\n<p>Nell&#8217;esempio seguente, uso <code>:only-of-type<\/code> per aggiungere uno stile speciale a qualunque pulsante che sia il <em>solo<\/em> elemento del suo tipo tra gli elementi sibling (fratelli). D\u00f2 a questi pulsanti solitari un <code>font-size<\/code> maggiore perch\u00e9 la singolarit\u00e0 suggerisce importanza.<\/p>\n<pre id=\"snippet1\" class=\" language-css\"><code class=\" language-css\">\n<span class=\"token selector\">button <\/span><span class=\"token punctuation\">{<\/span> \n  <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 1.25em<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token selector\">button:only-of-type <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 2em<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<\/code><\/pre>\n<p>Ecco la parte cruciale: se cominciassi con un pulsante a cui assegno una dimensione del font maggiore, e aggiungessi pulsanti prima o dopo questo, <em>ciascun<\/em> pulsante adotterebbe come conseguenza una dimensione del font pi\u00f9 piccola. Lo stile di tutti gli elementi nell&#8217;insieme dipende da una soglia di quantit\u00e0 pari a due: se ci sono \u201cmeno di due\u201d elementi, viene assegnato il font size pi\u00f9 grande. Date un&#8217;occhiata ancora a tale codice con in mente la nozione \u201cmeno di due\u201d:<\/p>\n<pre id=\"snippet2\" class=\" language-css\"><code class=\" language-css\">\n<span class=\"token selector\">button <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 1.25em<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token selector\">button:only-of-type <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 2em<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<\/code><\/pre>\n<div class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2015\/09\/fig3_fewerthan.png\" border=\"0\" alt=\"La logica meno di due significa che un elemento selezionato (calamaro verde) diventa due elementi non selezionati (calamari rossi) quando viene aggiunto un elemento\" \/><\/div>\n<p>Se sembra pi\u00f9 naturale, potete ribaltare la logica CSS usando la <a href=\"http:\/\/css-tricks.com\/almanac\/selectors\/n\/not\/\">negazione<\/a> e rendendo la condizione \u201cpi\u00f9 di uno\u201d.<\/p>\n<pre id=\"snippet3\" class=\" language-css\"><code class=\" language-css\">\n<span class=\"token\">\/* \"More than one\" results in a smaller font size *\/<\/span>\n<span class=\"token selector\">button <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 2em<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<span class=\"token selector\">button:not(:only-of-type) <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">font-size<\/span><span class=\"token punctuation\">:<\/span> 1.25em<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<\/code><\/pre>\n<div class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2015\/09\/fig4_morethan.png\" border=\"0\" alt=\"La logica pi\u00f9 di uno significa che un elemento non selezionato (calamaro rosso) diventa due elementi selezionati (calamari verdi) quando viene aggiunto un elemento.\" \/><\/div>\n<h3>Quantit\u00e0<\/h3>\n<p>Assegnare stili agli elementi basandosi sulle soglie \u201cpi\u00f9 di uno\u201d e \u201cmeno di due\u201d \u00e8 un trucco interessante, ma un&#8217;interfaccia con \u201cquantity query\u201d flessibili dovrebbe accettare una qualunque quantit\u00e0, ossia, dovrei poter assegnare uno stile per ogni valore di <em>n<\/em> \u201cmaggiore o uguale a <em>n<\/em>\u201d. Allora potrei assegnare stili per valori \u201cmaggiori o uguali a 6\u201d nel nostro menu di navigazione.<\/p>\n<p>Con la prospettiva di raggiungere quest&#8217;ultimo obiettivo, cosa succederebbe se fossi in grado di assegnare stili a quantit\u00e0 discrete come \u201cesattamente 6 in totale\u201d o \u201cesattamente 745\u201d? Come potrei fare? Dovrei usare un selettore che mi permetta di attraversare insiemi di elementi di qualunque quantit\u00e0 nemerica.<\/p>\n<p>Fortunatamente, il <a href=\"http:\/\/css-tricks.com\/almanac\/selectors\/n\/nth-last-child\/\">selettore <code>:nth-last-child(n)<\/code><\/a> accetta il numero \u201c<em>n<\/em>\u201d, mettendomi nelle condizioni di contare degli insiemi di elementi a partire dalla <em>fine<\/em> dell&#8217;insieme fino all&#8217;inizio. Per esempio, <code>:nth-last-child(6)<\/code> seleziona il sesto elemento a partire dall&#8217;ultimo tra gli elementi sibling.<\/p>\n<p>Le cose si fanno interessanti quando concateno <code>:nth-last-child(6)<\/code> con <code>:first-child<\/code>, introducendo una seconda condizione. In questo caso, cerco qualsiasi elemento che sia <em>contemporaneamente<\/em> il sesto elemento dalla fine <em>e<\/em> il primo elemento.<\/p>\n<pre id=\"snippet4\" class=\" language-css\"><code class=\" language-css\">\n<span class=\"token selector\">li:nth-last-child(6):first-child <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token\">\/* green squid styling *\/<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<\/code><\/pre>\n<p>Se questo elemento esiste, la quantit\u00e0 di elementi dell&#8217;insieme <em>deve essere esattamente<\/em> 6. In maniera lievemente radicale, ho scritto del CSS che mi dice quanti elementi sto guardando.<\/p>\n<div class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2015\/09\/fig5_firstchild.png\" border=\"0\" alt=\"Dei sei calamari, il primo \u00e8 verde e il resto sono rossi. Il primo \u00e8 soggetto al selettore nth-last-child(6) cos\u00ec come al selettore first-child\" width=\"100%\" \/><\/div>\n<p>Tutto quello che rimane da fare \u00e8 sfruttare questo elemento chiave per assegnare gli stili agli elementi rimanenti nell&#8217;insieme. Per fare ci\u00f2, utilizzo il <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/General_sibling_selectors\">general sibling combinator<\/a>.<\/p>\n<div class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2015\/09\/fig6_firstchild_li.png\" border=\"0\" alt=\"Sei calamari verdi perch\u00e9 il primo calamaro verde \u00e8 combinato con il general sibling combinator che rende verdi tutti i calamari rossi che vengono dopo\" width=\"100%\" \/><\/div>\n<p>Se non avete familiarit\u00e0 con il general sibling combinator, il <code>- li<\/code> in <code>li:nth-last-child(6):first-child ~ li<\/code> significa \u201cqualsiasi elemento <code>li<\/code> ci sia dopo <code>li:nth-last-child(6):first-child<\/code>\u201d. Nell&#8217;esempio seguente, ciascuno degli elementi adotta il colore del font verde se ce ne sono <em>esattamente<\/em> sei in totale.<\/p>\n<pre id=\"snippet5\" class=\" language-css\"><code class=\" language-css\">\n<span class=\"token selector\">li:nth-last-child(6):first-child, \nli:nth-last-child(6):first-child ~ li <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">color<\/span><span class=\"token punctuation\">:<\/span> green<span class=\"token punctuation\">;<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<\/code><\/pre>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Maggiore o uguale a 6<\/h2>\n<p>Avere come target una quantit\u00e0 discreta, che sia 6, 19 o 653, non \u00e8 particolarmente utile perch\u00e9 \u00e8 una situazione troppo specifica. Sarebbe altrettanto inutile utilizzare delle larghezze discrete piuttosto che <code>min-width<\/code> o <code>maz-width<\/code> nelle nostre <code>@media<\/code> queries:<\/p>\n<pre id=\"snippet6\" class=\" language-css\"><code class=\" language-css\">\n<span class=\"token atrule\">@media screen and (width: 500px) <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token\">\/* styles for exactly 500px wide viewports *\/<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<\/code><\/pre>\n<p>Nel <a href=\"http:\/\/alistapart.com\/d\/415\/content-aware-navigation\/\">menu di navigazione<\/a> voglio davvero cambiare il layout ad una <em>soglia<\/em>: uno spartiacque di quantit\u00e0. Voglio cambiare quando ci sono sei <em>o pi\u00f9<\/em> elementi, non quando ci sono <em>esattamente<\/em> sei elementi. Quando raggiungo la soglia, vorrei cambiare da un layout a tabella distribuita ad una configurazione pi\u00f9 semplice, con <code>inline-block<\/code> che vadano a capo. Ancora pi\u00f9 importante, vorrei <em>conservare<\/em> quella configurazione a cui sono arrivato man mano che il numero di elementi aumenta ulteriormente.<\/p>\n<p>La domanda \u00e8: come si fa a costruire un selettore di questo tipo? \u00c8 una questione di <em>offset<\/em>.<\/p>\n<h3>L&#8217;argomento <em>n<\/em>+6<\/h3>\n<p>Un altro argomento aritmetico adottabile dal selettore <code>:nth-child()<\/code> prende la forma di \u201c<em>n<\/em> + [integer]\u201d. Per esempio, <code>:nth-child(n+6)<\/code> assegna stili a tutti gli elementi in un insieme partendo dal sesto.<\/p>\n<div class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2015\/09\/fig7_adinfinitum.png\" border=\"0\" alt=\"Un insieme di calamari rossi che diventano verdi al sesto calamaro fino alla fine dell'insieme (che pu\u00f2 essere di qualunque dimensione), contando verso l'alto.\" width=\"100%\" \/><\/div>\n<p>Sebbene questo abbia di per s\u00e9 possibili applicazioni, non \u00e8 un metodo di selezione \u201cquantity-aware\u201d in quanto tale: non stiamo assegnando alcuno stile perch\u00e9 ci sono sei o pi\u00f9 elementi in totale, stiamo solo assegnando stili a quelli che hanno un numerale pi\u00f9 alto di cinque.<\/p>\n<p>Per cominciare a risolvere il problema in maniera appropriata, quello che dobbiamo davvero fare \u00e8 creare un insieme di elementi che esclude gli ultimi cinque oggetti. Utilizzando l&#8217;opposto di <code>:nth-child(n+6)<\/code>\u2014<code>:nth-last-child(n+6)<\/code>\u2014 posso applicare le propriet\u00e0 del layout cambiato a tutti gli \u201cultimi elementi\u201d <em>a partire dal sesto<\/em>, contando all&#8217;indietro verso l&#8217;inizio dell&#8217;insieme.<\/p>\n<pre id=\"snippet7\" class=\" language-css\"><code class=\" language-css\">\n<span class=\"token selector\">li:nth-last-child(n+6) <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token\">\/* properties here *\/<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<\/code><\/pre>\n<p>Questo esclude gli ultimi cinque oggetti da un insieme di qualunque lunghezza, il che implica che quando si riduce la lunghezza dell&#8217;insieme a meno di sei, si smettono di vedere gli oggetti selezionati. \u00c8 una specie di effetto \u201csliding doors\u201d.<\/p>\n<div class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2015\/09\/fig8_slidingdoors.png\" border=\"0\" alt=\"Un insieme di calamari verdi (a sinistra) e calamari rossi (a destra) diventa un insieme solo di calamare rossi quando l'insieme ha meno di sei elementi\" width=\"100%\" \/><\/div>\n<p>Se, effettivamente, l&#8217;insieme ha sei o pi\u00f9 elementi in totale, allora tutto quello che rimane \u00e8 assegnare gli stili anche a quegli ultimi cinque oggetti. Questo \u00e8 facile: dove ci sono pi\u00f9 di sei oggetti, devono esistere uno o pi\u00f9 oggetti che \u201critornano true\u201d (in gergo JavaScript) per la condizione <code>nth-last-child(n+6)<\/code>. Ciascuno di questi elementi esistenti pu\u00f2 essere combinato con \u201c<code>~<\/code>\u201d per influenzare tutti gli oggetti (inclusi gli ultimi cinque) che lo seguono.<\/p>\n<div class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2015\/09\/fig9_breakpoint.png\" border=\"0\" alt=\"Quando vengono aggiunti dei calamari ad un insieme di calamari rossi, i calamari a destra dell'insieme diventano verdi e possono essere usati per rendere verde anche il resto dei calamari (con il general sibling combinator)\" width=\"100%\" \/><\/div>\n<p>La soluzione sorprendentemente tersa del nostro problema \u00e8 questa:<\/p>\n<pre id=\"snippet8\" class=\" language-css\"><code class=\" language-css\">\n<span class=\"token selector\">li:nth-last-child(n+6),\nli:nth-last-child(n+6) ~ li <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token\">\/* properties here *\/<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<\/code><\/pre>\n<p>Naturalmente, 6 pu\u00f2 essere sostituito con un qualunque intero positivo, anche 653.279.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Minore o uguale a <em>n<\/em><\/h2>\n<p>Come nell&#8217;esempio di prima con <code>:only-of-type<\/code>, potete capovolgere la logica, passando da \u201cmaggiore o uguale a <em>n<\/em>\u201d a \u201cminore o uguale a <em>n<\/em>\u201d. Il tipo di logica che usate dipende da quale stato considerate come lo stato di default pi\u00f9 naturale. \u201cMinore o uguale a <em>n<\/em>\u201d \u00e8 possibile negando <em>n<\/em> e ripristinando la condizione <code>:first-child<\/code>.<\/p>\n<pre id=\"snippet9\" class=\" language-css\"><code class=\" language-css\">\n<span class=\"token selector\">li:nth-last-child(-n+6):first-child,\nli:nth-last-child(-n+6):first-child ~ li <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token\">\/* properties here *\/<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<\/code><\/pre>\n<p>Effettivamente, l&#8217;uso di \u201c-\u201d cambia la direzione della selezione: invece di puntare all&#8217;inizio partendo dal sesto, punta verso la fine partendo dal sesto. In entrambe i casi, il selettore include il sesto oggetto.<\/p>\n<h3><code>nth-child<\/code> versus <code>nth-of-type<\/code><\/h3>\n<p>Notate che nel precedente esempio ho usato <code>:nth-child()<\/code> e <code>:nth-last-child()<\/code>, non <code>:nth-of-type()<\/code> e <code>:nth-last-of-type()<\/code>. Dal momento che ho a che fare con elementi <code>&lt;li&gt;<\/code> e che gli <code>&lt;li&gt;<\/code> sono gli unici figli legittimi degli <code>&lt;ul&gt;<\/code>, <code>:last-child()<\/code> e <code>:last-of-type()<\/code> funzionerebbero entrambe in questo caso.<\/p>\n<p>Le famiglie di selettori <code>:nth-child()<\/code> e <code>:nth-of-type()<\/code> hanno diversi vantaggi a seconda di quello che si sta cercando di ottenere. Poich\u00e9 <code>:nth-child()<\/code> \u00e8 \u201celement agnostic\u201c, potreste applicare la tecnica descritta per i sibling di diverso tipo:<\/p>\n<pre id=\"snippet10\" class=\" language-markup\"><code class=\" language-markup\">\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>container<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>blockquote<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>blockquote<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>figure<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>figure<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\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\n<\/code><\/pre>\n<pre id=\"snippet11\" class=\" language-css\"><code class=\" language-css\">\n<span class=\"token selector\">.container &gt; :nth-last-child(n+3),\n.container &gt; :nth-last-child(n+3) ~ * <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token\">\/* properties here *\/<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<\/code><\/pre>\n<p>(Si noti il modo in cui sto usando qui <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/CSS\/Universal_selectors\">il selettore universale<\/a> per mantenere \u201dl&#8217;element agnosticism\u201d. <code>:last-child(n+3) ~ *<\/code> vuol dire \u201cqualunque elemento di qualunque tipo che segue <code>:last-child(n+3)<\/code>\u201d.)<\/p>\n<p>Il vantaggio di <code>:nth-last-of-type()<\/code>, d&#8217;altro canto, \u00e8 che siete in grado di puntare gruppi di elementi uguali dove sono presenti altri sibling di diversi tipi. Per esempio, potreste puntare la quantit\u00e0 di paragrafi nella snippet seguente, indipendentemente che siano inclusi in un <code>&lt;div&gt;<\/code> e in un <code>&lt;blockquote&gt;<\/code>.<\/p>\n<pre id=\"snippet12\" class=\" language-markup\"><code class=\" language-markup\">\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>container<span class=\"token punctuation\">\"<\/span><\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>div<\/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\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>p<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;<\/span>blockquote<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>...<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;\/<\/span>blockquote<\/span><span class=\"token punctuation\">&gt;<\/span><\/span>\n\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\n<\/code><\/pre>\n<pre id=\"snippet13\" class=\" language-css\"><code class=\" language-css\">\n<span class=\"token selector\">p:nth-last-of-type(n+6),\np:nth-last-of-type(n+6) ~ p <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token\">\/* properties here *\/<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<\/code><\/pre>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Supporto per i selettori<\/h2>\n<p>Tutti i selettori CSS2.1 e CSS3 utilizzati in questo articolo sono supportati da <a href=\"http:\/\/caniuse.com\/#feat=css-sel3\">Internet Explorer 9 e successivi<\/a>, inclusi tutti i browser ragionevolmente recenti per mobile\/handheld.<\/p>\n<p>Il supporto da parte di Internet Explorer 8 per la maggior parte dei tipi di selettore \u00e8 buono, ma tecnicamente parziale, quindi dovreste considerare un polyfill JavaScript. In alternativa, potreste accoppiare i selettori per la strategia di layout \u201cpi\u00f9 sicura\u201d con <a href=\"http:\/\/nicolasgallagher.com\/better-conditional-classnames-for-hack-free-css\/\">classi specifiche per IE9<\/a>. Nel caso del menu di navigazione, l&#8217;opzione pi\u00f9 sicura \u00e8 quella che viene incontro alle esigenze di pi\u00f9 voci, utilizzando <code>inline-block<\/code>. Il blocco della dichiarazione potrebbe essere pi\u00f9 o meno cos\u00ec:<\/p>\n<pre id=\"snippet14\" class=\" language-css\"><code class=\" language-css\">\n<span class=\"token selector\">nav li:nth-last-child(n+6),\nnav li:nth-last-child(n+6) ~ li, \n\n.lt-ie9 nav li <\/span><span class=\"token punctuation\">{<\/span>\n  <span class=\"token property\">display<\/span><span class=\"token punctuation\">:<\/span> inline-block<span class=\"token punctuation\">;<\/span>\n  <span class=\"token\">\/* etc *\/<\/span>\n<span class=\"token punctuation\">}<\/span>\n\n<\/code><\/pre>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Nel mondo reale<\/h2>\n<p>Supponiamo che il nostro <a href=\"http:\/\/alistapart.com\/d\/415\/content-aware-navigation\/\">menu di navigazione<\/a> appartenga a un sito con un content management system. A seconda di chi amministra il tema, sar\u00e0 popolato con un numero maggiore o minore di opzioni. Alcuni autori faranno in modo che tutto risulti semplice fornendo solo i link \u201cHome\u201d e \u201cAbout\u201d, mentre altri riempiranno il menu di pagine personalizzate e di opzioni per categoria.<\/p>\n<p>Fornendo layout alternativi a seconda del numero di voci di menu presenti, aumentiamo l&#8217;eleganza con la quale tolleriamo diverse implementazioni del tema: gestiamo il contenuto variabile come faremmo con le dimensioni variabili dello schermo.<\/p>\n<div class=\"illustration full\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2015\/09\/fig1_menu.png\" border=\"0\" alt=\"Confronto tra il layout della barra del menu iniziale per meno di sei voci con il layout per sei o pi\u00f9 voci\" width=\"100%\" \/><\/div>\n<p>Ecco fatto: calamari ahoy! Potete adesso aggiungere al vostro repertorio la quantit\u00e0 come condizione per gli stili.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Design content-independent<\/h2>\n<p>Il responsive web design risolve un problema importante: rende lo <em>stesso<\/em> contenuto digeribile comodamente tra <em>diversi<\/em> device. Che la gente riceva contenuto diverso solo perch\u00e9 ha un dispositivo diverso \u00e8 inaccettabile. Analogamente, \u00e8 inaccettabile che un design detti legge sulla natura del contenuto. Non possiamo dire a un editor: \u201cPuoi tralasciarlo? Incasina il layout.\u201d<\/p>\n<p>Indipendentemente da quale forma assuma il contenuto, e da quanto ce ne sia in qualunque momento, \u00e8 spesso indeterminato: un altro sconosciuto. E non possiamo sempre far affidamento sugli script di text wrapping e troncamento. Per avere davvero il polso dell&#8217;indipendenza del contenuto, dobbiamo sviluppare nuovi tools e tecniche. Le quantity queries sono solo una delle tante idee.<\/p>\n<p>Il web design \u00e8 cambiamento, differenza, incertezza. \u00c8 <em>non sapere<\/em>. Nella sua unicit\u00e0 \u00e8 una modalit\u00e0 di visual design che non si manifesta in una forma ma nell&#8217;anticipazione di varie forme che qualcosa <em>potrebbe<\/em> assumere. Per alcuni \u00e8 insopportabilmente sconcertante, ma per voi e per me \u00e8 una sfida che apprezziamo. Come l&#8217;elusivo calamaro gigante, \u00e8 un cliente davvero sfuggente.<\/p>\n<p>Illustrazioni: {carlok}<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Nel responsive design pensiamo molto allo spazio, specialmente nel contesto delle dimensioni di schermo, ma \u00e8 destino che la quantit\u00e0 di contenuto o il numero di elementi influenzino anche loro lo spazio, esattamente altrettanto imprevedibilmente e, se non vogliamo che i nostri design si impongano sui contenuti, abbiamo bisogno di modi nuovi per rendere i nostri design coscienti del cambiamento di quantit\u00e0 del contenuto. Heydon Pickering ci guida attraverso una nuova idea per creare breakpoint di stile per le quantit\u00e0 di elementi HTML.<\/p>\n","protected":false},"author":818,"featured_media":7000769,"comment_status":"open","ping_status":"open","template":"","categories":[244,247,132],"tags":[],"coauthors":[452],"class_list":["post-556","article","type-article","status-publish","has-post-thumbnail","hentry","category-css","category-html","category-numero-115-8-settembre-2015"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/556","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=556"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000769"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=556"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=556"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=556"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}