{"id":461,"date":"2014-06-24T08:42:32","date_gmt":"2014-06-24T06:42:32","guid":{"rendered":"https:\/\/alistapart.com\/it\/article\/introduzione-a-css-shapes\/"},"modified":"2014-06-24T08:42:32","modified_gmt":"2014-06-24T06:42:32","slug":"introduzione-a-css-shapes","status":"publish","type":"article","link":"https:\/\/alistapart.com\/it\/article\/introduzione-a-css-shapes\/","title":{"rendered":"Introduzione a CSS Shapes"},"content":{"rendered":"<p><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/n94shape.png\" border=\"0\" align=\"left\" \/><\/p>\n<p>Rettangoli all&#8217;interno di altri rettangoli: ecco da cosa sono sempre state fatte le nostre pagine web. Da molto tempo stiamo provando a liberarci da queste costrizioni usando CSS per creare delle <a href=\"https:\/\/css-tricks.com\/examples\/ShapesOfCSS\/\">forme geometriche<\/a>, ma queste forme non hanno mai influenzato la posizione del contenuto all&#8217;interno dell&#8217;elemento con una certa forma, o il modo in cui l&#8217;elemento viene visto dagli altri presenti sulla stessa pagina.<\/p>\n<p>La nuova specifica CSS Shapes sta cambiando proprio questi aspetti. Introdotta da <a href=\"http:\/\/blogs.adobe.com\/webplatform\/category\/features\/css-shapes\/\">Adobe<\/a> a met\u00e0 del 2012, il suo obiettivo \u00e8 quello di fornire ai web designer un nuovo modo per cambiare la maniera in cui il contenuto si posiziona all&#8217;interno e attorno a forme complesse e arbitrarie: cosa che non siamo mai stati in grado di fare prima d&#8217;ora, nemmeno con JavaScript.<\/p>\n<p>Per esempio, osservate come il testo si sistemi attorno alle immagini circolari nel seguente design. Senza Shapes, il testo sarebbe rettangolare, sprecando il tocco sofisticato che porta il design a un livello superiore.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/shape-outside-example.jpg\" border=\"0\" alt=\"Immagine di un layout di un magazine con il testo che si posiziona attorno alle immagini di forma circolare.\" width=\"550\" \/><\/p>\n<p>Notate in questo esempio il modo in cui il testo si posiziona attorno alla forma circolare di una ciotola. Usando CSS Shapes possiamo creare dei design simili per il Web.<\/p>\n<\/div>\n<p>Vediamo come funzionano le Shapes e come si possono cominciare ad usare.<\/p>\n<div class=\"paragrafo\">\n<h2>Supporto nei browser<\/h2>\n<p>Le CSS Shapes attualmente sono supportate solo in Webkit Nightly e Chrome Canary, ma il loro Module Level 1 ha raggiunto lo status di Candidate Recommendation, quindi le propriet\u00e0 e la sintassi definita nella specifica sono piuttosto stabili. Non ci vorr\u00e0 molto prima che venga implementata anche in altri browser. Questo &#8220;Level&#8221; \u00e8 incentrato sulle propriet\u00e0 delle Shapes che modificano lo scorrere del contenuto <em>attorno<\/em> ad una forma. Pi\u00f9 nello specifico, ruota attorno alla propriet\u00e0 <code>shape-outside<\/code> e sulle propriet\u00e0 ad essa correlate.<\/p>\n<p>Utilizzando CSS Shapes insieme ad altre feature all&#8217;avanguardia come <a href=\"http:\/\/www.w3.org\/TR\/css-masking\/\">Clipping and Masking<\/a>, <a href=\"http:\/\/www.w3.org\/TR\/filter-effects-1\/\">CSS Filters<\/a> e <a href=\"http:\/\/dev.w3.org\/fxtf\/compositing-1\/\">Compositing and Blending<\/a> potremo creare design pi\u00f9 raffinati e sofisticati senza dover ricorrere a programmi di grafica come Photoshop o InDesign.<\/p>\n<p>I Level futuri di CSS Shapes si concentreranno sulla presentazione del contenuto anche all&#8217;interno di una forma. Per esempio, oggi \u00e8 semplice creare una forma a rombo in CSS: basta ruotare semplicemente l&#8217;elemento di 45 gradi e poi ruotare al contrario il contenuto al suo interno, cos\u00ec che si posizioni orizzontalmente sulla pagina. Ma il contenuto all&#8217;interno del rombo non sar\u00e0 influenzato dalla forma romboidale del suo container e rimarr\u00e0 sempre rettangolare. Quando la propriet\u00e0 <code>shape-inside<\/code> di CSS Shapes verr\u00e0 implementata, saremo in grado di far s\u00ec che anche il contenuto diventi a forma di rombo, rendendo fattibile il layout come quello mostrato nell&#8217;immagine seguente.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/rhombic.jpg\" border=\"0\" alt=\"Immagine di un layout di un magazine che usa rombi come forme.\" \/><\/p>\n<p>Presto, CSS Shapes permetter\u00e0 che anche il testo all&#8217;interno di queste forme, come i rombi, si aggiusti ai lati del suo contenitore piuttosto che uscirne o venirne tagliato.<\/p>\n<\/div>\n<p>Per usare subito CSS Shapes in Chrome Canary dovete abilitare la flag delle feature sperimentali. Se non siete sicuri su come si fa, date un&#8217;occhiata a <a href=\"http:\/\/html.adobe.com\/webplatform\/enable\/\">questa guida passo a passo<\/a> sul blog di Adobe.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Creare una CSS Shape<\/h2>\n<p>Potete applicare una forma a un elemento usando una delle <em>propriet\u00e0<\/em> di Shapes. Si passa alla shape property una shape <em>function<\/em> come valore. La shape function \u00e8 il posto in cui si passano gli argomenti che definiscono la forma che si vuole applicare all&#8217;elemento.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/shape-rule.png\" border=\"0\" alt=\"Illustrazione che mostra parti diverse che creano una shape rule.\" width=\"550\" \/><\/div>\n<p>Le forme possono essere create usando una delle seguenti funzioni:<\/p>\n<ul>\n<li><code>circle()<\/code><\/li>\n<li><code>ellipse()<\/code><\/li>\n<li><code>inset()<\/code><\/li>\n<li><code>polygon()<\/code><\/li>\n<\/ul>\n<p>Ogni forma \u00e8 definita da un insieme di punti. Alcune funzioni prendono i punti come parametri, altre richiedono gli offset, ma alla fine tutte disegnano le forme come un insieme di punti sull&#8217;elemento. Vedremo i parametri per ciascuna di queste funzioni negli esempi che creeremo.<\/p>\n<p>Una forma pu\u00f2 anche essere definita estraendola da un&#8217;immagine con un alpha channel. Quando un&#8217;immagine viene passata alla shape property, il browser andr\u00e0 poi ad estrarre la forma dall&#8217;immagine basandosi su una <code>shape-image-threshold<\/code>. La forma \u00e8 definita dai pixel il cui valore alfa \u00e8 maggiore della soglia (treshold). L&#8217;immagine deve essere <a href=\"http:\/\/caniuse.com\/cors\">compatibile con CORS<\/a>. Se l&#8217;immagine fornita per qualche ragione non pu\u00f2 essere mostrata (come se ad esempio non esistesse), allora non verr\u00e0 applicata alcuna forma.<\/p>\n<p>Le propriet\u00e0 shape che accettano le funzioni di cui sopra come valori sono:<\/p>\n<ul>\n<li><code>shape-outside<\/code>: sistema il contenuto attorno (all&#8217;esterno) della forma<\/li>\n<li><code>shape-inside<\/code>: sistema il contenuto all&#8217;interno della forma<\/li>\n<\/ul>\n<p>Si pu\u00f2 usare la propriet\u00e0 <code>shape-outside<\/code> insieme alla propriet\u00e0 <code>shape-margin<\/code> per aggiungere un margine attorno alla forma cos\u00ec da allontanare il contenuto che scorre attorno alla forma, creando pi\u00f9 spazio fra questa e il contenuto. Proprio come <code>shape-outside<\/code> ha una propriet\u00e0 <code>shape-margin<\/code>, cos\u00ec <code>shape-inside<\/code> ha una propriet\u00e0 <code>shape-padding<\/code>, che aggiunge un padding interno.<\/p>\n<p>Usando le shape properties e functions, la dichiarazione di una shape su un elemento pu\u00f2 essere tanto semplice quanto aggiungere una riga di CSS:<\/p>\n<pre><code>.element {\n\tshape-outside: circle(); \/* il contenuto scorrer\u00e0 attorno\n                                        al cerchio definito sull'elemento *\/\n}<\/code><\/pre>\n<p>Oppure:<\/p>\n<pre><code>.element {\n\tshape-outside: url(path\/to\/image-with-shape.png);\n}<\/code><\/pre>\n<p>Ma\u2026<\/p>\n<p>Se applicate quella riga di CSS al vostro elemento, la shape non verr\u00e0 ad esso applicata a meno che non vengano soddisfatte due condizioni:<\/p>\n<ol>\n<li><strong>All&#8217;elemento deve essere applicato un float.<\/strong> I livelli futuri di CSS Shapes potrebbero permetterci di definire le forme sugli elementi che non hanno float, ma al momento non \u00e8 ancora possibile.<\/li>\n<li><strong>L&#8217;elemento deve avere dimensioni intrinseche.<\/strong> L&#8217;altezza e la larghezza impostate su un elemento verranno usate per stabilire un sistema di coordinate su quell&#8217;elemento.<\/li>\n<\/ol>\n<p>Come avete visto nelle definizioni di funzione di cui sopra, le forme sono definite da insiemi di punti. Poich\u00e9 questi punti hanno delle coordinate, serve un sistema di coordinate per far s\u00ec che il browser sappia dove posizionare ciascun punto sull&#8217;elemento. Quindi, l&#8217;esempio di prima funzionerebbe se includesse qualcosa come:<\/p>\n<pre><code>.element {\n\tfloat: left;\n\theight: 10em;\n\twidth: 15em;\n\tshape-outside: circle();\n}<\/code><\/pre>\n<p>Comunque, dare all&#8217;elemento delle dimensioni intrinseche non influenza la sua &#8220;responsiveness&#8221; (ne parleremo pi\u00f9 avanti).<\/p>\n<p>Dal momento che ciascuna forma \u00e8 definita da un insieme di punti posizionati usando una coppia di coordinate, cambiare le coordinate di un punto influenzer\u00e0 direttamente la forma creata. Per esempio, l&#8217;immagine seguente mostra una forma esagonale che pu\u00f2 essere creata usando la funzione <code>polygon()<\/code>. La forma \u00e8 creata con sei punti. Cambiando la coordinata orizzontale del punto in arancio cambier\u00e0 anche la forma risultante e influenzer\u00e0 il flusso del contenuto all&#8217;interno e\/o all&#8217;esterno di qualsiasi elemento a cui \u00e8 applicata questa forma.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/shape-points.png\" border=\"0\" alt=\"Immagine che mostra il risultato del cambiamento di coordinata di un punto sulla forma creata.\" width=\"550\" \/><\/p>\n<p>Se l&#8217;elemento ha float right e gli si applica questa forma, il contenuto alla sua sinistra cambier\u00e0 il suo andamento quando la coordinata del punto arancio verr\u00e0 cambiata all&#8217;interno della funzione <code>polygon()<\/code>.<\/p>\n<\/div>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Il reference box di una Shape<\/h2>\n<p>Le CSS Shapes sono definite e create all&#8217;interno di una <em>reference box<\/em>, che \u00e8 il box usato per disegnare la forma sull&#8217;elemento. Oltre all&#8217;altezza e alla larghezza dell&#8217;elemento, i box del box model dell&#8217;elemento &#8211; <em>margin box<\/em>, <em>content box<\/em>, <em>padding box<\/em> e <em>border box<\/em> &#8211; vengono anche usati come riferimento per specificare la dimensione della forma di un elemento.<\/p>\n<p>Di default, il margin box viene usato come riferimento, quindi, se un elemento a cui volete applicare una forma ha un margin sul lato inferiore (bottom), la forma che definite sull&#8217;elemento si estender\u00e0 fino ai bordi dell&#8217;area di margin, non fino alla border area dell&#8217;elemento. Se volete usare uno degli altri box value, potete specificarlo insieme alla shape function che passate alle shape properties:<\/p>\n<pre><code>shape-outside: circle(250px at 50% 50%) padding-box;<\/code><\/pre>\n<p>La parola chiave <code>padding-box<\/code> nella regola di cui sopra specifica che la forma verr\u00e0 applicata e sar\u00e0 ristretta al padding box (padding area) dell&#8217;elemento. La funzione <code>circle()<\/code> definisce una forma circolare, la sua dimensione e la sua posizione sull&#8217;elemento.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Definire le Shapes usando le shape function<\/h2>\n<p>Cominceremo col posizionare alcune informazioni attorno all&#8217;immagine di un avatar di un utente, come potreste voler fare per mostrare uno user profile o un testimonial.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/demo-user-profile-screenshot.png\" border=\"0\" alt=\"Screenshot che mostra una foto per lo user profile con il testo che si dispone attorno ai bordi circolari.\" width=\"550\" \/><\/p>\n<p>Usando CSS Shapes, il testo attorno ad un&#8217;immagine circolare per lo user profile scorre lungo la forma invece di rimanere rettangolare.<\/p>\n<\/div>\n<p>Useremo la funzione <code>circle()<\/code> per applicare una forma circolare all&#8217;immagine del profilo, usando il seguente markup:<\/p>\n<pre><code>&lt;img src=\"http:\/\/api.randomuser.me\/0.3.2\/portraits\/men\/7.jpg\" \n  alt=\"profile image\" \/&gt;\n\n&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit. Harum itaque \n  nam blanditiis eveniet enim eligendi quae adipisci?&lt;\/p&gt;\n\n&lt;p&gt;Assumenda blanditiis voluptas tempore porro quibusdam beatae \ndeleniti quod asperiores sapiente dolorem error! Quo nam quasi soluta \nreprehenderit laudantium optio ipsam ducimus consequatur enim fuga \nquibusdam mollitia nesciunt modi.&lt;\/p&gt;<\/code><\/pre>\n<p>Potreste chiedermi &#8220;Perch\u00e9 non usiamo <code>border-radius<\/code> per arrotondare l&#8217;immagine?&#8221; La risposta \u00e8 che la propriet\u00e0 <code>border-radius<\/code> non ha alcun effetto sul fluire del contenuto all&#8217;interno o attorno all&#8217;elemento a cui \u00e8 applicato: non influenza l&#8217;area del contenuto dell&#8217;elemento n\u00e9 l&#8217;area di posizionamento del contenuto attorno all&#8217;elemento. Ha effetto solo sui bordi di un elemento e sugli eventuali background. L&#8217;area del background \u00e8 agganciata agli angoli arrotondati dalla propriet\u00e0 e questo \u00e8 tutto; il contenuto all&#8217;interno dell&#8217;elemento rimarr\u00e0 rettangolare e il contenuto al di fuori dell&#8217;elemento vedr\u00e0 ancora e tratter\u00e0 l&#8217;elemento come se fosse rettangolare, perch\u00e9 lo \u00e8.<\/p>\n<p>Noi <em>useremo<\/em> la propriet\u00e0 <code>border-radius<\/code> per rendere l&#8217;immagine circolare. Questo \u00e8 quello che facciamo di solito per arrotondare le immagini o altri elementi di una pagina:<\/p>\n<pre><code>img {\n\tfloat: left;\n\twidth: 150px;\n\theight: 150px;\n\tborder-radius: 50%;\n\tmargin-right: 15px;\n}<\/code><\/pre>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/demo-user-profile-screenshot-incomplete.png\" border=\"0\" alt=\"Screenshot che mostra come si posizionerebbe normalmente il testo attorno ad un'immagine senza applicarvi una CSS Shape.\" width=\"550\" \/><\/p>\n<p>Senza CSS Shapes, il testo vede l&#8217;immagine come rettangolare e quindi si scorre attorno ad una forma rettangolare non intorno ad una circolare.<\/p>\n<\/div>\n<p>In un browser che non supporta CSS Shapes, il contenuto attorno all&#8217;immagine circolare si posizioner\u00e0 attorno a questa come se non fosse circolare. Questo \u00e8 il modo in cui apparirebbe il fallback nei browser pi\u00f9 vecchi.<\/p>\n<p>Per cambiare il flusso di contenuto perch\u00e9 si sistemi attorno ad una forma, useremo le shape properties.<\/p>\n<pre><code>img {\n\tfloat: left;\n\twidth: 150px;\n\theight: 150px;\n\tborder-radius: 50%;\n\n\tshape-outside: circle();\n\tshape-margin: 15px;\n}<\/code><\/pre>\n<p>Con questo codice, il testo &#8220;vedr\u00e0&#8221; la forma circolare applicata all&#8217;immagine e vi si posizioner\u00e0 attorno, come mostrato nel primo screenshot. (Potete vedere il risultato &#8220;live&#8221; <a href=\"http:\/\/codepen.io\/SaraSoueidan\/pen\/af3d2ae9fbe4205035822e4878fb1f54\/\">qui<\/a>). Nei browser che non supportano queste propriet\u00e0, il risultato sar\u00e0 quello di fallback mostrato nella seconda immagine.<\/p>\n<p>Potete usare la funzione <code>circle()<\/code> cos\u00ec com&#8217;\u00e8 o passandogli dei parametri. La sua sintassi ufficiale \u00e8:<\/p>\n<pre><code>circle() = circle( [&lt;shape-radius&gt;]? [at &lt;position&gt;]? )<\/code><\/pre>\n<p>I punti di domanda indicano che questi parametri sono opzionali e possono essere omessi. Se ne omettete uno, quel parametro verr\u00e0 impostato al suo valore di default dal browser. Quando usate <code>circle()<\/code> cos\u00ec com&#8217;\u00e8, invece di impostare semplicemente la sua posizione, il suo default consister\u00e0 in un cerchio posizionato al centro dell&#8217;elemento a cui la state applicando.<\/p>\n<p>Si pu\u00f2 specificare il raggio del cerchio usando una qualsiasi unit\u00e0 di lunghezza (<code>px<\/code>, <code>em<\/code>, <code>pt<\/code>, etc.). Potete anche specificare il raggio usando <code>closest-side<\/code> o <code>farthest-side<\/code>, ma <code>closest-side<\/code> \u00e8 il default, quindi il browser user\u00e0 la lunghezza dal centro dell&#8217;elemento verso il suo lato pi\u00f9 vicino come lunghezza del raggio. <code>farthest-side<\/code> usa la lunghezza dal centro verso il lato pi\u00f9 lontano.<\/p>\n<pre><code>shape-outside: circle(farthest-side at 25% 25%); \/* definisce un cerchio \n   il cui raggio \u00e8 met\u00e0 della lunghezza del lato pi\u00f9 lungo, \n   posizionato nel punto di coordinate 25% 25% \n   sul sistema di coordinate dell'elemento *\/\n\nshape-inside: circle(250px at 500px 300px); \/* definisce un cerchio il cui centro \n  \u00e8 posizionato orizzontalmente a 500px e verticalmente a 300px, \n  con un raggio di 250px. *\/<\/code><\/pre>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/closest-side-farthest-side.png\" border=\"0\" alt=\"L'illustrazione mostra una spiegazione visuale dei valori closest-side e farthest-side.\" width=\"550\" \/><\/div>\n<p>La funzione <code>ellipse()<\/code> funziona allo stesso modo della funzione <code>circle()<\/code>, con lo stesso elenco di valori ma invece che prendere in ingresso un parametro per il raggio, ne richiede due: uno per la lunghezza del raggio sull&#8217;asse X e un altro per l&#8217;asse Y.<\/p>\n<pre><code>ellipse() = ellipse( [&lt;shape-radius&gt;{2}]? [at &lt;position&gt;]? )<\/code><\/pre>\n<p>Sebbene non direttamente collegata a un cerchio o a un ellisse, la funzione <code>inset()<\/code> \u00e8 usata per creare forme rettangolari all&#8217;interno di un elemento. Dal momento che gli elementi sono gi\u00e0 rettangolari, tuttavia, non abbiamo bisogno di creare altri rettangoli. Al contrario, <code>inset()<\/code> ci aiuta a creare rettangoli con angoli arrotondati il cui contenuto scorre attorno a questi angoli.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/inset-example.png\" border=\"0\" alt=\"Immagine che mostra il flusso del testo attorno ad un elemento che ha e che non ha la funzione inset() applicata ad esso.\" width=\"550\" \/><\/div>\n<p>La funzione <code>inset()<\/code> prende da uno a quattro valori di offset, che specificano l&#8217;offset verso l&#8217;interno dai lati del <em>reference box<\/em>. Questi specificano dove il rettangolo &#8220;inset&#8221; deve andare all&#8217;interno dell&#8217;elemento. La funzione prende anche un parametro opzionale per arrotondare gli angoli del rettangolo &#8220;inset&#8221;. Gli angoli arrotondati sono specificati esattamente nello stesso modo di <code>border-radius, usando da uno a quattro valori, insieme alla parola chiave <code>round<\/code>.<\/code><\/p>\n<pre><code>inset() = inset( offset{1,4} [round &lt;border-radius&gt;]? )<\/code><\/pre>\n<p>Il seguente codice creer\u00e0 un rettangolo arrotondato su un elemento con float.<\/p>\n<pre><code>.element {\n\tfloat: left;\n\twidth: 250px;\n\theight: 150px;\n\tshape-outside: inset(0px round 100px) border-box;\n}<\/code><\/pre>\n<p>Guardate l&#8217;esempio live <a href=\"http:\/\/codepen.io\/SaraSoueidan\/debug\/05e7894a0a7dbffed0a1c9f5e0840ec9\/\">qui<\/a>.<\/p>\n<p>L&#8217;ultima funzione shape \u00e8 <code>polygon()<\/code>, che definisce forme arbitrarie pi\u00f9 complesse usando un qualunque numero di punti. La funzione prende in ingresso un insieme di coppie di coordinate, ciascuna coppia specifica la posizione di un punto. L&#8217;insieme di punti forma la shape.<\/p>\n<p>Nell&#8217;esempio seguente, un&#8217;immagine con float right occupa l&#8217;intera altezza dello schermo usando le unit\u00e0 della viewport. Vogliamo che il testo scorra sulla sinistra lungo la clessidra all&#8217;interno dell&#8217;immagine, cos\u00ec usiamo la funzione <code>polygon()<\/code> per definire una forma irregolare sull&#8217;immagine.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/polygon-example-incomplete.png\" border=\"0\" alt=\"Screenshot che mostra il risultato dell'applicazione della funzione polygon() per definire una forma su un'immagine e far s\u00ec che il contenuto si posizioni attorno a quella forma.\" width=\"550\" \/><\/div>\n<p>Il CSS per l&#8217;immagine qui sopra \u00e8 cos\u00ec:<\/p>\n<pre><code>img.right {\n\tfloat: right;\n\theight: 100vh;\n\twidth: calc(100vh + 100vh\/4);\n\tshape-outside: polygon(40% 0, 100% 0, 100% 100%, 40% 100%, 45% 60%, \n    45% 40%);\n}<\/code><\/pre>\n<p>Potete impostare le coordinate dei punti che definiscono la forma in unit\u00e0 di lunghezza o in percentuali, come ho fatto io in questo esempio.<\/p>\n<p>Questo codice da solo produrr\u00e0 il risultato di cui sopra, ma come potete vedere, la shape function non influenza le parti rimanenti dell&#8217;immagine al di fuori della forma definita. In realt\u00e0, applicare una shape function a un elemento, che sia un&#8217;immagine, un container o qualcosa tra questi due estremi, non influenzer\u00e0 niente se non l&#8217;area in cui scorrer\u00e0 il contenuto. I background, i bordi e tutto il resto rimarranno invariati.<\/p>\n<p>Per visualizzare la forma del poligono che abbiamo creato dobbiamo ritagliare le parti dell&#8217;immagine al di fuori della forma. Ci viene in aiuto la propriet\u00e0 <code>clip-path<\/code> da <a href=\"http:\/\/www.w3.org\/TR\/2014\/WD-css-masking-1-20140213\/\">CSS Masking Module<\/a>.<\/p>\n<p>La propriet\u00e0 <code>clip-path<\/code> prende le stesse shape function e gli stessi valori delle shape properties. Se passiamo la stessa forma poligonale che abbiamo usato nella propriet\u00e0 <code>shape-outside<\/code> alla propriet\u00e0 <code>clip-path<\/code>, questa ritaglier\u00e0 tutte le parti dell&#8217;immagine che si trovano al di fuori della forma definita.<\/p>\n<pre><code>img.right {\n\tfloat: right;\n\theight: 100vh;\n\twidth: calc(100vh + 100vh\/4);\n\tshape-outside: polygon(40% 0, 100% 0, 100% 100%, 40% 100%, 45% 60%,\n     45% 40%);\n\t\/* clip the image to the defined shape *\/\n\tclip-path: polygon(40% 0, 100% 0, 100% 100%, 40% 100%, 45% 60%, 45% 40%);\n}<\/code><\/pre>\n<p>Il risultato apparir\u00e0 cos\u00ec:<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/polygon-example-finished.png\" border=\"0\" alt=\"Screenshot che mostra il risultato dell'applicazione della propriet\u00e0 clip-path a un elemento con una forma per ritagliarea le parti in eccesso dell'immagine al di fuori della forma definita.\" width=\"550\" \/><\/div>\n<p>La propriet\u00e0 <code>clip-path<\/code> \u00e8 al momento supportata <strong>con i prefissi<\/strong>, quindi funzioner\u00e0 in Chrome con il prefisso <code>-webkit-<\/code> aggiunto alla propriet\u00e0 <code>clip-path<\/code>. Potete guardare la live demo <a href=\"http:\/\/codepen.io\/SaraSoueidan\/pen\/04a4c8380e4aa5a8e6a2b0014b2db198\/\">qui<\/a>.<\/p>\n<p>La propriet\u00e0 <code>clip-path<\/code> \u00e8 una compagna eccellente per le shape properties, perch\u00e9 contribuisce a visualizzare le forme create e a ritagliare tutte le parti dell&#8217;elemento che si trovano al di fuori delle forme definite, cos\u00ec probabilmente vi troverete ad usarla molto spesso insieme alle shape properties.<\/p>\n<p>La funzione <code>polygon()<\/code>, inoltre, prende in ingresso una keyword opzionale che pu\u00f2 avere valore <code>nonzero<\/code> o <code>evenodd<\/code>. Questo specifica il modo in cui trattare le aree all&#8217;interno della forma poligonale che possono intersecarsi. Si veda la propriet\u00e0 <a href=\"http:\/\/www.w3.org\/TR\/SVG\/painting.html#FillRuleProperty\">SVG fill-rule<\/a> per i dettagli.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Definire una forma usando un&#8217;immagine<\/h2>\n<p>Per definire una forma utilizzando un&#8217;immagina, tale immagine ha bisogno di un alpha channel da cui il browser pu\u00f2 estrarre la forma.<\/p>\n<p>Una forma \u00e8 definita dai pixel i cui valori alfa sono maggiori di una certa soglia, che ha come valore di default 0.0 (completamente trasparente), oppure potete impostarla esplicitamente usando la propriet\u00e0 <code>shape-image-shreshold<\/code>. Quindi, qualunque pixel non trasparente sar\u00e0 usato come parte della forma definita dall&#8217;immagine.<\/p>\n<p>Un futuro livello di CSS Shapes potrebbe definire uno switch per utilizzare i dati di &#8220;luminance&#8221; da un&#8217;immagine invece dei dati alpha. Se questo accadesse, <code>shape-image-treshold<\/code> verrebbe estesa per applicare la sua soglia o all&#8217;alpha o alla luminance, a seconda dello stato dello switch.<\/p>\n<p>Useremo la seguente immagine per definire una forma su un elemento e fare in modo che il testo si posizioni attorno ad essa.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/leaf.png\" border=\"0\" \/><\/div>\n<p>Usare la propriet\u00e0 <code>shape-outside<\/code> con il valore <code>url()<\/code> che punta a questa immagine, possiamo far scorrere il contenuto attorno all&#8217;elemento con questa forma di foglia.<\/p>\n<pre><code>.leaf-shaped-element {\n\tfloat: left;\n\twidth: 400px;\n\theight: 400px;\n\tshape-outside: url(leaf.png);\n\tshape-margin: 15px;\n\tshape-image-threshold: 0.5;\n\tbackground: #009966 url(path\/to\/background-image.jpg);\n\tmask-image: url(leaf.png);\n}<\/code><\/pre>\n<p>Ovviamente, se aveste applicato un background all&#8217;elemento, il background avrebbe dovuto essere ritagliato all&#8217;esterno della forma definita. La propriet\u00e0 <code>mark-image<\/code> (con i prefissi appropriati) facente parte del Masking Module pu\u00f2 fare proprio questo, dal momento che la propriet\u00e0 <code>clip-path<\/code> non prende un&#8217;immagine alpha come valore. Il risultato ha questo aspetto:<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/shape-image-example.png\" border=\"0\" alt=\"Screenshot che mostra il testo posizionato attorno a una forma estratta da un'immagine con un alpha channel.\" width=\"550\" \/><\/div>\n<p>Se state creando forme complesse, potreste voler definire una forma usando un&#8217;immagine. Questo vi permette di usare un&#8217;immagine con un alpha channel in Photoshop invece che definire manualmente i punti.<\/p>\n<p>Potreste anche voler usare un&#8217;immagine invece di una shape function quando avete pi\u00f9 float o pi\u00f9 aree di esclusione all&#8217;interno di un elemento &#8211; perch\u00e9, per il momento, non potete dichiarare pi\u00f9 forme su un elemento. Ma se l&#8217;immagine contiene pi\u00f9 aree, il browser estrarr\u00e0 queste aree dall&#8217;immagine e le user\u00e0.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>CSS Shapes nel responsive design<\/h2>\n<p>CSS Shapes pu\u00f2 rientrare nel nostro workflow responsive? Ci viene in aiuto l&#8217;attuale specifica di <code>shape-outside<\/code>, perch\u00e9 ci permette di specificare le dimensioni dell&#8217;elemento sia in percentuali sia in altre unit\u00e0 di lunghezza e i punti che definiscono una forma (parametri della funzione shape) possono essere anch&#8217;essi impostati in percentuali. Questo significa che un elemento con <code>shape-outside<\/code> dovrebbe essere completamente responsive, proprio come qualunque altro float con dimensioni in percentuale.<\/p>\n<p><code>shape-inside<\/code> non \u00e8 ancora responsive ma solo perch\u00e9 \u00e8 stata spostata nel Module Level 2. Molte delle sue attuali limitazioni verranno risolte nel prossimo livello.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Strumenti per la forma<\/h2>\n<p>Creare forme complesse con le shape function pu\u00f2 essere un compito scoraggiante, specialmente se ne state creando una con molti punti e coordinate usando <code>polygon()<\/code>. Fortunatamente, il team della piattaforma web di Adobe sta lavorando su dei tool interattivi che renderanno questa operazione molto pi\u00f9 semplice. Bear Travis ha creato <a href=\"http:\/\/betravis.github.io\/shape-tools\/\">una collezione di Shape Tools<\/a> che ci permettono di creare delle forme poligonali in maniera visuale. Il tool genera poi una funzione di forma al posto nostro. Tutto ci\u00f2 \u00e8 utile, ma pu\u00f2 essere limitante se volete creare una forma basata su un&#8217;immagine specifica, perch\u00e9 non ci sono modi con cui poter inserire l&#8217;immagine nel tool e poi crearne una forma.<\/p>\n<p>Uno Shape Tool pi\u00f9 avanzato ed interattivo \u00e8 stato sviluppato dal team di Adobe Web Platform. Tale strumento \u00e8 stato <a href=\"http:\/\/blogs.adobe.com\/webplatform\/2014\/04\/17\/css-shapes-editor-in-brackets\/\">rilasciato recentemente<\/a> come estensione dell&#8217;<a href=\"http:\/\/brackets.io\/\">editor gratuito Brackets<\/a> di Adobe. Permette di visualizzare ed editare le forme direttamente nel browser e ha una feature di &#8220;live preview&#8221; che aggiorna i valori di forma nello stylesheet quando li si cambia sulla pagina. In questo modo, si ha un feedback visivo istantaneo dei cambiamenti, permettendoci di vedere come le forme interagiscono con gli altri elementi sulla pagina.<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/shapes-polygon.gif\" border=\"0\" alt=\"Screen capture che mostra come il nuovo Shapes Editor possa essere usato per editare le Shapes direttamente nel browser.\" width=\"550\" \/><\/p>\n<p>Modifica di una forma poligonale direttamente nel browser con la modalit\u00e0 &#8220;live preview&#8221; di Brackets. <em>Screen capture di Razvan Caliman.<\/em><\/p>\n<\/div>\n<p>Questo strumento sar\u00e0 indispensabile perch\u00e9 faciliter\u00e0 la creazione, la modifica e il debugging delle nostre forme. Razvan Caliman ha scritto <a href=\"http:\/\/blog.brackets.io\/2014\/04\/17\/css-shapes-editor\/\">un articolo sul blog di Brackets<\/a> in cui spiega come utilizzare lo Shapes editor in Brackets.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Il futuro: CSS Exclusions<\/h2>\n<p>La specifica CSS Shapes si trovava una volta nella specifica CSS Shapes and Exclusions, ma le due specifiche vennero separate. CSS Shapes definisce le propriet\u00e0 <code>shape-inside<\/code> e <code>shape-outside<\/code>, mentre CSS Exclusions definir\u00e0 delle propriet\u00e0 che ci permetteranno di far scorrere il contenuto attorno agli elementi che non hanno float, come gli elementi con posizione assoluta. Ci\u00f2 render\u00e0 possibile lo scorrere del contenuto attorno all&#8217;intera forma su lati diversi, come mostrato nell&#8217;immagine seguente:<\/p>\n<div class=\"illustration full left\"><img decoding=\"async\" src=\"http:\/\/alistapart.com\/it\/wp-content\/uploads\/sites\/2\/2014\/06\/exclusion-example.jpg\" border=\"0\" alt=\"Screenshot di un layout di un magazine con il testo che scorre attorno a un pullquote.\" width=\"550\" \/><\/p>\n<p>In futuro, CSS Exclusions ci permetter\u00e0 di far scorrere il testo attorno ad una forma come il &#8220;pullquote&#8221; (frase di articolo estratta e stampata a caratteri pi\u00f9 grandi, <em>ndr<\/em>), come mostrato nel layout di questo magazine. Il pullquote potr\u00e0 anche essere circolare e il testo gli si avvolger\u00e0 comunque attorno. <em>Immagine di <a href=\"http:\/\/cargocollective.com\/justinthomaskay\">Justin Thomas Kay<\/a>.<\/em><\/p>\n<\/div>\n<p>Saranno anche possibili layout simili con elementi di varie forme posizionati in maniera assoluta al centro di un articolo, con il testo che scorre attorno all&#8217;elemento su tutti i lati.<\/p>\n<\/div>\n<div class=\"paragrafo\">\n<h2>Spingersi oltre le Shapes<\/h2>\n<p>L&#8217;attuale specifica di CSS Shapes non \u00e8 altro che un primo passo. Ben presto, avremo nuove opzioni che ci daranno pi\u00f9 controllo sulla creazione di forme e sul posizionamento del contenuto al loro interno e al di fuori di esse, rendendo molto pi\u00f9 semplice per noi tradurre i nostri mockup in design &#8220;live&#8221; usando solo poche righe di codice. Ad oggi, gli editor della specifica si stanno concentrando sulla pubblicazione di <code>shape-outside<\/code> e molto probabilmente vedremo le CSS Shapes in sempre pi\u00f9 browser entro la fine del 2014.<\/p>\n<p>Potete usare Shapes oggi come parte di un workflow basato sul progressive enhancement, sapendo che hanno dei fallback accettabili nei browser in cui non sono supportate. Ho recentemente cominciato ad applicarle al <a href=\"http:\/\/sarasoueidan.com\/about.php\">mio sito web<\/a> e il fallback \u00e8 decisamente &#8220;normale&#8221;. Per design pi\u00f9 complessi, potete usare uno script per controllare se un browser supporta le Shapes e per fornire il fallback che volete se non lo sono. Potete anche estendere i test di <a href=\"http:\/\/modernizr.com\/\">Modernizr<\/a> con <a href=\"https:\/\/github.com\/Modernizr\/Modernizr\/blob\/master\/feature-detects\/css\/shapes.js\">questo script<\/a> per vedere se <code>shape-outside<\/code> \u00e8 supportata, o scaricarne una &#8220;custom build&#8221; che includa questo test.<\/p>\n<p>CSS Shapes ci permette di colmare una lacuna esistente tra stampa e web. Gli esempi in questo articolo sono semplici, ma possono costituire la base per la creazione di design complessi come un qualunque magazine o poster, senza doversi preoccupare se sarete in grado di riprodurli sullo schermo. Qualunque cosa vogliate esplorare, dai <a href=\"http:\/\/sarasoueidan.com\/blog\/css-shapes\/\">layout non rettangolari<\/a> all&#8217;<a href=\"http:\/\/sarasoueidan.com\/blog\/animating-css-shapes\/\">animazione delle Shapes<\/a>, questo \u00e8 il momento giusto per esplorare.<\/p>\n<p>Illustrazioni: {carlok}<\/p>\n<\/div>\n<p>\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La nuova specifica CSS Shapes ha il potenziale per cambiare il modo in cui si pensa alla sistemazione del contenuto su una pagina web. Sara Soueidan ci guida attraverso i vari modi in cui si pu\u00f2 usare questa propriet\u00e0, con risultati che vanno dal semplicemente elegante allo sbalorditivo.<\/p>\n","protected":false},"author":818,"featured_media":7000731,"comment_status":"open","ping_status":"open","template":"","categories":[],"tags":[],"coauthors":[420],"class_list":["post-461","article","type-article","status-publish","has-post-thumbnail","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/article\/461","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=461"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media\/7000731"}],"wp:attachment":[{"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/media?parent=461"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/categories?post=461"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/tags?post=461"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/alistapart.com\/it\/wp-json\/wp\/v2\/coauthors?post=461"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}