 
 
 <?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>upCreative &#187; web app</title>
	<atom:link href="https://www.upcreative.net/tag/web-app/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.upcreative.net</link>
	<description>Web Design, grafica,  web application e content web marketing</description>
	<lastBuildDate>Wed, 10 Apr 2019 12:53:28 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>Come creare Mobile App in HTML: il sistema di javascript templating</title>
		<link>https://www.upcreative.net/come-creare-mobile-app-in-html-sistema-di-javascript-templating/</link>
		<comments>https://www.upcreative.net/come-creare-mobile-app-in-html-sistema-di-javascript-templating/#comments</comments>
		<pubDate>Wed, 30 Apr 2014 09:02:16 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Risorse]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[html template]]></category>
		<category><![CDATA[HTML5 Mobile App]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile app]]></category>
		<category><![CDATA[single page application]]></category>
		<category><![CDATA[web app]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=3889</guid>
		<description><![CDATA[<p>Creare Mobile App in HTM, CSS3 e Javascript senza seguire una logica che possa permettere di mantenere organizzata la struttura del progetto è una pratica purtroppo molto diffusa. In questo articolo ti mostro come aumentare mantenibilità e scalabilità del codice generando markup HTML di un'applicazione tramite i sistemi di javascript templating.</p>
<p>The post <a rel="nofollow" href="https://www.upcreative.net/come-creare-mobile-app-in-html-sistema-di-javascript-templating/">Come creare Mobile App in HTML: il sistema di javascript templating</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			Per creare una <em>Mobile App in HTML</em> o una qualsiasi <em>web app javascript</em> è fondamentale organizzare il progetto secondo una <strong>struttura ben adeguata, </strong>evitando di produrre codice secondo la &#8220;non-logica&#8221; <em>Spaghetti Code </em>(leggi <a title="HTML5 Mobile App: come definire la struttura dati" href="http://www.upcreative.net/html5-mobile-app-come-definire-la-struttura-dati/">questo articolo</a> per saperne di più)<strong>.</strong></p>
<p>Come già affrontato in altri numerosi post, adottare una <a title="HTML5 Mobile App: l’importanza del framework MVC" href="http://www.upcreative.net/html5-mobile-app-limportanza-del-framework-mv/"><strong>logica di sviluppo basata sull&#8217;MVC</strong></a> può aiutare notevolmente lo sviluppatore a raggiungere tale obiettivo.</p>
<p>Un altro metodo molto utile per mantenere il codice <strong>scalabile</strong> e <strong>mantenibile</strong>, oltre che <a title="Le 6 migliori tecniche per aumentare le performance di una HTML5 Mobile App" href="http://www.upcreative.net/6-migliori-tecniche-per-le-performance-di-html5-mobile-app/"><strong>aumentare le performance</strong></a> dell&#8217;applicazione, consiste nell&#8217;utilizzo di <b>sistemi di Javascript templating</b> in stretta relazione con le <i>view</i>, che si occupano della rappresentazione visiva dei vari componenti dell’interfaccia.</p>
<p>I <em>sistemi di templating Javascript</em> consentono infatti di generare il markup dinamico di una determinata <em>view</em> (leggi <a title="HTML Mobile App: il funzionamento delle view" href="http://www.yourinspirationweb.com/2014/04/29/html-mobile-app-il-funzionamento-delle-view/">questo articolo che ho scritto per YourInspirationWeb  per sapere come utilizzare una view con backbone.js</a>) in base ai dati che gli vengono passati al momento della compilazione.</p>
<p>Prima di entrare più nel dettaglio, vediamo quali sono solitamente le alternative adottate per la generazione di markup in una Mobile App sviluppata in HTML5, CSS3 e Javascript.</p>
<hr />
<p><em>Come creare #MobileApp in #HTML5: il sistema di #javascript templating</em><br /><a href='https://twitter.com/share?text=Come+creare+%23MobileApp+in+%23HTML5%3A+il+sistema+di+%23javascript+templating&#038;via=upCreativeIta&#038;related=upCreativeIta&#038;url=https://www.upcreative.net/come-creare-mobile-app-in-html-sistema-di-javascript-templating/' target='_blank'>Click To Tweet</a></p>
<hr />
<h2>Creare Mobile App in HTML: come viene generato solitamente il markup</h2>
<p>Siccome in una HTML5 Mobile App tutta la generazione del <em>markup</em> e degli elementi DOM dell’interfaccia avviene tramite linguaggio <em>lato-client</em>, e quindi tramite javascript, generalmente si tende a seguire 3 strade principali per inserire il codice HTML di ogni schermata (o <em>view</em>) all’interno del progetto:</p>
<h4>1 &#8211; Effettuare chiamate ajax che restituiscono dati HTML da un server remoto.</h4>
<p><img class="aligncenter wp-image-3896 size-full" src="http://www.upcreative.net/wp-content/uploads/2014/04/mobile-app-html-template-via-ajax.jpg" alt="mobile-app-html-template-via-ajax" width="690" height="400" /></p>
<p>Rappresenta secondo me il tipo di approccio più sbagliato.</p>
<p>Stiamo parlando di applicazioni mobile e ciò comporterebbe il <strong>trasferimento di una grande quantità di dati</strong> e <strong>tempi di attesa più lunghi</strong>, soprattutto se l’utente sta usando l’applicazione in una zona fisica in cui il traffico è limitato o quasi assente.</p>
<p>Senza contare il fatto che il codice restituito (stringa formata dall&#8217;HTML generato dal server) risulta difficile da interpretare per l’applicazione JavaScript, e solitamente necessita di un&#8217;<strong>adeguata formattazione</strong> prima dell&#8217;immissione all&#8217;interno del documento.</p>
<p>La comunicazione in remoto dovrebbe essere pertanto utilizzata <strong>solo al fine di reperire o inviare dati &#8220;puri&#8221;</strong> (come per esempio un oggetto JSON).</p>
<h4>2 &#8211; Inserire l’HTML di tutte le schermate<i> </i>nel documento</h4>
<p><img class="aligncenter wp-image-3897 size-full" src="http://www.upcreative.net/wp-content/uploads/2014/04/mobile-app-html-statico.jpg" alt="mobile-app-html-statico" width="690" height="400" /></p>
<p>Per creare una Mobile App in HTML si utilizza un file principale <em>index.html. </em></p>
<p>Secondo questo metodo all&#8217;interno di quel file viene inserito tutto il markup necessario per far funzionare l&#8217;applicazione, relativo a alle varie <em>view</em> che la compongono.</p>
<p>Può andar bene per progetti formati al massimo da 4/5 schermate, dopo di ché diventa facile smarrirsi nei meandri del codice HTML come un bambino di 3 anni in un bosco.</p>
<p>Se poi consideriamo il fatto che in quelle <i>view</i> possiamo avere la necessità di inserire dati dinamici, per aggiungerli al DOM dovremmo comunque servirci di codice Javascript, utilizzando così non uno, ma due tipi di approcci diversi per lo stesso scopo (1 &#8211; html statico, 2 &#8211; generazione di <em>markup</em> via javascript).</p>
<p>Inoltre, inserire tutti i nodi DOM all’interno del documento <strong>riduce notevolmente le <a title="Performance CSS3: consigli per ottimizzare le animazioni" href="http://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/">prestazioni di <em>rendering</em></a></strong>, a causa del numero di elementi HTML per i quali la CPU è costretta a ricalcolare gli stili nel momento in cui si verifica qualsiasi modifica CSS, oppure ogni volta che un elemento si sposta nello schermo (quando ciò questo accade vengono coinvolti nello spostamento anche altri nodi del documento).</p>
<h4>3. Generare codice tramite javascript con una concatenazione di stringhe</h4>
<p><img class="aligncenter wp-image-3898 size-full" src="http://www.upcreative.net/wp-content/uploads/2014/04/html-mobile-app-markup-concatenazione-stringhe.jpg" alt="html-mobile-app-markup-concatenazione-stringhe" width="690" height="204" /></p>
<p>E&#8217; provato che creare grandi blocchi di codice HTML tramite una concatenazione di stringhe riduce drasticamente la velocità per le prestazioni di esecuzione, in quanto la variabile <em>in-memory</em> utilizzata per svolgere tale operazione va ad <strong>occupare parte della CPU</strong>.</p>
<p>Coloro che adottano questa tecnica inoltre, si perdono spesso in cicli nidificati in cui non si capisce quale <em>tag</em> chiude l’altro, e dove non si riesce a distinguere dati puri dall’HTML.</p>
<p>Ecco un possibile esempio di questa tecnica:</p><pre class="crayon-plain-tag">var markup = "&lt;div class=\"main-wrapper\"&gt;"+
				"&lt;header class=\"page-header\" role=\"header\"&gt;&lt;h1 class=\"\"&gt;&lt;/h1&gt;&lt;/header&gt;"+
				"&lt;section class=\"page-section\"&gt;&lt;/section&gt;"+
				"&lt;ul class=\"contacts-list\"&gt;";

			for(var i=0;i&lt;contacts.length;i++){
				markup+="&lt;li class=\"contact-list-item\"&gt;"+contacts[i].name+" "+contacts[i].surname+"&lt;/li&gt;";
			}

			markup+="&lt;/ul&gt;&lt;/div&gt;";

$(".content").append(markup);</pre><p>
&nbsp;</p>
<p>E’ preferibile invece <strong>lasciare libera la memoria del dispositivo per le operazioni di rendering</strong>, che influiscono sulla <em>user-experience</em> del prodotto finale, così come è preferibile <strong>lasciare separati codice HTML da codice Javascript</strong>, in modo da aumentare la <b>mantenibilità</b> e la <b>scalabilità </b>del progetto e poter facilmente <strong>riutilizzare</strong> uno stesso <em>template</em> in diverse parti<strong>.</strong></p>
<h2>Creare Mobile App in HTML: il funzionamento dei sistemi di templating</h2>
<p><img class="aligncenter wp-image-3894 size-full" src="http://www.upcreative.net/wp-content/uploads/2014/04/Crere-mobile-app-in-HTML-i-sistemi-di-Javascript-templating.jpg" alt="Crere-mobile-app-in-HTML---i--sistemi-di-Javascript-templating" width="690" height="400" /></p>
<p>Gli sviluppatori javascript hanno a disposizione diversi framework di templating per generare via <em>client</em> il markup HTML delle <em>view </em>che compongono le loro applicazioni (come per esempio <a href="http://handlebarsjs.com/"><i>Handlebars.js</i></a>, <i><a href="http://mustache.github.io/">Mustache</a>,</i> o il sistema interno al framework <a href="http://underscorejs.org/"><i>underscore.js</i></a>).</p>
<blockquote><p>Per conoscere anche altri sistemi di javascript templating, ti consiglio di leggere questo mio precedente articolo:</p>
<ul>
<li><a title="I sistemi di javascript templating e le migliori librerie" href="http://www.upcreative.net/web-application-i-sistemi-di-javascript-templating-e-le-migliori-librerie/">I sistemi di javascript templating e le migliori librerie</a></li>
</ul>
</blockquote>
<p>I <em>template</em> possono essere savat in variabili <strong>in-memory</strong><em>, in</em> <strong>file HTML indipendenti</strong> o <strong>all&#8217;interno del documento</strong>, solitamente racchiusi in tag <i>&lt;script&gt;</i> con un attributo &#8220;<i>type&#8221; </i>personalizzato (per esempio “<strong><em>text/template</em></strong>”:  “<em>&lt;script type=“text/template”&gt; &lt;!&#8211; markup del template —&gt; &lt;/script&gt;</em>”).</p>
<hr />
<p><em>[Tweet &#8220;Come creare #MobileApp in #HTML5: il sistema di #javascript templating</em><br /><a href='https://twitter.com/share?text=%5BTweet+%22Come+creare+%23MobileApp+in+%23HTML5%3A+il+sistema+di+%23javascript+templating&#038;via=upCreativeIta&#038;related=upCreativeIta&#038;url=https://www.upcreative.net/come-creare-mobile-app-in-html-sistema-di-javascript-templating/' target='_blank'>Click To Tweet</a></p>
<hr />&#8220;]
<p>Ogni template ha accesso a delle variabili, a seconda dei dati che gli vengono passati.</p>
<p>Utilizzare le variabili è molto semplice e generalmente è possibile farlo all’interno di <strong>appositi delimitatori</strong>, il cui funzionamento non è molto diverso da quello della generazione del markup HTML dinamico tramite i più diffusi linguaggi <em>lato-server</em> (ASP, PHP, C# ecc.).</p>
<p>Il lavoro è reso ancora più facile per il fatto che la maggior parte di questi sistemi accetta dati in formato JSON (formato in cui può essere convertito facilmente qualsiasi tipo di dati).</p>
<p>I delimitatori delle variabili possono differire a seconda del framework utilizzato, ma il funzionamento logico rimane pressoché sempre lo stesso.</p>
<p>Due sono le categorie principali in cui si suddividono i vari tipi di sistemi di templating:</p>
<ul>
<li><b>embedded javascript, </b>comprende i frameworks che permettono l’utilizzo di codice javascript all’interno dei propri template</li>
<li><b>logic less, </b>comprende quelli che non permettono l’utilizzo di javascript al loro interno, ma limitano l’uso di logiche come cicli e condizioni a sintassi personalizzate</li>
</ul>
<p>Vediamo il funzionamento del sistema di templating di <strong><i>underscore.js</i>,</strong> che appartiene alla prima categoria, e che può essere utilizzato per <a title="Semplice HTML5 Mobile App con Bootstrap Ratchet e Backbone.js" href="http://www.upcreative.net/smplice-html5-mobile-app-bootstrap-ratchet-backbone-js/">creare mobile app in html con il framework MVC <i>Backbone.js</i></a><b>.</b></p>
<p>Più concretamente, vediamo l’esempio di un ciclo che genera in maniera dinamica l’HTML necessario per mostrare una lista di individui.</p>
<p>Consideriamo di dover generare il markup della lista servendoci dei seguenti dati in formato JSON:</p><pre class="crayon-plain-tag">{
	'employees': [
		{‘name': ‘Giacomo Freddi’, occupation: ‘Web Designer / Front-End Developer’},
		{‘name': ‘Mario Rossi’, occupation: ‘CEO’},
		{‘name': ‘Franco Mancini’, occupation: ‘Web Marketer’},
		...
	]
}</pre><p>
Ecco come potrebbe presentarsi il template secondo il sistema di templating di <i>underscore.js</i></p><pre class="crayon-plain-tag">&lt;ul&gt;
   &lt;%for(var i=0;i&lt;employees.length;i++){%&gt;
   &lt;li&gt;&lt;%=employees[i].name%&gt; - &lt;%=employees[i].occupation%&gt;&lt;/li&gt; 
   &lt;%}%&gt;
&lt;/ul&gt;</pre><p>
In tal caso il risultato del markup generato sarebbe:</p><pre class="crayon-plain-tag">&lt;ul&gt;
   &lt;li&gt;Giacomo Freddi - Web Designer / Front-End Developer&lt;/li&gt;
   &lt;li&gt;Mario Rossi - CEO&lt;/li&gt;
   &lt;li&gt;Franco Mancini - Web Marketer&lt;/li&gt;
   …
&lt;/ul&gt;</pre><p>
Con i javascript templating lo sviluppatore ha sicuramente una cosa in meno a cui pensare, in quanto la maggior parte del lavoro di generazione del markup viene svolto dal sistema stesso.</p>
<h2>Creare mobile app in HTML: i benefici del sistema di templating</h2>
<p>Ciò porta ad un gran numero di benefici nel creare mobile app in HTML o qulasiasi <em>single page application</em>, in particolare se si decide di salvare i <em>template</em> di ogni <i>view</i> all&#8217;esterno del documento principale dell’applicazione (<i>index.html</i>), inserendo ognuno di essi in un apposito file (es.: <i>nome-della-view.html).</i></p>
<p>Il contenuto del file viene poi caricato dinamicamente, solamente se e quando abbiamo bisogno di effettuare il <em>render</em> di quella <i>view </i>all’interno dell’interfaccia.</p>
<p>Quello appena esposto è il metodo che preferisco, in quanto permette di separare completamente all&#8217;interno del progetto il concetto di <em>templating</em> da tutto il resto (sinonimo di <em>mantenibilità</em> e <em>scalabilità</em>) e, nel senso più &#8220;fisico&#8221; del termine, ogni <i>view</i> dall&#8217;altra.</p>
<p>Così facendo è possibile mantenere la struttura dei file dell’applicazione ancora <strong>più organizzata</strong>.</p>
<p><img class="aligncenter wp-image-3895 size-full" src="http://www.upcreative.net/wp-content/uploads/2014/04/html-mobile-app-javascript-templating.jpg" alt="html-mobile-app-javascript-templating" width="690" height="400" /></p>
<p>Bisogna comunque  fare attenzione al fatto che <b>i template non rappresentano di per sé delle <i>view</i></b><i>,</i> bensì lo strumento grazie al quale esse possono effettuare il <em>render</em> del markup HTML che le rappresenterà all’interno del documento. Molti sviluppatori spesso confondono il concetto di <i>view</i> con quello di <i>template,</i> ma <b>non sono assolutamente la stessa cosa</b>.</p>
<p>Una <i>view</i> è un oggetto che che <i>osserva</i> un modello dati (in MVC i cosiddetti <i>model</i>) e <strong>mantiene la propria rappresentazione visiva aggiornata</strong> in base ad esso. Una <em>view</em> è definita da codice <i>Javascript</i>.</p>
<p>Il <i>template</i> potrebbe essere lo strumento di cui si serve la <i>view</i> per generare parte del proprio <em>markup</em> necessario alla visualizzazione, o di tutto il <em>markup</em> necessario.</p>
<hr />
<p><em>Come creare #mobileapp in #HTML5 &#8211; i benefici del #javascript #templating</em><br /><a href='https://twitter.com/share?text=Come+creare+%23mobileapp+in+%23HTML5+-+i+benefici+del+%23javascript+%23templating&#038;via=upCreativeIta&#038;related=upCreativeIta&#038;url=https://www.upcreative.net/come-creare-mobile-app-in-html-sistema-di-javascript-templating/' target='_blank'>Click To Tweet</a></p>
<hr />
<h2>Conclusioni</h2>
<p>Oltre che per creare mobile app in HTML o qualsiasi altro tipo di <em>web app </em>sviluppata<em> </em>in HTML, CSS3 e Javascript, i sistemi di templating sono molto utilizzati anche per la realizzazione di siti web che forniscono una <em>user-experience</em> di qualità molto elevata.</p>
<p>Solitamente gli sviluppatori <em>front-end</em> più affermati si servono di sistemi di javascript templating per generare markup da template salvati in file .<em>html</em> esterni, o dichiarati all&#8217;interno della pagina in appositi <em>script</em> personalizzati.</p>
<p>E tu hai mai utilizzato i sistemi di javascript templating? Ne hai privato qualcuno da suggerire? Scrivilo nei commenti e sarò felice di risponderti!
		</div> 
	</div> <div class="g-cols color_alternate w-actionbox"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Crea la tua mobile app in HTML, CSS3 e Javascript</h3>
<p>Utilizzando questa tecnica insieme a molte altre, ho realizzato più di 10 mobile app in HTML, CSS3 e Javascript (tra cui <a title="Tint HTML mobile app" href="http://www.upcreative.net/tint-weather-app/">Tint</a> e <a title="Dieta SI o NO? HTML Mobile app" href="http://www.upcreative.net/app-dieta-si-o-no/">Dieta SI o NO?</a>).</p>
<p>Se anche tu vuoi realizzare la tua applicazione in HTML, CSS e javascript da distribuire nei vari store, forse potrebbe interessarti il mio e-book <strong><a title="HTML Mobile Accelerato - Come creare una mobile app in HTML, CSS e Javacript" href="http://www.upcreative.net/html-mobile-accelerato/">HTML Mobile Accelerato</a>.</strong>
		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_single_image wpb_content_element align_center">
		<div class="wpb_wrapper">
			
			<a href="http://www.upcreative.net/html-mobile-accelerato/"><img width="563" height="418" src="http://www.upcreative.net/wp-content/uploads/2013/11/HTML-mobile-accelerato-ebook-cover1.png" class="attachment-full" alt="HTML-mobile-accelerato-ebook-cover" /></a>
		</div> 
	</div> 
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="widget_wysija_cont shortcode_wysija"><div id="msg-form-wysija-shortcode6ab3423a73dca-4" class="wysija-msg ajax"></div><form id="form-wysija-shortcode6ab3423a73dca-4" method="post" action="#wysija" class="widget_wysija shortcode_wysija">
<p class="wysija-paragraph">
    
    
    	<input type="text" name="wysija[user][email]" class="wysija-input validate[required,custom[email]]" title="Inserisci la tua mail" placeholder="Inserisci la tua mail" value="" />
    
    
    
    <span class="abs-req">
        <input type="text" name="wysija[user][abs][email]" class="wysija-input validated[abs][email]" value="" />
    </span>
    
</p>
<input class="wysija-submit wysija-submit-field" type="submit" value="Tienimi aggiornato/a" />

    <input type="hidden" name="form_id" value="4" />
    <input type="hidden" name="action" value="save" />
    <input type="hidden" name="controller" value="subscribers" />
    <input type="hidden" value="1" name="wysija-page" />

    
        <input type="hidden" name="wysija[user_list][list_ids]" value="4,1" />
    
 </form></div>
		</div> 
	</div> </div></div></div></div>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/come-creare-mobile-app-in-html-sistema-di-javascript-templating/">Come creare Mobile App in HTML: il sistema di javascript templating</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/come-creare-mobile-app-in-html-sistema-di-javascript-templating/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Come realizzare una progress bar CSS3 per una HTML Mobile App</title>
		<link>https://www.upcreative.net/come-realizzare-una-progress-bar-css3-per-una-html-mobile-app/</link>
		<comments>https://www.upcreative.net/come-realizzare-una-progress-bar-css3-per-una-html-mobile-app/#comments</comments>
		<pubDate>Thu, 02 Jan 2014 09:37:23 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[HTML Mobile App]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[progress bar]]></category>
		<category><![CDATA[web app]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=2898</guid>
		<description><![CDATA[<p>The post <a rel="nofollow" href="https://www.upcreative.net/come-realizzare-una-progress-bar-css3-per-una-html-mobile-app/">Come realizzare una progress bar CSS3 per una HTML Mobile App</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>In altri articoli ho discusso l&#8217;importanza delle performance per quanto riguarda lo sviluppo di <strong>HTML mobile app</strong> tramite <strong>CSS3</strong> e <strong>Javascript</strong>.</p>
<p>Durante la realizzazione di un&#8217;applicazione destinata a dispositivi mobile è importante sviluppare ogni effetto e animazione tenendo conto delle performance, fattore che su smartphone o tablet con sistemi operativi iOS, Android e Windows Phone diventa un vero e proprio must, se si vuole fornire all&#8217;utente un&#8217;<strong>interfaccia piacevole, fluida e reattiva</strong>.</p>
<p>In questo post voglio proporti il &#8220;modo performante&#8221; di realizzare una <strong>progress bar CSS3 con HTML5 e Javascript </strong>che risulti leggera ai fini del <strong>processo di rendering</strong> e piacevole all&#8217;occhio dell&#8217;utente, mentre egli interagisce con l&#8217;interfaccia.</p>
<p>Per capire meglio quali sono i punti chiave del codice CSS3, ma soprattutto la differenza visiva, ci soffermeremo su come scrivere la stessa animazione anche in modo poco performante.</p>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2014/01/Come-realizzare-una-progress-bar-CSS3-per-una-HTML-Mobile-App.jpg"><img class="alignnone size-full wp-image-2913" alt="Come-realizzare-una-progress-bar-CSS3-per-una-HTML-Mobile-App" src="http://www.upcreative.net/wp-content/uploads/2014/01/Come-realizzare-una-progress-bar-CSS3-per-una-HTML-Mobile-App.jpg" width="690" height="400" /></a></p>

		</div> 
	</div> <div class="g-cols"><div class="one-half"><div class="wpb_button align_center"><a href="http://www.upcreative.net/tutorials/02012013progressbar-html-mobile-app/"class="g-btn type_primary size_big"><span><i class="fa fa-eye-open"></i>Demo</span></a></div>
</div><div class="one-half"><div class="wpb_button align_center"><a href="http://www.upcreative.net/download/2908/"class="g-btn type_primary size_big"><span><i class="fa fa-download-alt"></i>Download</span></a></div>
</div></div>
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h2></h2>
<h2>Due progress bar CSS3 a confronto</h2>
<p>Il mio principale intento con questo articolo, oltre quello di mostrarti diverse strade per realizzare lo stesso effetto, è sottolineare la differenza che si può avere agendo con due tecniche separate:</p>
<ol>
<li>quella che sfrutta la composizione dei <strong>layer grafici</strong> (alta performance e fluidità)</li>
<li>quella che costringe il browser a <strong>ripetere l&#8217;intero processo di rendering per ogni keyframe</strong> dell&#8217;animazione (bassa performance e movimenti scattosi)</li>
</ol>
<p><em>Al fine di comprendere meglio i concetti di <strong>processo di rendering</strong> e dei <b>layer</b><strong> grafici</strong> ti consiglio di leggere rispettivamente questi due post (credimi, se sei un front-end developer ne vale proprio la pena):</em></p>
<ol>
<li><em><a title="Scrivere animazioni performanti per le HTML Mobile App " href="http://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/">Come ottimizzare le animazioni per i dispositivi mobile</a></em></li>
<li><em></em><em style="line-height: 1.5em;"><a title="HTML Mobile App fluide con i layer grafici e l'accelerazione hardware" href="http://www.upcreative.net/web-e-mobile-app-fluide-con-layer-e-hardware-acceleration/">Scrivere HTML Mobile App fluide con i layer grafici e l&#8217;accelerazione hardware</a></em></li>
</ol>
<p>In questo esperimento realizzeremo quindi due progress bar CSS3, la versione fluida, e quella con scarse prestazioni.</p>
<h2>Il markup HTML</h2>
<p>Vediamo il (semplice) markup HTML delle due progress bar:</p><pre class="crayon-plain-tag">&lt;!--
Progress bar fluida e performante
--&gt;

&lt;div class="progress-box fast"&gt;
	&lt;div class="progress-inner"&gt;&lt;/div&gt;
	&lt;i class="fa fa-check"&gt;&lt;/i&gt;
&lt;/div&gt;

&lt;!--
Progress bar scattosa e poco performante
--&gt;

&lt;div class="progress-box low"&gt;
	&lt;div class="progress-inner"&gt;&lt;/div&gt;
	&lt;i class="fa fa-check"&gt;&lt;/i&gt;
&lt;/div&gt;</pre><p>
&nbsp;</p>
<p>In particolare usiamo la div con classe <em>.progress-box </em>come contenitore principale, il quale presenta al suo interno la barra che sarà animata (classe <em>.progress-inner</em>) e l&#8217;icona che mostreremo alla fine dell&#8217;animazione, per comunicare all&#8217;utente che l&#8217;operazione (qualunque essa sia) è andata a buon fine.</p>
<p>Come puoi vedere dal codice l&#8217;unica differenza tra le due progress bar sono le classi &#8220;<em>fast</em>&#8221; o &#8220;<em>low</em>&#8221; applicate al contenitore principale <em>progress-box;</em> è grazie ad esse che assegneremo ai due elementi DOM degli stili diversi per realizzare lo stesso tipo di effetto.</p>
<h2>Gli stili CSS3</h2>
<p>Impostiamo gli stili per il contenitore (<em>progress-box</em>), per la barra da animare (<em>progress-inner</em>) e per l&#8217;icona di completamento dell&#8217;operazione: alla prima attribuiamo la proprietà <em>position:</em><i>relative, mentre </i>alla seconda e alla terza <em>position:absolute</em>, in modo da poterle muovere all&#8217;interno del contenitore con più facilità (utilizzando gli attributi &#8220;<em>top</em>&#8220;, &#8220;<em>left</em>&#8221; ):</p><pre class="crayon-plain-tag">.progress-box {
	position: relative;
	background: #3BB563;
	height:30px;
	width:300px;
	margin:20px auto;
}

/*progress bar*/
.progress-box .progress-inner {
	position: absolute;
	top: 0;
	left: 0;
	height: 100%;		
	background: #0e7138;
}

/*icona dello stato completo della'animazione*/	
.progress-box i{
	position: absolute;
	top:7px;
	right:7px;
	color:#FFF;

	/*
		animazione molto leggera, sfrutta la creazione dei layers
		tramite le prop. opacity e transform, da caricare poi nella GPU;

		allo stato iniziale "nascondiamo" l'icona con l'opacity: 0
		e la trasliamo "indietro" di 30px
	*/

	opacity:0;		

	-webkit-transform: translateX(-30px);
	   -moz-transform: translateX(-30px);
	    -ms-transform: translateX(-30px);
	     -o-transform: translateX(-30px);
	        transform: translateX(-30px);

}</pre><p>
Allo stato iniziale l&#8217;icona, che non deve essere visibile fino al completamento dell&#8217;operazione, è stata impostata non visibile tramite la trasparenza (<i>opacity:0</i>) e traslata &#8220;indietro&#8221; di <em>30px</em> tramite la proprietà CSS3 <em>transform: </em><i>traslateX(-30px) </i>(con tutti i relativi prefissi del caso per la compatibilità).</p>
<p>Vediamo ora come animare la progressabar con classe <em>low </em>&#8220;alla vecchia maniera&#8221;, tramite codice poco perforemante:</p><pre class="crayon-plain-tag">.progress-box.low .progress-inner {

	/*
	la larghezza iniziale allo 0%;
	sarà poi modificata tramite Javascript e portata al 100%
	*/

	width: 0;

	/*
	animazione pesante, sfrutta la proprietà width: il browser deve ripercorrere tutto il 
	processo di rendering per ogni keyframe dell'animazione
	*/

	-webkit-transition: width 3s;
	   -moz-transition: width 3s;
	    -ms-transition: width 3s;
	     -o-transition: width 3s;
	        transition: width 3s;
}</pre><p>
&nbsp;</p>
<p>Abbiamo agito sulla proprietà &#8220;<em>width</em>&#8220;, che fa parte del <strong>primo step del processo di rendering</strong><em> </em>e che quindi costringe il browser a ripetere tale processo (eseguendo tutti gli step che lo compongono) ad ogni keyframe dell&#8217;applicazione, provocando un effetto di &#8220;sfarfallio&#8221;.</p>
<p>Passiamo ora invece a degli stili decisamente più performanti, quelli della progress bar con classe <em>fast</em>:</p><pre class="crayon-plain-tag">.progress-box.fast .progress-inner {

	/*
	la larghezza iniziale è gia al 100%;
	ma la prop. transform:scaleX è a 0; sarà poinportata tramite javascript 
	al 100% della sua larghezza impostando il valore 1
	*/

	width:100%;

   /*
	   impostiamo l'origine della trasformazione, 
	   che di defualt sarebbe al 50%, ma noi vogliamo che
	   inizi da sinistra (appunto 0)
   */	

   -webkit-transform-origin-x: 0;
   	  -moz-transform-origin-x: 0;
   	   -ms-transform-origin-x: 0;
   	    -o-transform-origin-x: 0;
   		   transform-origin-x: 0;

   -webkit-transform: scaleX(0);
      -moz-transform: scaleX(0);
       -ms-transform: scaleX(0);
        -o-transform: scaleX(0);
           transform: scaleX(0);

	/*
	animazione fluida e perfomante, sfrutta la proprietà transform, 
	che fa parte dell'ultimo step del processo di rendering del browser, 
	quello della creazione dei layer. Lo stile transform viene eseguito sulla 
	memoria grafica (la GPU) separatamente
	*/

	-webkit-transition: -webkit-transform 3s;
	      -moz-transition: -moz-transform 3s;
	        -ms-transition: -ms-transform 3s;
	          -o-transition: -o-transform 3s;
	                transition: transform 3s;
}</pre><p>
Qui realizziamo l&#8217;animazione impostando la proprietà <i>transition</i> in modo da agire sul <em>transform, </em>per forzare la creazione dei <a title="Hardware acceleration e layer grafici per HTML mobile App" href="http://www.upcreative.net/web-e-mobile-app-fluide-con-layer-e-hardware-acceleration/">layer grafici</a>, i quali fanno parte del <strong>terzo step del processo di rendering.</strong> Così facendo la creazione dei relativi effetti viene <strong>delegata alla memoria grafica</strong> (la GPU).</p>
<h2>Il codice Javascript</h2>
<p>Passiamo ora al semplice codice javascript per gestire gli eventi di azione sui pulsanti che avviano e resettano l&#8217;operazione (&#8220;<em>#start</em>&#8221; e &#8220;<em>#reset</em>&#8220;):</p><pre class="crayon-plain-tag">$("#start").on("click", function(){

	var fastProgressScale = "scaleX(1)";

	/*
	progress bar performante: 
	lavoriamo sulla prop. "transform" che fa parte del 3° step 
	del processo di rendering, e forza la creazione di un layer 
	da delegare alla GPU (alleggerisce il carico di lavoro)
	*/
	if(!$(".progress-box.fast").hasClass("complete"))		    	
    	$(".progress-box.fast .progress-inner")
    	.css({
	    	"-webkit-transform": fastProgressScale,
	    	"-moz-transform":    fastProgressScale,
	    	"-ms-transform":     fastProgressScale,
	    	"-o-transform":      fastProgressScale,
	    	"transform":          fastProgressScale
    	})		    	
    	.one(transitionEventName, function(){
	    	$(".progress-box.fast").addClass("complete");
    	});	

	/*
	progress bar poco performante: 
	lavoriamo sulla prop. "width" che fa parte del 1° step 
	del processo di rendering 
	*/
	if(!$(".progress-box.low").hasClass("complete"))
    	$(".progress-box.low .progress-inner")
    	.css("width", "100%").one(transitionEventName, function(){
	    	$(".progress-box.low").addClass("complete");
    	});		    	

});

$("#reset").on("click", function(){		    	

	//rimettiamo i due stati a 0

	var fastProgressScale = "scaleX(0)";
	$(".progress-box.fast").removeClass("complete")
	.find(".progress-inner").css({
    	"-webkit-transform": fastProgressScale,
    	"-moz-transform":    fastProgressScale,
    	"-ms-transform":     fastProgressScale,
    	"-o-transform":      fastProgressScale,
    	"transform":          fastProgressScale
	});

	$(".progress-box.low").removeClass("complete")
	.find(".progress-inner").css("width", "0"); 

});</pre><p>
Al click del pulsante <em>#start</em> impostiamo semplicemente la proprietà <em>width </em>al <em>100%</em> per la progress lenta, e la proprietà &#8220;<em>transform:scaleX</em>&#8221; ad <i>1 </i>(che equivale al 100% ) per la progress fluida.</p>
<p>Al click del pulsante &#8220;#reset&#8221; riportiamo le due progress bar ai valori iniziali, avendo come risultato un&#8217;animazione con effetto contrario.</p>
<h2>Conclusioni e considerazioni</h2>
<p>Con la demo è possibile visualizzare la grande differenza tra la progress bar scritta in modo performante e quella scritta in modo poco performante: la prima risulta fluida e piacevole visivamente, mentre la seconda è scattante e presenta un notevole sfarfallio (<strong>ti consiglio di visualizzare l&#8217;esempio in un dispositivo mobile</strong>).</p>
<p>In un&#8217;eventuale HTML mobile app (ma anche in qualsiasi web app che sfrutta le funzionalità dei CSS3), impiegare più effetti con scarse performance, oltre ad una <em>user-experience </em>sgradevole, può provocare <strong>crash continui dell&#8217;applicazione</strong>, e incidere notevolmente sul giudizio che gli utenti attribuiscono al nostro prodotto (con conseguente impatto negativo sulla community).</p>
<p>Dall&#8217;altro lato invece, se <strong>scriviamo le nostre animazioni CSS3 in modo da sfruttare correttamente il lavoro della GPU</strong>, avremo come risultato un&#8217;applicazione piacevole, fluida e performante, e la differenza con quelle native sarà pressoché inesistente.</p>
<p>&nbsp;</p>

		</div> 
	</div> <div class="g-cols"><div class="one-half"><div class="wpb_button align_center"><a href="http://www.upcreative.net/tutorials/02012013progressbar-html-mobile-app/"class="g-btn type_primary size_big"><span><i class="fa fa-eye-open"></i>Demo</span></a></div>
</div><div class="one-half"><div class="wpb_button align_center"><a href="http://www.upcreative.net/download/2908/"class="g-btn type_primary size_big"><span><i class="fa fa-download-alt"></i>Download</span></a></div>
</div></div><div class="g-hr">
						<span class="g-hr-h">
							<i class="fa fa-star"></i>
						</span>
					</div><div class="g-cols color_alternate w-actionbox"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Crea la tua mobile app in HTML, CSS3 e Javascript</h3>
<p>Utilizzando questa tecnica insieme a molte altre, ho realizzato più di 10 mobile app in HTML, CSS3 e Javascript (tra cui <a title="Tint HTML mobile app" href="http://www.upcreative.net/tint-weather-app/">Tint</a> e <a title="Dieta SI o NO? HTML Mobile app" href="http://www.upcreative.net/app-dieta-si-o-no/">Dieta SI o NO?</a>).</p>
<p>Se anche tu vuoi realizzare la tua applicazione in HTML, CSS e javascript da distribuire nei vari store, forse potrebbe interessarti il mio e-book <strong><a title="HTML Mobile Accelerato - Come creare una mobile app in HTML, CSS e Javacript" href="http://www.upcreative.net/html-mobile-accelerato/">HTML Mobile Accelerato</a>.</strong></p>

		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_single_image wpb_content_element align_center">
		<div class="wpb_wrapper">
			
			<a href="http://www.upcreative.net/html-mobile-accelerato/"><img width="563" height="418" src="http://www.upcreative.net/wp-content/uploads/2013/11/HTML-mobile-accelerato-ebook-cover1.png" class="attachment-full" alt="HTML-mobile-accelerato-ebook-cover" /></a>
		</div> 
	</div> </div></div></div></div>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/come-realizzare-una-progress-bar-css3-per-una-html-mobile-app/">Come realizzare una progress bar CSS3 per una HTML Mobile App</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/come-realizzare-una-progress-bar-css3-per-una-html-mobile-app/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Web e Mobile app fluide con layer e hardware acceleration</title>
		<link>https://www.upcreative.net/web-e-mobile-app-fluide-con-layer-e-hardware-acceleration/</link>
		<comments>https://www.upcreative.net/web-e-mobile-app-fluide-con-layer-e-hardware-acceleration/#comments</comments>
		<pubDate>Mon, 23 Dec 2013 17:06:08 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Risorse]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[animazioni]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[HTML Mobile App]]></category>
		<category><![CDATA[transizioni]]></category>
		<category><![CDATA[web app]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=2830</guid>
		<description><![CDATA[<p>Molte volte ho affrontato il discorso dell&#8217;importanza delle prestazioni, e su come esse incidono notevolmente nella realizzazione di applicazioni web e mobile scritte in HTML, CSS3 e Javascript. Numerosi web developer durante lo sviluppo dei propri lavori non tengono conto del rendering</p>
<p>The post <a rel="nofollow" href="https://www.upcreative.net/web-e-mobile-app-fluide-con-layer-e-hardware-acceleration/">Web e Mobile app fluide con layer e hardware acceleration</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>Molte volte ho affrontato il discorso dell&#8217;importanza delle prestazioni, e su come esse incidono notevolmente nella <a title="10 mobile frameworks per la realizzazione di Applicazioni HTML5, CSS3 e javascript " href="http://www.upcreative.net/8-mobile-framework-per-applicazioni-html5-css-javascript/">realizzazione di applicazioni web e mobile scritte in HTML, CSS3 e Javascript</a>. Numerosi web developer durante lo sviluppo dei propri lavori non tengono conto del <strong>rendering</strong> del browser, ovvero del processo tramite il quale avviene la rappresentazione degli elementi DOM nello schermo, quando invece è uno dei fattori che influiscono maggiormente sulle prestazioni di un&#8217;interfaccia.</p>
<p>Con i browser più moderni, compresi quelli dei dispositivi mobile, abbiamo la possibilità di sfruttare il rendering a &#8220;schede grafiche&#8221;, comunemente conosciuto come <strong>accelerazione hardware </strong>(<em>hardware acceleration</em>). Esso rappresenta un modo molto efficace per aumentare la reattività e la fluidità di animazioni e la creazione di documenti DOM complicati.</p>
<p>Forse ti può interessare questo articolo su <a title="Come ottimizzare le performance CSS3 per aumentarne le prestazioni" href="http://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/">come scrivere animazioni CSS3 per ottmizzarne le performance</a>.</p>
<p><span style="line-height: 1.5em;">Sfruttando l&#8217;accelerazione hardware è possibile quindi realizzare web application con una user-experience avanzata e, soprattutto per quanto riguarda i dispositivi mobile, inserire effetti ed animazioni che ci permettono di cerare prodotti dalle prestazioni molto simili a quelle native.</span></p>
<hr />
<p><em>Con l&#8217;accelerazione hardware è possibile creare ottime #webapplication e #mobileapp</em><br /><a href='https://twitter.com/share?text=Con+l%27accelerazione+hardware+%C3%A8+possibile+creare+ottime+%23webapplication+e+%23mobileapp&#038;via=upCreativeIta&#038;related=upCreativeIta&#038;url=https://www.upcreative.net/web-e-mobile-app-fluide-con-layer-e-hardware-acceleration/' target='_blank'>Click To Tweet</a></p>
<hr />
<p>In questo articolo voglio introdurre il concetto di <strong>layers</strong>, e di come possiamo servircene per <strong>aumentare la fluidità delle tue animazioni CSS3</strong>.</p>
<h3>Prima di iniziare</h3>
<p>Prima di andare avanti vorrei discutere sulla compatibilità: il sistema di rendering basato sull&#8217;accelerazione hardware non è ancora supportato da tutti i tipi di browser, ma solamente da quelli più moderni, i quali possono eseguire la rappresentazione del markup nello schermo sia tramite la classica metodologia che tramite i layers.</p>
<p>Tuttavia gli attuali browser sono in costante aggiornamento e ogni volta che vengono rilasciate versioni più recenti, essi si presentano maggiormente compatibili con questa caratteristica.</p>
<p>In particolare l&#8217;accelerazione hardware è ben supportata da tutti i browser basati su <em>webkit e </em>da quelli presenti nei recenti sistemi operativi Windows, per cui risulta uno strumento fondamentale per realizzare <strong>HTML5 mobile app</strong>, in quanto tutti i mobile browser (o perlomeno quelli su sistemi iOS, Android e Windows Phone), ne possono beneficiare.</p>
<p>Per quanto riguarda i siti web invece, se deciderai di servirti dell&#8217;<em>hardware acceleration</em>, sarà opportuno inserire dei <em>fallback per i browser meno recenti. </em>Puoi trovare un esempio di fallback in questo <a title="CSS3 slide panel: tutorial su come realizzare un menu stile mobile" href="http://www.upcreative.net/css3-slide-panel-tutorial-creare-menu-mobile/">tutorial su come realizzare un menu stile mobile</a>.</p>
<h2>Concetti base</h2>
<p>Quando parliamo di layer dobbiamo fare una distinzione fra due tipologie, quella dei &#8220;<strong><em>Layer di Rendering</em></strong>&#8221; e quella dei &#8220;<strong><em>Layer Grafici</em></strong>&#8220;: entrambi fanno parte del processo di rappresentazione degli elementi della pagina nello schermo (rendering). I primi si preoccupano di gestire i sottolivelli degli elementi DOM, mentre i secondi gestiscono i sottolivelli dei <em>Layer di Rendering</em>.</p>
<p>Quando cito i &#8220;layer per le rappresentazioni e le animazioni CSS3&#8243;, mi riferisco ai Layer Grafici, che sono quelli il cui rendering è delegato alla GPU (la memoria video), la quale se ne occupa sottoforma di <strong><em>texture.  </em></strong>La texture è un oggetto facilmente modificabile, la cui trasformazione non richiede un grosso impiego di risorse.</p>
<p>Questo è sostanzialmente il motivo per cui le trasformazioni 3D CSS sono molto performanti: esse fanno parte di un processo separato dal flusso di lavoro della memoria principale, in quanto vengono eseguite nella GPU.</p>
<p>Per citare un esempio concreto, le trasformazioni CSS3 3D sono usate nelle mobile app con la tecnica del fast scrolling:</p>
<p>&nbsp;</p><pre class="crayon-plain-tag">.content {
  -webkit-overflow-scrolling: touch;
}
.content &gt; * {
  -webkit-transform: translateZ(0px);
          transform: translateZ(0px);
}</pre><p>
&nbsp;</p>
<p>Il codice mostrato in questo esempio sfrutta l&#8217;accelerazione hardware per forzare il rendering degli elementi con <em>position:relative</em> e <em>position:absolute</em> durante lo scroll nei dispositivi mobile (la conoscevi?).</p>
<h2>Il funzionamento</h2>
<p>Ma perché gli effetti e le trasformazioni operate dalla GPU sui layer sono più veloci?</p>
<p>Il funzionamento non è niente di particolarmente complicato: quando il browser deve modificare delle determinate caratteristiche per un elemento DOM (più avanti vedremo quali), esso si preoccuperà di creare un <em>layer</em> che rappresenti quell&#8217;elemento (insieme a tutti i suoi sotto elementi). Il layer non è altro che un<strong>&#8216;immagine <em>bitmap</em></strong>, che viene caricata nella GPU, la quale ne modificherà elementi grafici come trasparenza, rotazione, scale ecc..</p>
<p>Ecco quindi svelato il mistero della velocità: <strong>tutte le modifiche apportate nella GPU sono applicate ad un&#8217;immagine</strong>.</p>
<p style="text-align: center;"><span style="color: #ff0000;"><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/12/hardware-acceleration.jpg"><img class="size-full wp-image-2843 aligncenter" alt="hardware-acceleration" src="http://www.upcreative.net/wp-content/uploads/2013/12/hardware-acceleration.jpg" width="690" height="420" /></a></span></p>
<p>Ma cosa succede se il contenuto di quel layer viene modificato?</p>
<p>Se abbiamo bisogno di modificare il contenuto del layer, il browser dovrà rieffettuare l&#8217;intera operazione: il processo di rendering prima (ho descritto i relativi step in <a title="CSS3 slide panel: tutorial su come realizzare un menu stile mobile" href="http://www.upcreative.net/css3-slide-panel-tutorial-creare-menu-mobile/">questo articolo</a>), e l&#8217;upload della <em>bitmap </em>alla GPU dopo.</p>
<p>Per cui, al fine di preservare la fluidità degli effetti applicati ad un elemento, ci si deve preoccupare di modificare il meno possibile le caratteristiche CSS che implicano la ripetizione del processo di disegno.</p>
<h2>Come scatenare la creazione di un layer</h2>
<p>Abbiamo compreso il vantaggioso funzionamento della creazione dei layer da parte del browser e della delegazione alla GPU, ora vediamo come fare in modo che il browser trasformi un elemento DOM in un layer.</p>
<p>Il browser crea un layer per ogni elemento al quale sono applicate proprietà CSS di trasformazioni 3D o di trasformazioni con prospettiva (es: <em>transform: translate3d(&#8230;);  o perspective: &#8230;;</em>), e per ogni elemento che interagisce in qualche maniera con un elemento avente quelle caratteristiche.</p>
<p>&nbsp;</p>
<p style="text-align: center;"><img class="size-full wp-image-2845 aligncenter" style="line-height: 1.5em;" alt="hardware-acceleration-con-rotate3d" src="http://www.upcreative.net/wp-content/uploads/2013/12/hardware-acceleration-con-rotate3d.jpg" width="318" height="546" /></p>
<p style="text-align: center;"><span style="color: #808080;"><em>esempio di animazione che sfrutta la proprietà transform: translate3d</em></span></p>
<p style="text-align: center;">
<p>Per cui per &#8220;stimolare&#8221; la creazione di un layer per un elemento, dovremo scrivere gli stili CSS in modo da agire su determinate proprietà CSS invece che su altre.</p>
<p>In particolare, l&#8217;upload alla GPU avviene nel caso di elementi:</p>
<ul>
<li>che hanno proprietà CSS 3d o di prospettiva</li>
<li>sui quali viene applicata un&#8217;animazione che comprende quelle proprietà</li>
<li>che si sovrappongono a dei layers presenti nel loro stesso livello DOM (aventi un <em>z-index</em> minore)</li>
<li>che hanno dei layer come sottoelementi</li>
<li>a cui sono applicati filtri CSS avanzati (es.: <em>filter: blur(&#8230;) </em>o<em> filter: grayscale(&#8230;) </em>)</li>
</ul>
<h2>Conlusioni</h2>
<p>Quindi tutto quello che dobbiamo fare per creare web e mobile app con un&#8217;interfaccia di alto livello, è realizzare i nostri effetti tramite<strong> proprietà che richiamano la creazione dei layers</strong>, sfruttando la tecnica dell&#8217;<strong>accelerazione hardware</strong>. In questo modo eviteremo di ripetere l&#8217;intero processo di rendering per ogni keyframe dell&#8217;animazione.</p>
<p>Piccola nota al riguardo, non abusare di questa tecnica: la creazione di un numero troppo elevato di layers potrebbe infatti causare un sovraccarico dei processi nella GPU.</p>
<p>E tu? Hai mai sfruttato la GPU per migliorare le prestazioni dei tuoi lavori?</p>
<h2>Crea la tua mobile app in HTML, CSS3 e Javascript</h2>
<p>Utilizzando questa tecnica unita a molte altre ho creato per i miei clienti oltre 10 applicazioni per dispositivi mobile, tra cui due progetti personali: <a title="Tint Weather App - HTML, CSS3 e javascript mobile app" href="http://www.upcreative.net/tint-weather-app/">Tint Weather App</a> e <a title="Dieta SI o NO? - HTML, CSS3 e javascript mobile app" href="http://www.upcreative.net/app-dieta-si-o-no/">Dieta SI o NO?</a>. Se anche tu sei un web designer e vuoi realizzare la tua applicazione mobile da distribuire nei vari stores, forse sarai interessato al mio e-book: <a title="Html Mobile Accelerato - Come realizzare HTML Mobile App fluide e preformanti" href="http://www.upcreative.net/html-mobile-accelerato/"><strong>HTML Mobile Accelerato</strong></a>.</p>
<p>Grazie ad esso verrai a conoscenza di tutte quelle tecniche che renderanno la tua applicazione mobile fluida e reattiva come quelle native.</p>
<p style="text-align: center;">Clicca nell&#8217;immagine sottostante per saperne di più!</p>
<p style="text-align: center;"><a href="http://www.upcreative.net/html-mobile-accelerato/"><img class="size-full wp-image-2689 aligncenter" alt="HTML-mobile-accelerato-ebook-cover" src="http://www.upcreative.net/wp-content/uploads/2013/11/HTML-mobile-accelerato-ebook-cover1.png" width="563" height="418" /></a></p>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/web-e-mobile-app-fluide-con-layer-e-hardware-acceleration/">Web e Mobile app fluide con layer e hardware acceleration</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/web-e-mobile-app-fluide-con-layer-e-hardware-acceleration/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>CSS3 slide panel: tutorial su come realizzare un menu stile mobile</title>
		<link>https://www.upcreative.net/css3-slide-panel-tutorial-creare-menu-mobile/</link>
		<comments>https://www.upcreative.net/css3-slide-panel-tutorial-creare-menu-mobile/#comments</comments>
		<pubDate>Wed, 27 Nov 2013 15:47:12 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[CSS3 slide panel]]></category>
		<category><![CDATA[CSS3 transform]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[Progressive Enhancement]]></category>
		<category><![CDATA[user experience]]></category>
		<category><![CDATA[web app]]></category>
		<category><![CDATA[Web UI]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=2530</guid>
		<description><![CDATA[<p>The post <a rel="nofollow" href="https://www.upcreative.net/css3-slide-panel-tutorial-creare-menu-mobile/">CSS3 slide panel: tutorial su come realizzare un menu stile mobile</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>Come sicuramente avrai capito leggendo i miei post, ho un vero e proprio debole per le <strong>mobile web app</strong> e per l&#8217;impiego dei <strong>CSS3</strong> al fine di rendere più piacevole la <strong>user-experience</strong> delle mie interfacce.</p>
<p>Con il miglioramento costante delle caratteristiche hardware dei dispositivi mobili è possibile avvicinarsi sempre di più alle <strong>prestazioni di applicazioni native</strong>, realizzando effetti come animazioni e transizioni puramente in <strong>CSS3</strong>.</p>
<p>Inserire nelle web app elementi come touch sliders, slide menu, <a title="Pull to refresh plugin" href="http://www.upcreative.net/pull-to-refresh-plugin-scrolling-nativo-ios/">pull-to-refresh</a> scroll, e molti altri componenti che siamo ormai abituati a vedere nelle applicazioni native, diventa quindi meno complicato.</p>
<h2>L&#8217;impiego nei siti web</h2>
<p>Effetti del genere ovviamente non sono limitati soltanto a smartphone o tablet, ma si possono implementare anche nei &#8220;classici&#8221; dispositivi desktop. Numerosi web designer e developer li inseriscono per esempio nei propri progetti per renderli più piacevoli e per stupire in modo originale il visitatore.</p>
<p>In questo articolo ti voglio parlare proprio di <strong>come realizzare un CSS3 slide panel menu</strong>, effetto che ho trovato ultimamente in molti siti web, e che può essere utilizzato in tutti i dispositivi.</p>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/11/CSS3-slide-panel-upcreative.jpg"><img class="alignnone size-full wp-image-2542" alt="CSS3-slide-panel-upcreative" src="http://www.upcreative.net/wp-content/uploads/2013/11/CSS3-slide-panel-upcreative.jpg" width="690" height="433" /></a></p>

		</div> 
	</div> </div></div><div class="g-cols"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="wpb_button align_center"><a href="http://www.upcreative.net/tutorials/27112013upcreative-CSS3-slide-panel/"class="g-btn type_primary size_big"><span><i class="fa fa-icon-eye-open"></i>Demo</span></a></div>
 
		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="wpb_button align_center"><a href="http://www.upcreative.net/download/2559/"class="g-btn type_primary size_big"><span><i class="fa fa-icon-download-alt"></i>Download</span></a></div>
 
		</div> 
	</div> </div></div><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>Quello che realizzeremo in questo tutorial è quindi un menu <strong>CSS3 slide panel</strong>, che appare o scompare al click su uno specifico pulsante.</p>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/11/square-space-css3-slide-menu.png"><img class="alignnone size-full wp-image-2532" alt="square-space-css3-slide-menu" src="http://www.upcreative.net/wp-content/uploads/2013/11/square-space-css3-slide-menu.png" width="690" height="436" /></a></p>
<p><span style="color: #999999;"><em><a title="Squarespace.com - Piattaforma per la creazione di siti web" href="http://www.squarespace.com">Squarespace</a> usa la tecnica dello slide menu nel proprio sito</em></span></p>
<p>Uno degli aspetti fondamentali che caratterizzerà il risultato finale è l&#8217;introduzione, se pur a livello base, di un concetto molto importante nell&#8217;ambito della compatibilità: il <strong>miglioramento progressivo tramite CSS3 </strong>(o CSS3 Progressive Enhancement).</p>
<blockquote><p>Il <b>Progressive enhancement </b>è una strategia impiegata nel web design che utilizza le tecnologie web a più livelli, per permettere a chiunque di accedere a contenuti e funzionalità di base del sito (o della web app) indipendentemente dal browser o dalla connessione utilizzata, fornendo anche una versione migliorata della pagina per coloro che dispongono di un browser più avanzato o maggiore larghezza di banda.</p>
<p><span style="color: #999999;">Fonte: <span style="text-decoration: underline;"><a title="Wikipedia - Progressive enhancement" href="http://en.wikipedia.org/wiki/Progressive_enhancement"><span style="color: #999999; text-decoration: underline;">Wikipedia</span></a></span></span></p></blockquote>
<p>Per quanto riguarda il nostro esperimento, la tecnica di base consisterà nel basare l&#8217;animazione dello sliding panel sulla proprietà <em>left</em> per i browser che non supportano le <em>css transform</em>, mentre sulla proprietà <em>translate3d</em> per quelli che la supportano.</p>
<p>Così facendo potremo guadagnare in termini di fluidità e le prestazioni (per capire quali sono gli attributi sui quali agire per <strong>migliorare fluidità e prestazioni</strong> ti consiglio di leggere: <a title="Performance CSS3: consigli per ottimizzare le animazioni" href="http://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/">Performance CSS3: consigli per ottimizzare le animazioni</a>).</p>
<p>Ma veniamo al punto.</p>
<h2>Il markup HTML</h2>
<pre class="crayon-plain-tag">&lt;!-- Menu --&gt;
&lt;nav class="menu"&gt;

	&lt;!-- Menu Wrapper --&gt;
	&lt;div class="menu-wrap"&gt;
		&lt;span id="menu-close"&gt;x&lt;/span&gt;
		&lt;a href="index.html"&gt;Home&lt;/a&gt;
		&lt;a href="services.html"&gt;Services&lt;/a&gt;
		&lt;a href="portfolio.html"&gt;Portfolio&lt;/a&gt;
		&lt;a href="about.html"&gt;About&lt;/a&gt;
		&lt;a href="#contact"&gt;Contact&lt;/a&gt;
	&lt;/div&gt;

	&lt;!-- Menu button --&gt;
	&lt;button id="toggle" title="Menu Toggle"&gt;Toggle&lt;/button&gt;
&lt;/nav&gt;

&lt;!-- contenuto pagina --&gt;

&lt;div class="main-wrapper"&gt;			
	&lt;!-- contenuto della pagina --&gt;	
&lt;/div&gt;</pre>
Dal codice puoi vedere che il menu (class = &#8220;menu-wrap&#8221;) ed il pulsante di toggle (id=&#8221;toggle&#8221;) sono stati inseriti all&#8217;interno di un wrapper principale con class=&#8221;menu&#8221;, che sarà poi quello su cui effettueremo l&#8217;animazione, assieme al body stesso della pagina</p>
<h2>Gli stili CSS</h2>
<p>Vediamo gli stili per il wrapper principale del menu:</p><pre class="crayon-plain-tag">/* 
	stili del menu
	impostiamo la position a fixed con un right di -200px (il menu "a riposo" 
	esce dalla pagina a destra per un numero di pixel pari alla sua larghezza)
*/
.menu {
    position: fixed;
    right: -200px;
    width: 260px;
    height: 100%;
    top: 0;
    z-index: 10;
    text-align: left
}
/*
	serve per far muovere anche il body nel caso in cui il browser non supporta le CSS transform
*/
body {
&amp;nbsp; &amp;nbsp; overflow-x: hidden;
&amp;nbsp; &amp;nbsp; position: relative;
&amp;nbsp; &amp;nbsp; left: 0;
}</pre><p>
Ora impostiamo gli stili del menu-wrapper che è contenuto all&#8217;interno del panel menu principale, quelli del pulsante di chiusura (id=&#8221;menu-close&#8221;), e quelli del pulsante &#8220;toggle&#8221;:</p><pre class="crayon-plain-tag">/* 
	impostiamo gli stili dell'elemento wrapper che contiene il menu 
*/
.menu-wrap {
    position: absolute;
    top: 0;
    /* impostiamo un left di 60px per dare 'spazio' al pulsante '#toggle' */
    left: 60px;
    background: #1a1a1a;
    width: 200px;
    height: 100%;
    padding-top: 20px;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}

/*
	impostiamo gli stili dei link del menu	
*/
.menu a {
    margin-left: 20px;
    color: gray;
    display: block;
    font-size: 12px;
    font-weight: 700;
    line-height: 40px;
    letter-spacing: .1em;
    text-transform: uppercase;
}
.menu a:hover {
    color: #fff
}
.menu a:active {
    color: #fff
}
.menu a&gt;i {
    float: left;
    display: inline-block;
    vertical-align: middle;
    text-align: left;
    width: 25px;
    font-size: 14px;
    line-height: 40px;
    margin: 25px 2px
}

/*
	impostiamo gli stili e posizioniamo il pulsante di chiusura che si trova all'interno del paneò
*/

#menu-close {
    cursor: pointer;
    display: block;
    position: absolute;
    font-size: 18px;
    font-weight: bold;
    color: gray;
    width: 40px;
    height: 40px;
    line-height: 40px;
    top: 18px;
    right: 5px;
    -webkit-transition: all .1s ease-in-out;
    -moz-transition: all .1s ease-in-out;
    -ms-transition: all .1s ease-in-out;
    -o-transition: all .1s ease-in-out;
    transition: all .1s ease-in-out
}
#menu-close:hover {
    color: #fff;
}

/*
     posizioniamo il pulsante toggle
*/
#toggle{
    position: absolute;	
    top: 25px;
    right: 265px;
    display: block;
    min-width: 110px;
    text-align: right;
    z-index: 11;
    font-size: 18px;
    font-weight: 700;
    color: #FFF;
    text-transform: uppercase;

    padding:0;
    background: none;
    margin:0;
    border:0;
}</pre><p>
Ora impostiamo gli stili del contenuto principale della pagina:</p><pre class="crayon-plain-tag">/* stili del contenuto della pagina */

.main-wrapper {
    background: url(../img/header-bg1.jpg) no-repeat center top;
    margin-top: 0px;
    padding-top: 130px;
    text-align: center;
    background-attachment: relative;
    background-position: center center;
    height: 100%;
    width: 100%;
    -webkit-background-size: 100%;
    -moz-background-size: 100%;
    -o-background-size: 100%;
    background-size: 100%;
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
    background-size: cover    
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}</pre><p>
Infine, ecco il punto focale del nostro esperimento, dove avviene &#8220;la magia&#8221;, ovvero il momento in cui scegliamo quale proprietà modificare oper effettuare l&#8217;animazione in base alla compatibilità del browser:</p><pre class="crayon-plain-tag">/*
	in questa situazione, quindi quando il browser NON supporta le CSS3 transform, 
	muoviamo la reale posizione del menu da fuori dallo schermo al suo interno, agendo sulla 
	proprietà "left"
*/
body:not(.with-translate).open {
    left: -200px;
}

/*
	in questa situazione, quindi quando il browser supporta le CSS3 transform, 
	lasciamo la reale posizione del menu fuori dallo schermo, mentre la trasliamo 
	al suo interno di 200px;
*/
body.with-translate.open {
    left: 0;    
    -webkit-transform: translate3d(-200px , 0 , 0);
    -moz-transform: translate3d(-200px,0,0);
    -ms-transform: translate3d(-200px,0,0);
    -o-transform: translate3d(-200px,0,0);    
    transform: translate3d(-200px,0,0);    
}

/* 
	impostiamo infine la transition ad all	per comprendere sia quella sulla proprietà "translate3d" che sulla proprietà "right"
*/

/* 
	se il browser non supporta le CSS3 transform, utilizziamo 
	la proprietà "right" per creare il nostro effetto 
        sull'elemento del menu
*/
body:not(.with-translate) .menu.open {
    right: 0
}

/* 
	altrimenti la proprietà right dovrà avere lo stesso valore negativo 
	in quanto useremo la proprietà translate per l'animazione 
*/

body.with-translate .menu.open{
	right:-200px;
}

/*
	nel caso in cui si tratta di ie10 attribuiamo la translate anche al menu, 
	che in questa versione non si sposta insieme al body (maledetto IE!)
*/
body.ie10.with-translate .menu.open {
    -webkit-transform: translate3d(-200px , 0 , 0);
    -moz-transform: translate3d(-200px,0,0);
    -ms-transform: translate3d(-200px,0,0);
    -o-transform: translate3d(-200px,0,0);    
    transform: translate3d(-200px,0,0);    
}

/*
       impostiamo la durata delle animazioni per il menu ed il body con 'all'
       in modo da agire sia sulla proprietà 'transform' che sulla proprietà 'right'
*/
.menu, body{
    -webkit-transition: all .3s ease;
    -moz-transition: all .3s ease;
    -ms-transition: all .3s ease;
    -o-transition: all .3s ease;
    transition: all .3s ease
}</pre><p>
Qui vengono definite le due differenti tecniche di animazione distinte in base alla classe del body: se esso ha la classe &#8220;<em>with-translate</em>&#8221; (significa che il browser supporta la proprietà <em>CSS transform</em>)<em>,</em> allora animeremo body e menu traslandoli con la l&#8217;attributo &#8220;<em>transform: translate3D</em>&#8220;, altrimenti lo faremo agendo sulla proprietà &#8220;right&#8221;.</p>
<h2>Il file Javascript</h2>
<p>Infine qualche riga di codice per aggiungere o togliere la classe &#8220;open&#8221; dal body e dal menu, all&#8217;evento &#8220;<em>click</em>&#8221; dei pulsanti desiderati. Controlliamo inoltre, sfruttando <a title="Modernizr" href="http://modernizr.com">modernirz</a> ( che ho incluso nel documento, puoi verificarlo scaricando il codice sorgente), se il browser supporta le <em>CSS transform </em>oppure no (in caso positivo aggiungiamo la classe &#8220;with-translate&#8221; al body).</p><pre class="crayon-plain-tag">$(function(){

	/* 
		grazie a modernizr, controllando le classi del tag HTML 
		possiamo sapere se il browser supporta la transition3d		
	*/
	var supportCssTransforms = $("html").hasClass("csstransforms3d");

    /*
	    se la supporta aggiungiamo la classe 'with-translate' al body, 
	    in modo da poter differenziare la modalità d'effetto tramite CSS
    */
	if(supportCssTransforms){
    	$("body").addClass("with-translate");
	}

        /*
		se si tratta di IE 10 aggiungiamo la classe per il workaround 
		(la condizione di controllo può essere migliorata)		
	*/
	if(navigator.userAgent.indexOf("MSIE 10.")!=-1){
		$("body").addClass("ie10");
	}

	/*
		impostiamo sugli elementi desiderati l'evento click in modo da 
		aprire o chiudere il menu aggiungendo o togliendo la classe "open"	
		al body e al menu stesso	
	*/
	$("#toggle, #menu-close").on("click", function(){
		$("body, .menu").toggleClass("open");		
	});

});</pre><p>
Ecco fatto: ora possiamo visualizzare un vero e proprio <strong>CSS3 slide panel menu</strong> con tanto di <strong>Progressive Enhancement</strong> per i dispositivi che non supportano le funzionalità CSS3 più recenti!</p>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/11/CSS3-slide-panel-upcreative.jpg"><img class="alignnone size-full wp-image-2542" alt="CSS3-slide-panel-upcreative" src="http://www.upcreative.net/wp-content/uploads/2013/11/CSS3-slide-panel-upcreative.jpg" width="690" height="433" /></a></p>

		</div> 
	</div> </div></div><div class="g-cols"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="wpb_button align_center"><a href="http://www.upcreative.net/tutorials/27112013upcreative-CSS3-slide-panel/"class="g-btn type_primary size_big"><span><i class="fa fa-icon-eye-open"></i>Demo</span></a></div>
 
		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="wpb_button align_center"><a href="http://www.upcreative.net/download/2559/"class="g-btn type_primary size_big"><span><i class="fa fa-icon-download-alt"></i>Download</span></a></div>
 
		</div> 
	</div> </div></div><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>Se ti è piaciuto l&#8217;articolo, perché non lo condividi?</p>

		</div> 
	</div> <div class="g-cols"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<div>Hey! Sto scrivendo un e-book su come aumentare le performance e la fluidità per le tue HTML mobile app! Segui i consigli e le tecniche di cui mi sono servito per creare le mie applicazioni (come <a title="Le mie applicazioni HTML5" href="http://www.upcreative.net/html5-mobile-apps/">Tint, Dieta SI o NO?</a>).</div>
<div>Iscriviti alla newsletter per sapere quando sarà pronto!</div>

		</div> 
	</div> 
	<div class="wpb_single_image wpb_content_element">
		<div class="wpb_wrapper">
			
			<img width="563" height="418" src="http://www.upcreative.net/wp-content/uploads/2013/11/HTML-mobile-accelerato-ebook-cover1.png" class="attachment-full" alt="HTML-mobile-accelerato-ebook-cover" />
		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h4 style="text-align: center;"><strong>HTML Mobile Accelerato (E-book)</strong></h4>
<p style="text-align: center;">Lascia la tua email per ricevere aggiornamenti e sapere quando sarà disponibile</p>
<style><!--
.wysija-submit{margin:0 !important;}
--></style>
<div style="text-align: center;"><div class="widget_wysija_cont shortcode_wysija"><div id="msg-form-wysija-shortcode6ab3423ad6e30-4" class="wysija-msg ajax"></div><form id="form-wysija-shortcode6ab3423ad6e30-4" method="post" action="#wysija" class="widget_wysija shortcode_wysija">
<p class="wysija-paragraph">
    
    
    	<input type="text" name="wysija[user][email]" class="wysija-input validate[required,custom[email]]" title="Inserisci la tua mail" placeholder="Inserisci la tua mail" value="" />
    
    
    
    <span class="abs-req">
        <input type="text" name="wysija[user][abs][email]" class="wysija-input validated[abs][email]" value="" />
    </span>
    
</p>
<input class="wysija-submit wysija-submit-field" type="submit" value="Tienimi aggiornato/a" />

    <input type="hidden" name="form_id" value="4" />
    <input type="hidden" name="action" value="save" />
    <input type="hidden" name="controller" value="subscribers" />
    <input type="hidden" value="1" name="wysija-page" />

    
        <input type="hidden" name="wysija[user_list][list_ids]" value="4,1" />
    
 </form></div></div>
<p style="text-align: center;">
<div style="text-align: center;"><a title="E-book HTML5 Mobile Accelerato" href="http://www.upcreative.net/html-mobile-accelerato/">Clicca qui per avere maggiori informazioni<i class="fa fa-chevron-right"></i></a></div>

		</div> 
	</div> </div></div><div class="g-hr">
						<span class="g-hr-h">
							<i class="fa fa-chevron-down"></i>
						</span>
					</div></div></div>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/css3-slide-panel-tutorial-creare-menu-mobile/">CSS3 slide panel: tutorial su come realizzare un menu stile mobile</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/css3-slide-panel-tutorial-creare-menu-mobile/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Performance CSS3: consigli per ottimizzare le animazioni</title>
		<link>https://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/</link>
		<comments>https://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/#comments</comments>
		<pubDate>Thu, 21 Nov 2013 21:43:20 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[backbone]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[web app]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=2511</guid>
		<description><![CDATA[<p>The post <a rel="nofollow" href="https://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/">Performance CSS3: consigli per ottimizzare le animazioni</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>Da sempre il web designer/developer deve sostenere la famosa dura lotta della <strong>compatibilità browser,</strong> con un occhio di riguardo soprattutto per Internet Explorer, ed in particolar modo per l&#8217;utilizzo delle <strong>numerose funzionalità CSS3,</strong> che contribuiscono ad incrementare la qualità e la <strong>user experience</strong> di ogni interfaccia.</p>
<p>Negli ultimi tempi l&#8217;interpretazione di animazioni, transizioni e altre proprietà CSS3 su tutti i browser sembra una meta sempre meno lontana, per cui molti <strong>front-end developer</strong>, compreso il sottoscritto, cercano di impiegarli il più possibile all&#8217;interno dei loro progetti.</p>
<p>Tuttavia nell&#8217;utilizzare funzionalità del genere bisogna fare attenzione alle <strong>performance CSS3</strong> del dispositivo/browser su cui dovranno &#8220;girare&#8221;, in particolare se si tratta di quelli mobili, molto meno potenti rispetto ai desktop.</p>
<h2>Un esperienza a riguardo</h2>
<p>Recentemente ho sviluppato e pubblicato nell&#8217;App Store <strong><a title="Tint - Applicazione Meteo sviluppata interamente in HTML5 e CSS3" href="http://www.upcreative.net/tint-weather-app/">Tint</a></strong>, un&#8217;applicazione realizzata interamente con <strong>markup HTML5</strong>, animazioni <strong>CSS3</strong> e l&#8217;ausilio di <strong><a title="Backbone framework per realizzare applicazioni Javascript in HTML5 e CSS3" href="http://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/">Backbone</a></strong> (che approfondirò in un articolo futuro), riscuotendo anche un notevole successo in fatto di download.</p>

		</div> 
	</div> <div class="g-cols"><div class="one-half">
	<div class="wpb_single_image wpb_content_element animate_afl align_center">
		<div class="wpb_wrapper">
			
			<img width="365" height="276" src="http://www.upcreative.net/wp-content/uploads/2013/11/Tint-Weather-App-available-on-app-store.jpg" class="attachment-full" alt="Tint-Weather-App-available-on-app-store" />
		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_single_image wpb_content_element animate_afr align_center">
		<div class="wpb_wrapper">
			
			<img width="649" height="431" src="http://www.upcreative.net/wp-content/uploads/2013/11/multiple-locations-view.jpg" class="attachment-full" alt="multiple-locations-view" />
		</div> 
	</div> </div></div>
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>Ma perché ho introdotto Tint?</p>
<p>In questo articolo ti voglio parlare di <strong>una lezione importante nell&#8217;ottimizzare performance CSS3 di animazioni, transizioni ed effetti </strong>applicati ad elementi DOM, che ho personalmente imparato durante la mia esperienza nello sviluppo di Tint, la quale ha contribuito ad incrementarne notevolmente le prestazioni.</p>
<p>Nonostante sia da molto tempo che mi occupo di interfacce web, questa è stata la prima volta che ho avuto l&#8217;esigenza di ottimizzare al massimo le prestazioni in dispositivi che, per caratteristiche hardware, riescono difficilmente a supportare certi tipi di animazioni e transizioni.</p>
<p>Ho dovuto pertanto cambiare il modo di realizzare alcuni effetti che su smartphone si arrestavano o mostravano uno sfarfallio (quanto lo odio!), mentre per desktop non davano nessun problema.</p>
<h2>Punto focale: il rendering</h2>
<p>Quando parliamo di <strong>prestazioni su un browser</strong>, dobbiamo pensare in particolare al <strong>rendering</strong> e su come esso rappresenti la ragione principale per le scarse prestazioni derivanti dai nostri stili CSS3.</p>
<p>Mi spiego meglio:</p>
<p>i vari step che compongono il processo in base al quale il browser passa dalla &#8220;lettura&#8221; del DOM al &#8220;disegno&#8221; sullo schermo, si possono riassumere in 3 fasi principali, nell&#8217;ordine:</p>
<ol>
<li><strong>Calcolo dei stili</strong>: in questa prima parte vengono calcolate e definite tutte quelle proprietà che definiscono la morfologia dell&#8217;elemento, come width, height, margin, padding, font-size, top, left ecc.</li>
<li><strong>Disegno dell&#8217;elemento</strong>: è il momento in cui l&#8217;elemento viene &#8220;arricchito&#8221; con proprietà come ombra, background, outline, border ecc..</li>
<li><strong>Creazione dei layers</strong>: qui vengono creati i layer dei &#8220;disegni&#8221; appena creati, che si differenziano in due categorie: quelli per il render, i quali definiscono la struttura ad albero di elementi e sotto-elementi, e quelli grafici, che vengono creati ogni volta che la GPU viene chiamata in causa. Possiamo dire quindi che quest&#8217;ultimo processo interessa proprietà CSS3 come translate, transform, scale, rotate ecc..</li>
</ol>
<p>La cosa più importante su cui soffermarsi è il fatto che queste tre operazioni vengono eseguite dal browser in coda. Per cui se ad un elemento DOM già disegnato sullo schermo, andiamo a modificare proprietà classificate nel primo punto, poi dovranno essere rieseguiti anche gli altri due step.</p>
<p>Se invece modifichiamo attributi appartenenti al secondo step, il browser si preoccuperà di eseguire anche il terzo step.</p>
<p>Infine, modificando proprietà classificate nell&#8217;ultimo step, il lavoro del browser sarà alleggerito notevolmente perché non dovrà rieseguire gli step precedenti.</p>
<p>Questo discorso vale in linea generale per tutti i tipi di browser, a parte il nostro solito amico/nemico Internet Explorer, del quale non abbiamo molte informazioni sul processo di rendering (confidiamo nelle future release).</p>
<h3>Tutto questo per dire cosa?</h3>
<p>Beh, se ho esposto bene il funzionamento di rendering, sarà facile darsi una risposta:</p>
<blockquote><p><strong>al fine ottimizzare al massimo le prestazioni di un&#8217;animazione bisogna fare in modo che il browser prenda la strada più corta per realizzarla</strong>.</p></blockquote>
<p>Faccio un esempio banale.</p>
<p>Se dobbiamo spostare una <em>div</em> dalla parte superiore del documento a quella inferiore in modo animato, invece di applicare l&#8217;animazione all&#8217;attributo <em>top</em> o <em>bottom, </em>che costringerebbe il browser a ripetere tutte e 3 le fasi del processo per ogni singolo frame dell&#8217;animazione, la applicheremo alla proprietà <em>transform: translate</em> ( o <em>transform: translate3d</em>) le quali interesseranno solo l&#8217;ultimo dei 3 step.</p>
<p>In questo modo <strong>aumenteremo in modo considerevole la fluidità degli effetti dei nostri progetti</strong>.</p>

		</div> 
	</div> <div class="g-cols"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h4>Codice poco performante</h4>

		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h4>Codice performante</h4>

		</div> 
	</div> </div></div><div class="g-cols"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<pre class="crayon-plain-tag">div#quadrato{
    position:absolute;
    top:100px;
    left:100px;
    width:100px;
    height: 100px;
    background:red;

   /* definiamo la transizione su tutte le proprietà */
    -webkit-transition: all .3s ease;
       -moz-transition: all .3s ease;
        -ms-transition: all .3s ease;
         -o-transition: all .3s ease;
            transition: all .3s ease;
}
/*classe per l'animazione*/
div#quadrato.animato{
    top:300px;
}</pre>

		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<pre class="crayon-plain-tag">div#quadrato{
    position:absolute;
    top:100px;
    left:100px;
    width:100px;
    height: 100px;
    background:red;

   /* definiamo la transizione su tutte le proprietà */
    -webkit-transition: all .3s ease;
       -moz-transition: all .3s ease;
        -ms-transition: all .3s ease;
         -o-transition: all .3s ease;
            transition: all .3s ease;
}
/*classe per l'animazione*/
div#quadrato.animato{
    -webkit-transform: translateY(-200px);
       -moz-transform: translateY(-200px);
        -ms-transform: translateY(-200px);
         -o-transform: translateY(-200px);    
            transform: translateY(-200px);
}</pre>

		</div> 
	</div> </div></div>
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>Dall&#8217;esempio possiamo vedere due modi diversi di realizzare la stessa animazione, con performance CSS3 completamente differenti.</p>
<p>Di seguito elenco le proprietà per ognuno dei tre (macro) step.</p>

		</div> 
	</div> </div></div><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Step 1: calcolo degli stili</h3>

		</div> 
	</div> <div class="g-cols"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<ul>
<li>border</li>
<li>border-width</li>
<li>display</li>
<li>font-size</li>
<li>font-weight</li>
<li>font-famliy</li>
<li>text-align</li>
<li>overflow</li>
<li>overflow-y</li>
<li>white-space</li>
<li>clear</li>
<li>line-height</li>
</ul>

		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<ul>
<li>width</li>
<li>height</li>
<li>margin</li>
<li>padding</li>
<li>top</li>
<li>left</li>
<li>bottom</li>
<li>right</li>
<li>position</li>
<li>overflow</li>
<li>vertical-align</li>
<li>min-height</li>
</ul>

		</div> 
	</div> </div></div>
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Step 2: disegno dell&#8217;elemento</h3>

		</div> 
	</div> <div class="g-cols"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<ul>
<li>background</li>
<li>background-image</li>
<li>background-position</li>
<li>background-repeat</li>
<li>background-size</li>
<li>border-radius</li>
<li>border-style</li>
<li>text-decoration</li>
</ul>

		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<ul>
<li>outline</li>
<li>outline-color</li>
<li>outline-style</li>
<li>outline-width</li>
<li>box-shadow</li>
<li>color</li>
<li>visibility</li>
</ul>

		</div> 
	</div> </div></div>
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h3>Step 3: creazione dei layers</h3>

		</div> 
	</div> <div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>Tutte le proprietà <em>transform</em>, come per esempio <em>translate, matrix, scale, rotate, skew e perspective.</em></p>

		</div> 
	</div> </div></div></div></div><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h2>Conclusioni</h2>
<p>Una volta preso in considerazione questo importante discorso, <strong>la fluidità delle animazioni e transizioni applicate ai vari elementi della mia app Tint è aumentata in modo considerevole</strong>, avvicinandosi sempre di più a quella di applicazioni native (se vuoi vedere il risultato l&#8217;<a title="Tint HTML5 app su App Store" href="https://itunes.apple.com/us/app/tint-weather/id742161441">app è scaricabile nell&#8217;app store</a>).</p>
<p>Spero quindi che anche tu applicherai questo importantissimo concetto nel tuo prossimo lavoro.</p>
<p>Buon divertimento!</p>

		</div> 
	</div> <div class="g-hr">
						<span class="g-hr-h">
							<i class="fa fa-star"></i>
						</span>
					</div><div class="g-cols"><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<div>Hey! Sto scrivendo un e-book su come aumentare le performance e la fluidità per le tue HTML mobile app! Segui i consigli e le tecniche di cui mi sono servito per creare le mie applicazioni (come <a title="Le mie applicazioni HTML5" href="http://www.upcreative.net/html5-mobile-apps/">Tint, Dieta SI o NO?</a>).</div>
<div>Iscriviti alla newsletter per sapere quando sarà pronto!</div>

		</div> 
	</div> 
	<div class="wpb_single_image wpb_content_element align_center">
		<div class="wpb_wrapper">
			
			<img width="563" height="418" src="http://www.upcreative.net/wp-content/uploads/2013/11/HTML-mobile-accelerato-ebook-cover1.png" class="attachment-full" alt="HTML-mobile-accelerato-ebook-cover" />
		</div> 
	</div> </div><div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<h4 style="text-align: center;"><strong>HTML Mobile Accelerato (E-book)</strong></h4>
<p style="text-align: center;">Lascia la tua email per ricevere aggiornamenti e sapere quando sarà disponibile</p>
<div style="text-align: center;"><div class="widget_wysija_cont shortcode_wysija"><div id="msg-form-wysija-shortcode6ab3423b16397-4" class="wysija-msg ajax"></div><form id="form-wysija-shortcode6ab3423b16397-4" method="post" action="#wysija" class="widget_wysija shortcode_wysija">
<p class="wysija-paragraph">
    
    
    	<input type="text" name="wysija[user][email]" class="wysija-input validate[required,custom[email]]" title="Inserisci la tua mail" placeholder="Inserisci la tua mail" value="" />
    
    
    
    <span class="abs-req">
        <input type="text" name="wysija[user][abs][email]" class="wysija-input validated[abs][email]" value="" />
    </span>
    
</p>
<input class="wysija-submit wysija-submit-field" type="submit" value="Tienimi aggiornato/a" />

    <input type="hidden" name="form_id" value="4" />
    <input type="hidden" name="action" value="save" />
    <input type="hidden" name="controller" value="subscribers" />
    <input type="hidden" value="1" name="wysija-page" />

    
        <input type="hidden" name="wysija[user_list][list_ids]" value="4,1" />
    
 </form></div></div>
<div style="text-align: center;"></div>
<div style="text-align: center;"><a title="E-book HTML5 Mobile Accelerato" href="http://www.upcreative.net/html-mobile-accelerato/">Clicca qui per avere maggiori informazioni</a></div>

		</div> 
	</div> </div></div></div></div>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/">Performance CSS3: consigli per ottimizzare le animazioni</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/performance-css3-consigli-per-ottimizzare-le-animazioni/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Tutorial: Backbone web app responsive con Bootstrap 3</title>
		<link>https://www.upcreative.net/tutorial-backbone-web-app-con-bootstrap-3/</link>
		<comments>https://www.upcreative.net/tutorial-backbone-web-app-con-bootstrap-3/#comments</comments>
		<pubDate>Wed, 13 Nov 2013 11:19:29 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[backbone]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[javscript]]></category>
		<category><![CDATA[web app]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=2473</guid>
		<description><![CDATA[<p>In un precedente articolo ho sottolineato il ruolo fondamentale che può rappresentare Backbone per la realizzazione di una MVC javascript web application, elencando anche i vari componenti che la libreria mette a disposizione, oltre ad alcune applicazioni con essa realizzate. Su lobaedesign.com</p>
<p>The post <a rel="nofollow" href="https://www.upcreative.net/tutorial-backbone-web-app-con-bootstrap-3/">Tutorial: Backbone web app responsive con Bootstrap 3</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>In un <a title="Usare Backbone.js per realizzare web applications" href="http://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/">precedente articolo</a> ho sottolineato il ruolo fondamentale che può rappresentare <a title="Backbone frame work javascript per web app" href="http://backbonejs.org"><strong>Backbone</strong></a> per la realizzazione di una <strong>MVC</strong> <strong>javascript web application</strong>, elencando anche i vari componenti che la libreria mette a disposizione, oltre ad alcune applicazioni con essa realizzate.</p>
<p>Su <a href="http://lobaedesign.com">lobaedesign.com</a> invece, ho introdotto l&#8217;indipendenza della view dagli altri componenti con un tutorial su <a title="Tutorial Backbone.js: come realizzare un orologio analogico CSS3 e JavaScript con animazione" href="http://www.lobaedesign.com/tutorial-backbone-js-come-realizzare-un-orologio-css3-e-javascript-con-animazione/">come realizzare un orologio analogico CSS3 e JavaScript con animazione</a>, e su come la stessa view aggiorna gli elementi dell&#8217;interfaccia &#8220;<strong>osservando</strong>&#8221; il cambiamento di un model.</p>
<p>In questo post voglio introdurre invece altri due componenti per la creazione di una <strong>backbone web app</strong>:</p>
<ul>
<li><strong>la collection</strong>, ovvero la lista secondo la quale organizzare i model</li>
<li><strong>il sistema di templating</strong> della libreria <a title="Underscore.js - sistema di templating per web app" href="http://underscorejs.org">underscore.js</a>, per la generazione del markup HTML</li>
</ul>
<p>Lo farò attraverso un semplice tutorial che implementa il framework bootstrap 3 nel documento e usa due view diverse legate allo stesso model ed una alla lista.</p>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/11/Tutorial-Backbone-web-app-responsive-con-Bootstrap-3.jpg"><img class="alignnone size-full wp-image-2489" alt="Tutorial-Backbone-web-app-responsive-con-Bootstrap-3" src="http://www.upcreative.net/wp-content/uploads/2013/11/Tutorial-Backbone-web-app-responsive-con-Bootstrap-3.jpg" width="690" height="400" /></a></p>
<div class="g-cols">
<div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="wpb_button align_center"><a href="http://www.upcreative.net/tutorials/13112013-backbone-responsive-we-app/"class="g-btn type_primary size_big"><span><i class="fa fa-icon-eye-open"></i>Demo</span></a></div>
 
		</div> 
	</div> </div>
<div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="wpb_button align_center"><a href="http://www.upcreative.net/download/2491/"class="g-btn type_primary size_big"><span><i class="fa fa-icon-download-alt"></i>Download</span></a></div>
 
		</div> 
	</div> </div>
</div>
<p>Il nostro intento sarà quindi quello di creare una <strong>backbone </strong><strong>web app responsive</strong> che mostra una lista di persone, ciascuna con informazioni proprie come nome, sesso, occupazione, e descrizione, e con possibilità da parte dell&#8217;utente di creare, modificare, eliminare una persona, oltre che poter visualizzare una modal con delle informazioni aggiuntive cliccando nel nome della lista.</p>
<h2>Impostazione del documento</h2>
<p>Come prima operazione, aggiungiamo al nostro documento, prima della chiusura del tag <em>body</em>,  le librerie di cui abbiamo bisogno:</p><pre class="crayon-plain-tag">&lt;script src="js/jquery-1.10.2.min.js"&gt;&lt;/script&gt; &lt;!-- jquery --&gt;
&lt;script src="js/bootstrap.min.js"&gt;&lt;/script&gt; &lt;!-- bootstrap per il modal--&gt;

&lt;script src="js/underscore-min.js"&gt;&lt;/script&gt; &lt;!-- libreria di supporto per backbone e per il sistema di templating --&gt;
&lt;script src="js/backbone-min.js"&gt;&lt;/script&gt;&lt;!-- backbone.js --&gt;

&lt;script src="js/demo.js"&gt;&lt;/script&gt; &lt;!-- il file js della nostra applicazione --&gt;</pre><p>
Backbone.js e Undersore.js sono scaricabili dai rispettivi link:</p>
<ul>
<li><a title="Sito web Backbone.js" href="http://backbonejs.org"><span style="color: #000000;">Sito web Backbone.js</span></a></li>
<li><a title="Sito web Underscore.js" href="http://underscorejs.org"><span style="color: #000000;">Sito web Underscore.js</span></a></li>
</ul>
<h2>Il markup HTML</h2>
<p>Andiamo a vedere il markup HTML della view principale dell&#8217;applicazione, ovvero quello che comprende il form di inserimento e la lista:</p><pre class="crayon-plain-tag">&lt;!-- form di creazione dell'individuo --&gt;   

&lt;div class="col-md-4 col-lg-4 well well-sm"&gt; 
    &lt;legend&gt;&lt;i class="glyphicon glyphicon-user"&gt;&lt;/i&gt; Aggiungi individuo&lt;/legend&gt;
    &lt;form action="#" id="add-form" method="post" class="form" role="form"&gt;
        &lt;div class="row"&gt;
            &lt;div class="col-xs-8 col-md-8"&gt;
                &lt;input class="form-control" name="name" placeholder="Nome" type="text" /&gt;
            &lt;/div&gt;
            &lt;div class="col-xs-4 col-md-4"&gt;                    
                &lt;select name="gender" class="form-control"&gt;
                    &lt;option value="M"&gt;Maschio&lt;/option&gt;
                    &lt;option value="F"&gt;Femmina&lt;/option&gt;
                &lt;/select&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;input class="form-control" name="occupation" placeholder="Occupazione" type="text" /&gt;

        &lt;label for="notes"&gt;Note&lt;/label&gt;
        &lt;textarea name="notes" id="notes" class="form-control" rows="3"&gt;&lt;/textarea&gt;
        &lt;button class="btn btn-block button add-person" type="submit"&gt;Aggiungi&lt;/button&gt;
    &lt;/form&gt;
&lt;/div&gt;

&lt;!-- la lista degli individui --&gt;

&lt;div class="col-md-8 col-lg-8"&gt;
 	&lt;ul class="list-group"&gt;
    &lt;/ul&gt;
&lt;/div&gt;</pre><p>
<h2>I template di Underscore.js</h2>
<p>Impostiamo ora il markup HTML dei template delle view secondo il<strong> sistema di templating di underscore.js</strong>; i metodi per comunicare alla view backbone quale template utilizzare per il rendering del markup da inserire poi nel documento sono principalmente tre:</p>
<ol>
<li>Specificare il template sottoforma di <strong>variabile string</strong> nello script</li>
<li>Specificare il <strong>rifermento al template</strong> il cui markup è stato &#8220;posizionato&#8221; nel documento</li>
<li>Utilizzare librerie come <a title="Requirejs.org - Caricare contenuti nel documento in modo asincrono" href="http://requirejs.org"><strong>require.js</strong></a> per &#8220;leggere&#8221; in <strong>modo asincrono</strong> il contenuto del template da un file esterno (solitamente di usa un file con estensione .html)</li>
</ol>
<p>Personalmente preferisco utilizzare l&#8217;ultima opzione, soprattutto nel caso di web app ad architettura molto complessa, per due motivi principali:</p>
<ul>
<li>lasciare il nostro documento più pulito possibile</li>
<li>migliore organizzazione del progetto per quanto riguarda la struttura dei file</li>
</ul>
<p>In questo tutorial tuttavia prenderemo in considerazione il secondo metodo.</p>
<p><strong><em>Per saperne di più sui sistemi di javascript templating leggi</em>: </strong></p>
<ul>
<li><a title="I sistemi di javascript templating e le migliori librerie" href="http://www.upcreative.net/web-application-i-sistemi-di-javascript-templating-e-le-migliori-librerie/">I sistemi di javascript templating e le migliori librerie</a></li>
</ul>
<p>Per l&#8217;esperimento definiremo 3 view, quella dell&#8217;applicazione principale (che comprende il form di inserimento e l&#8217;<em>ul</em> della lista), quella di ogni singolo elemento del lista, e quella della modal delle informazioni aggiuntive.</p>
<p>Poiché per la prima delle tre imposteremo come elemento di riferimento il body stesso del documento, andiamo a definire il markup dei template delle altre due view:</p><pre class="crayon-plain-tag">&lt;!-- *********** Template delle Views ************** --&gt;

&lt;!-- modal dell'elemento della lista --&gt;

&lt;script type="text/template" id="person-template"&gt;

    &lt;div class="view"&gt; 
        &lt;div class="action pull-right"&gt;
            &lt;button type="button" class="btn btn-xs button open-modal" title="View Modal"&gt;
                &lt;span class="glyphicon glyphicon-eye-open"&gt;&lt;/span&gt;
            &lt;/button&gt;
            &lt;button type="button" class="btn btn-xs button edit-view" title="Edit"&gt;
                &lt;span class="glyphicon glyphicon-pencil"&gt;&lt;/span&gt;
            &lt;/button&gt;
            &lt;button type="button" class="btn btn-xs button person-delete" title="Delete"&gt;
                &lt;span class="glyphicon glyphicon-trash"&gt;&lt;/span&gt;
            &lt;/button&gt;
        &lt;/div&gt;

        &lt;h4&gt;&lt;%=name%&gt;&lt;/h4&gt;            
        &lt;div class="gender-info"&gt;
           	Sesso: &lt;strong&gt;&lt;%=gender%&gt;&lt;/strong&gt; - Occupazione: &lt;strong&gt;&lt;%=occupation%&gt;&lt;/strong&gt;
        &lt;/div&gt;
     &lt;/div&gt;

     &lt;div class="edit"&gt;

         &lt;form action="#" class="form" role="form"&gt;
            &lt;div class="row"&gt;
                &lt;div class="col-xs-3 col-md-3"&gt;
                    &lt;input class="form-control" name="name" value="&lt;%=name%&gt;" placeholder="Nome" type="text" /&gt;
                &lt;/div&gt;
                &lt;div class="col-xs-3 col-md-3"&gt;
                    &lt;input class="form-control" value="&lt;%=occupation%&gt;" name="occupation" placeholder="Occupazione" type="text" /&gt;
                &lt;/div&gt;
                &lt;div class="col-xs-2 col-md-2"&gt;                    
                    &lt;select name="gender" class="form-control"&gt;
                        &lt;option value="M" &lt;%if(gender=='M'){%&gt;selected&lt;%}%&gt;&gt;Maschio&lt;/option&gt;
                        &lt;option value="F" &lt;%if(gender=='F'){%&gt;selected&lt;%}%&gt;&gt;Femmina&lt;/option&gt;
                    &lt;/select&gt;
                &lt;/div&gt;
                &lt;div class="col-xs-2 col-md-2"&gt;
                    &lt;button class="btn btn-sm btn-block button save" type="submit"&gt;Salva&lt;/button&gt;
                &lt;/div&gt;
                &lt;div class="col-xs-2 col-md-2"&gt;
                    &lt;a href="#" class="btn btn-sm btn-default btn-block cancel"&gt;Annulla&lt;/a&gt;
                &lt;/div&gt;
            &lt;/div&gt;		            
            &lt;textarea name="notes" id="notes" class="form-control" rows="3"&gt;&lt;%=notes%&gt;&lt;/textarea&gt;
        &lt;/form&gt;

     &lt;/div&gt;

&lt;/script&gt;

&lt;!-- modal delle informazioni aggiuntive--&gt;

&lt;script type="text/template" id="modal-template"&gt;

   &lt;div class="modal-dialog"&gt;
    &lt;div class="modal-content"&gt;
      &lt;div class="modal-header"&gt;
        &lt;button type="button" class="close" data-dismiss="modal" aria-hidden="true"&gt;&amp;times;&lt;/button&gt;
        &lt;h4 class="modal-title"&gt;&lt;%=name%&gt;&lt;/h4&gt;
      &lt;/div&gt;
      &lt;div class="modal-body"&gt;
        	&lt;div class="gender-info"&gt;
               	Sesso: &lt;strong&gt;&lt;%=gender%&gt;&lt;/strong&gt; - Occupazione: &lt;strong&gt;&lt;%=occupation%&gt;&lt;/strong&gt;
            &lt;/div&gt;
            &lt;p class="gender-notes"&gt;
               	&lt;%=notes%&gt;
            &lt;/p&gt;
      &lt;/div&gt;
      &lt;div class="modal-footer"&gt;
        &lt;button type="button" class="btn button" data-dismiss="modal"&gt;Chiudi&lt;/button&gt;
      &lt;/div&gt;
   &lt;/div&gt;

&lt;/script&gt;</pre><p>
Dal codice puoi notare che ogni template è stato definito all&#8217;interno dell tag <em>script</em> in cui è stato impostato un attributo <strong><em>type</em></strong> con valore <em><strong>text/template</strong>. </em>Così facendo il <strong>browser ignorerà questa porzione di codice</strong> che invece sarà <strong>raggiungibile da Javascript</strong> tramite l&#8217;attribuito <em>id</em>.</p>
<h2>Il file JavaScript</h2>
<p>Passiamo ora alla definizione dei vari componenti backbone della nostra applicazione, in primis occupiamoci dell&#8217;astrazione dei dati, <strong>il model della persona:</strong></p><pre class="crayon-plain-tag">//definiamo il modello dell'individuo
var PersonModel = Backbone.Model.extend({

	// Attributi predefiniti per il modello, che vengono usati 
	//se non passati al momento dell'inizializzazione	
	defaults: {
		gender: "M",
		createdat: new Date()
	},

	initialize: function() {  

	},

	//elimina l'istanza del model
	clear: function() {
		this.destroy();
	}

});</pre><p>
<strong>Definiamo ora la collection</strong> in cui tutte le istanze del model appena definito verranno organizzate:</p><pre class="crayon-plain-tag">//definiamo la collection degli individui
var PersonList = Backbone.Collection.extend({

	// Impostiamo la referenza al model per questa collection.
	model: PersonModel,

	url: "#",

	// Filtra tutti gli individui Maschi o Femmina (in base al parametro passato).
	getGender: function(gender) {
		return this.where({gender: gender});
	}

});</pre><p>
Ora che abbiamo definito la nostra (semplicissima) struttura dei dati, vediamo <strong>l&#8217;impostazione delle view.</strong></p>
<h3>La view dell&#8217;elemento della lista</h3>
<pre class="crayon-plain-tag">//impostiamo la view della persona per come elemento nella lista

var PersonView = Backbone.View.extend({

	// diciamo a backbone che il tag deve essere una li
	tagName:  "li",

	//settiamo la classe da impostare al tag li per usare gli stili bootstrap e l'animazione in entrata
	className: "list-group-item animated",

	// Coumunichiamo alla view a quale template far riferimento.
	template: '#person-template',

	// Bindiamo gli eventi agli elementi di questa view (i selettori funzionano come jQuery).
	events: {
		"click .person-delete"        : "deletePerson",
		"click .edit-view"   		  : "toggleView",
		"click .cancel"				  : "toggleView",
		"submit form"			  	  : "savePerson",
		"click .open-modal"			  : "openModal"	
	},

	//questa funzione viene eseguita ogni volta che viene creata 
	//una nuova istanza per questa view
	initialize: function() {

		//compiliamo il template in una variabile
		this.template = _.template($(this.template).html());

		//osserviamo l'evento change del model dell'individuo per fare in modo che 
		//quando ciò accade anche il markup della relativa view venga aggiornato
		this.listenTo(this.model, 'change', this.toggleView);

		//osserviamo l'evento destroy del model dell'individuo per fare in modo che 
		//quando ciò accade anche la relativa view venga rimossa
		this.listenTo(this.model, 'destroy', this.removeFromDOM);
	},

	// Effettua il render dei contenuti del markup della view nella lista.
	render: function() {
		$(this.el).html(this.template(this.model.toJSON()));
		return this;
	},

	//visualizza il modal per le informazioni dell'individuo
	openModal: function(){
		var model = this.model;
		var view = new ModalView({model: model});
		$("body").append(view.render().el);
		///richiamiamo la funzione open della view appena creata
		view.open();
	},

	// Visualizza o nasconde i campi di editing per questa view. 
	toggleView: function() {	
		//riaggiorniamo la vista e cambiamo la classe per la visualizzazione con jQuery
		this.render();
		this.$el.toggleClass("edit");
	},

	//salva i dati modificati dell'indivuduo
	savePerson: function(e){
		e.preventDefault();

		//riprendiamo i dati del nuovo individuo
		var name = $.trim(this.$("[name='name']").val()),
			gender = this.$("[name='gender']").val(),
			occupation = $.trim(this.$("[name='occupation']").val()),
			notes = $.trim(this.$("[name='notes']").val());

	    //se non tutti i campi sono stati compilati, interrompiamo l'operazione
		if(!name.length  || ! occupation.length || !notes.length)
			return;

		//impostiamo i nuovi dati per il model
		this.model.set({
			name: name,
			gender: gender,
			occupation: occupation,
			notes: notes
		});
		//salviamo il model
		this.model.save();
	},

	removeFromDOM: function(){
		//aggiungiamo la classe per l'animazione di uscita, 
		//e alla fine dell'animazione (sappiamo che dura 1 secondo)
		//rimuoviamo l'elemento DOM dal documento
		var that = this;
		that.$el.addClass("hinge");
		setTimeout(function(){
			that.remove();
		}, 1010);		
	},

	// Rimuove la persona distruggendo il relativo model.
	deletePerson: function() {
		this.model.clear();
	}

});</pre>
<h3> La view del modal delle informazioni aggiuntive</h3>
<pre class="crayon-plain-tag">var ModalView = Backbone.View.extend({

	// diciamo a backbone che il tag deve essere una div
	tagName:  "div",

	//settiamo la classe da impostare al tag li per usare gli stili bootstrap e l'animazione in entrata
	className: "modal fade",

	template: "#modal-template",

	initialize: function() {
		//compiliamo il template in una variabile
		this.template = _.template($(this.template).html());

		//rimuoviamo il modal dal DOM quando esso viene nascosto
		this.$el.on("hidden.bs.modal", function(){
			this.remove();
		});
	},

	// Effettua il render dei contenuti del markup della view nella lista.
	render: function() {
		$(this.el).html(this.template(this.model.toJSON()));		
		return this;
	},

	open: function(){
		this.$el.modal("show");
	}

});</pre>
<h3> La view dell&#8217;applicazione</h3>
<pre class="crayon-plain-tag">//definiamo la view dell'app intera
var AppView = Backbone.View.extend({

		//a differenza della view dell'individuo, dove impostavamo 
		//quale elemento generare al'inizializzazione, qui comunichiamo 
		//quale oggetto già aesistente utilizzare come markup
		el: "body",

		// Deleghiamo gli eventi per la creazione di un nuovo 
		//individuo (il funzionamento ed i selettori sono come quelli di jQuery).
		events: {
			"submit #add-form":  "create"
		},

		// Nella funzione di inizializzazione osserviamo l'evento add 
		//della collection legata a questa view, per richiamare la funzione che 
		// inserisce un nuovo elemento nella lista DOM
		initialize: function() {

			var todos = this.collection;

			//deleghiamo gli eventi della collection alle relative funzioni 

			//evento che si verifica quando un nuovo model viene aggiunto alla collection
			// l'ultimo parametro è una funzione alla quale viene passata l'istanza del model appena aggiunto
			// alla collection
			this.listenTo(this.collection, 'add', this.addPerson);

			//richiamiamo la funzione che aggiunge gli elementi all alla lista
			this.addElements();
		},

		// funzione che ogni crea una nuova view ed agigunge 
		// l'elemento generato dal render alla lista
		addPerson: function(personModel) {			
			//creaiamo una nuova istanza della view della persona passando come model quello appena creato
			var view = new PersonView({model: personModel});
			this.$(".list-group").append(view.render().el);
			//aggiungiamo la classe per l'animazione
			view.$el.addClass("fadeInLeftBig");		
		},

		// Aggiunge nella lista tutti gli elementi della collection di individui.
		addElements: function() {
			this.collection.each(this.addPerson);
		},

		// funzione che aggiunge un nuovo model con i dati del form alla collection
		create: function(e) {
			e.preventDefault();
			//riprendiamo i dati del nuovo individuo
			var name = $.trim(this.$("[name='name']").val()),
				gender = this.$("[name='gender']").val(),
				occupation = $.trim(this.$("[name='occupation']").val()),
				notes = $.trim(this.$("[name='notes']").val());

		    //se non tutti i campi sono stati compilati, interrompiamo l'operazione
			if(!name.length  || ! occupation.length || !notes.length)
				return;

			//aggiungiamo il model alla collection
			this.collection.create({
				name: name,
				gender: gender,
				occupation: occupation,
				notes: notes
			});

			//resettiamo il form dopo la creazione
			this.$("input, textarea").val('');
			this.$("[name='gender']").val('M');
		}
	});</pre>
<h3>Avviamo la nostra javascript web application!</h3>
<p>Infine, per instanziare i nostri componenti ed avviare l&#8217;applicazione, ci serviremo del seguente codice javascript:</p><pre class="crayon-plain-tag">// nel momento in cui jQuery è pronto, inizializiamo i nostri componenti 
jQuery(function ($) {
	//creiamo una nuova istanza per la collection degli individui con due models
	var persons = new PersonList([
		{
			name: "Mark Zuckerberg",
			gender: "M",
			occupation: "Sviluppatore",
			notes: "Il creatore di Facebook"
		},
		{
			name: "Giacomo Freddi",
			gender: "M",
			occupation: "Sviluppatore",
			notes: "Web Designer Freelance e Developer, si occupa del design e dello sviluppo di applicazioni "+
					"web dal 2008, come molti freelance è abituato a gestire più ruoli e spaziare su più campi,"+
					" ma la sua passione principale è quella della creazione di interfacce front-end e back-end"+
					" utilizzando codice html5 e css3. Adora usare pattern MVC per i suoi Javascript."
		}
	]);
	//creiamo una nuova istanza per la vire dell'applicazione 
	//principale associandogli la collection
	var app = new AppView({
			collection : persons
	});
});</pre><p>
<h2>Stili e CSS</h2>
<p>Come è possible notare scaricando i sorgenti, al fine di rendere il tutto un po più piacevole all&#8217;utente, abbiamo inserito degli <strong>effetti CSS3</strong> per animare l&#8217;inserimento e l&#8217;eliminazione di ogni record dalla lista; il codice utilizzato proviene dalla <a title="Animate.css libreria per animazioni ed effetti CSS3" href="http://www.upcreative.net/animate-css-animazioni-css3-cross-browser/"><strong>libreria animate.css</strong></a>, e prevede un effetto di entrata con fade da sinistra nel momento dell&#8217;inserimento, mentre un elemento di &#8220;caduta&#8221; nel momento della eliminazione.</p>
<p>Abbiamo inoltre reso il tutto responsive grazie al <a title="Bootstrap 3 - sistema di griglie" href="http://getbootstrap.com/css/#grid">sistema di griglie di Boostrap 3.</a></p>
<p>Divertiti con i sorgenti!</p>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/11/effetto-CSS3-entrata.jpg"><img class="alignnone size-full wp-image-2494" alt="effetto-CSS3-entrata" src="http://www.upcreative.net/wp-content/uploads/2013/11/effetto-CSS3-entrata.jpg" width="690" height="293" /></a> <a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/11/effetto-CSS3-caduta.jpg"><img class="alignnone size-full wp-image-2495" alt="effetto-CSS3-caduta" src="http://www.upcreative.net/wp-content/uploads/2013/11/effetto-CSS3-caduta.jpg" width="690" height="293" /></a></p>
<div class="g-cols">
<div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="wpb_button align_center"><a href="http://www.upcreative.net/tutorials/13112013-backbone-responsive-we-app/"class="g-btn type_primary size_big"><span><i class="fa fa-icon-eye-open"></i>Demo</span></a></div>
 
		</div> 
	</div> </div>
<div class="one-half">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			<div class="wpb_button align_center"><a href="http://www.upcreative.net/download/2491/"class="g-btn type_primary size_big"><span><i class="fa fa-icon-download-alt"></i>Download</span></a></div>
 
		</div> 
	</div> </div>
</div>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/tutorial-backbone-web-app-con-bootstrap-3/">Tutorial: Backbone web app responsive con Bootstrap 3</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/tutorial-backbone-web-app-con-bootstrap-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Animate.css: raccolta di stili per animazioni CSS3 cross browser</title>
		<link>https://www.upcreative.net/animate-css-animazioni-css3-cross-browser/</link>
		<comments>https://www.upcreative.net/animate-css-animazioni-css3-cross-browser/#comments</comments>
		<pubDate>Mon, 11 Nov 2013 20:33:53 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Risorse]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[animazioni]]></category>
		<category><![CDATA[cross browser]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[interfacce]]></category>
		<category><![CDATA[web app]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=2460</guid>
		<description><![CDATA[<p>The post <a rel="nofollow" href="https://www.upcreative.net/animate-css-animazioni-css3-cross-browser/">Animate.css: raccolta di stili per animazioni CSS3 cross browser</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><div class="g-cols"><div class="full-width">
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>Nello sviluppo di un&#8217;<strong>interfaccia</strong>, sia essa progettata per una web app o per un sito web, le <strong>animazioni CSS3</strong> stanno diventando uno degli ingredienti fondamentali. Grazie ad esse è possibile creare una <strong>user experience più gradevole</strong> e inevitabilmente un risultato finale di maggiore qualità (es.: la <a title="Tint Weather App - Applicazione meteo per iOS7" href="http://www.upcreative.net/tint-weather-app/">web page della mia nuova applicazione per iOS7: Tint</a>).</p>
<p>Tuttavia usare stili CSS per creare delle animazioni non è sempre facile, soprattuto se si parla di importanti fattori come <strong>performance</strong> e <strong>compatibilità tra browser.</strong></p>
<p>Combinare <em>animation</em> e <em>transition</em> (accompagnati dai relativi prefissi per i vari browser come -webkit-, -moz-, -ms- , -o-) con degli attributi sbagliati (affronteremo anche questo argomento in uno dei prossimi articoli) può infatti portare a problemi di sfarfallio, scatti e, soprattuto nel caso di dispositivi mobili o di effetti che prevedono lo spostamento ed il rendering di numerosi elementi DOM, ad un crash della nostra applicazione/sito web.</p>
<p>Dall&#8217;altro lato, l&#8217;operazione di scrittura di fogli per animazioni ed effetti in modo corretto può portare via diverse ore del nostro prezioso tempo.</p>
<p>In questo post voglio parlarti di <a title="Animazioni CSS3 cross-crowser con Animate.css" href="https://daneden.me/animate/">animate.css</a>, un&#8217;interessante <strong>raccolta di animazioni CSS3 cross-browser</strong> (ovviamente per browser ci si riferisce a quelli moderni), molto utile se si vuole realizzare effetti di svariato genere.</p>

		</div> 
	</div> 
	<div class="wpb_single_image wpb_content_element animate_rfl align_center">
		<div class="wpb_wrapper">
			
			<img width="238" height="90" src="http://www.upcreative.net/wp-content/uploads/2013/11/logo_upCreative.jpg" class="attachment-full" alt="logo_upCreative" />
		</div> 
	</div> 
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>La libreria, un progetto di <a title="Daniel Eden Designer Inglese" href="https://daneden.me"><strong>Daniel Eden</strong></a>, è stata creata al fine di far risparmiare del tempo a coloro che (come me) usano costantemente gli stessi tipi di animazioni, evitando l&#8217;inutile spreco di quel tempo che altrimenti sarebbe impiegato per organizzare i <em>keyframes</em> degli effetti di cui abbiamo bisogno.</p>
<p>Servendoci di animate.css avremo a disposizione tutti i tipi di animazioni più comuni come shake, bounce, swing, rotate e molti altri combinati tra loro, molto utili per implementare nei nostri lavori oggetti come modal, alerts, transizioni tra pagine ecc..</p>
<p>Dal <a title="Animazioni CSS3 cross-crowser con Animate.css" href="https://daneden.me/animate/">sito web</a> è possibile sia scaricare <strong>l&#8217;intero pacchetto</strong> che <strong>crearne uno personalizzato</strong> in base alle nostre esigenze, solo con gli effetti che vogliamo includere nel documento.</p>
<p>Ogni animazione è stata scritta in modo tale da poter essere eseguita su tutti i browser moderni come safari, mozilla, opera ed IE 10+ (per maggiori dettagli consulta questa <a title="Tabella sulla compatibilità delle animazioni CSS3" href="http://caniuse.com/css-animation">tabella sulla compatibilità delle animazioni CSS3</a>).</p>

		</div> 
	</div> <div class="g-cols"><div class="one-half"><div class="wpb_button align_center"><a href="https://daneden.me/animate/"class="g-btn type_default"><span>Sito web</span></a></div>
</div><div class="one-half"><div class="wpb_button align_center"><a href="https://github.com/daneden/animate.css/blob/master/animate.css"class="g-btn type_default"><span>Git Hub</span></a></div>
</div></div>
	<div class="wpb_text_column ">
		<div class="wpb_wrapper">
			
<p>&nbsp;</p>
<p>Ora potrai concentrati più su quali effetti scegliere per la tua interfaccia che sulla loro stessa creazione, buon divertimento!</p>

		</div> 
	</div> </div></div>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/animate-css-animazioni-css3-cross-browser/">Animate.css: raccolta di stili per animazioni CSS3 cross browser</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/animate-css-animazioni-css3-cross-browser/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>MVC Backbone per creare applicazioni web HTML5</title>
		<link>https://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/</link>
		<comments>https://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/#comments</comments>
		<pubDate>Thu, 31 Oct 2013 08:30:49 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[backbone]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web app]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=2302</guid>
		<description><![CDATA[<p>La scorsa settimana ho introdotto a grandi linee gli argomenti principali di cui parlerà la serie di post/tutorial su come creare applicazioni HTML5, CSS3 e Javascript; in questo post ci soffermeremo in particolare sul design pattern da impiegare per l&#8217;architettura dei nostri</p>
<p>The post <a rel="nofollow" href="https://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/">MVC Backbone per creare applicazioni web HTML5</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>La scorsa settimana ho introdotto a grandi linee gli argomenti principali di cui parlerà la serie di post/tutorial su <strong>come creare applicazioni HTML5, CSS3 e Javascript;</strong> in questo post ci soffermeremo in particolare sul design pattern da impiegare per l&#8217;architettura dei nostri progetti e di quale framework servirci per la sua realizzazione.</p>
<p><strong>Leggi anche</strong>:</p>
<ul>
<li><a title="Web applications: scrivere codice ben strutturato con i Javascript Design Patterns" href="http://www.upcreative.net/web-applications-codice-ben-strutturato-i-javascript-design-patterns/">Web applications: scrivere codice ben strutturato con i javascript design patterns</a></li>
<li><a title="Creare applicazioni web: il pattern Model-View-Controller ed i principali MVC javascript frameworks" href="http://www.upcreative.net/creare-applicazioni-web-il-pattern-mvc-ed-i-principali-mvc-javascript-frameworks/">Creare applicazioni web: il pattern Model-View-Controller ed i principali MVC javascript frameworks</a></li>
</ul>
<h3>Utilizziamo il pattern MVC</h3>
<p>Perché ho scelto il tipo di pattern <strong>Model-View-Controller</strong>?</p>
<p>Innumerevoli sono i benefici che questo tipo di architettura comporta, ma il primo fra questi è <strong>l&#8217;indipendenza di ogni componente rispetto agli altri: il Model </strong>agisce solamente all&#8217;interno del suo ambiente, servendosi di metodi pubblici per l&#8217;esclusiva gestione dei dati al suo interno; chi usa quei metodi come le <strong>Views</strong> o i <strong>Controllers</strong> non devono minimamente preoccuparsi di quello che accade all&#8217;interno dell&#8217;oggetto passato.</p>
<p>Ne consegue che la View deve svolgere il minimo lavoro per creare o modificare il DOM in base al record passato e agisce in modo &#8220;ignorante&#8221; rispetto ad ogni altra View, diventando così un <strong>componente altamente riutilizzabile</strong>; il Controller, che conosce invece ogni singola View o quelle a cui esso ha accesso, si preoccupa di gestire le connessioni fra le stesse.</p>
<p>Quindi perché scegliamo l&#8217;MVC? Ecco i motivi principali per cui ho scelto questo pattern:</p>
<ul>
<li>presenta una <strong>logica semplice</strong></li>
<li>la creazione dei dati avviene secondo una <strong>convenzione generica</strong></li>
<li>la <strong>riusabilità </strong>delle varie parti dell&#8217;interfaccia e la loro indipendenza da qualsiasi altro controllo</li>
<li><strong>la sacrificabilità del controller,</strong> come elemento indipendente dai record e dall&#8217;interfaccia</li>
<li><strong>l&#8217;eliminazione di buona parte del lavoro al server</strong>, come la manipolazione dei dati oppure la creazione dei template</li>
</ul>
<p>Negli prossimi articoli ti mostrerò come ogni elemento della nostra applicazione HTML5 (come modals, pagine, alerts, liste, menu ecc.) è gestito dalla propria View e come più di una View si aggiorna alla modifica del record di un model in modo del tutto indipendente, il tutto <strong>minimizzando al massimo il minor numero di righe di codice</strong>.</p>
<h3>MVC Backbone &#8211; scelta del framework</h3>
<p>Il primo framework nella serie di tutorial che analizzerò sarà <a title="Backbone.js - framework javascript" href="http://backbonejs.org/">Backbone</a>; come già accennato in un <a title="I principali MVC frameworks" href="http://www.upcreative.net/creare-applicazioni-web-il-pattern-mvc-ed-i-principali-mvc-javascript-frameworks/">precedente articolo</a>, backbone.js è una libreria molto completa, in quanto presenta tutti gli elementi di cui abbiamo bisogno:</p>
<ol>
<li>I model</li>
<li>Le view</li>
<li>Le collection (liste di models)</li>
<li>Il router (utilissimo per le <strong>HTML5 single page app</strong>)</li>
<li>Un valido sistema di templating (con la possibilità, ovviamente, di utilizzarne altri)</li>
</ol>
<p><strong>Leggi anche:</strong></p>
<ul>
<li><a title="I sistemi di javascript templating e le migliori librerie" href="http://www.upcreative.net/web-application-i-sistemi-di-javascript-templating-e-le-migliori-librerie/">I sistemi di javascript templating e le migliori librerie</a></li>
</ul>
<p>Dalla lista è possibile notare che Backbone non offre un componente chiaramente identificato come controller, quindi è possibile dire che il pattern utilizzato da backbone è un <strong>MV*</strong>, anche se di solito si utilizza una View principale o il <strong>Router</strong> che funge da Controller.</p>
<p>Nel prossimo articolo ti mostrerò come impostare il documento per una applicazione web in HTML5, CSS3 e Javascript con backbone.js, tramite un interessante tutorial in cui una view si aggiorna ogni volta che il model subisce dei cambiamenti.</p>
<p style="padding-left: 30px;"><strong>EDIT</strong>: ho scritto un post su come impostare un documento con Backbone.js e su come una view reagisce ai cambiamenti del model ad esso associato per il blog  <strong>lobaedesign.com</strong>: <a title="Tutorial Backbone.js: come realizzare un orologio analogico CSS3 e JavaScript con animazione" href="http://www.lobaedesign.com/tutorial-backbone-js-come-realizzare-un-orologio-css3-e-javascript-con-animazione/">Tutorial Backbone.js: come realizzare un orologio analogico CSS3 e JavaScript con animazione</a></p>
<h3>Web App create con Backbone.js</h3>
<p>Di seguito alcune web app di successo realizzate in HTML5 e Javascript utilizzando backbone.js, o che lo usano per alcuni dei loro componenti:</p>
<h4><a title="New Rdio - Backbone.js web app" href="http://rdio.com/new"><strong>New Rdio</strong></a></h4>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-01.jpg"><img class="alignnone size-full wp-image-2318" alt="backbone-js-web-app-01" src="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-01.jpg" width="690" height="417" /></a></p>
<h4><a title="Quartz - Backbone.js HTML Web App" href="http://qz.com/"><strong>Quartz</strong></a></h4>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-02.jpg"><img class="alignnone size-full wp-image-2320" alt="backbone-js-web-app-02" src="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-02.jpg" width="690" height="469" /></a></p>
<h4><a title="Flow - Backbone.js HTML5 web app" href="http://www.getflow.com/"><strong>Flow</strong></a></h4>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-03.jpg"><img class="alignnone size-full wp-image-2315" alt="backbone-js-web-app-03" src="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-03.jpg" width="690" height="507" /></a></p>
<h4><a title="Foursquare - Backbone.js Web App" href="https://foursquare.com"><strong>Foursquare</strong></a></h4>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-04.jpg"><img class="alignnone size-full wp-image-2319" alt="backbone-js-web-app-04" src="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-04.jpg" width="690" height="520" /></a></p>
<h4><a title="Disqus - Usa Backbone.js per il sistema di commenti" href="http://www.disqus.com/"><strong>Disqus</strong></a></h4>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-05.jpg"><img class="alignnone size-full wp-image-2317" alt="backbone-js-web-app-05" src="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-05.jpg" width="690" height="554" /></a></p>
<h4><strong><a title="Delicious - Usa Backbone.js" href="https://delicious.com/">Delicious<br />
</a></strong></h4>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-06.jpg"><img class="alignnone size-full wp-image-2316" alt="backbone-js-web-app-06" src="http://www.upcreative.net/wp-content/uploads/2013/10/backbone-js-web-app-06.jpg" width="690" height="418" /></a></p>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/">MVC Backbone per creare applicazioni web HTML5</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/mvc-backbone-per-html5-css3-javascript-web-app/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Creare applicazioni HTML5, CSS3 e Javascript</title>
		<link>https://www.upcreative.net/creare-applicazioni-html5-css3-e-javascript/</link>
		<comments>https://www.upcreative.net/creare-applicazioni-html5-css3-e-javascript/#comments</comments>
		<pubDate>Mon, 28 Oct 2013 21:11:31 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mobile app]]></category>
		<category><![CDATA[web app]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=2292</guid>
		<description><![CDATA[<p>Con questo post voglio inaugurare una collana di articoli-tutorial incentrati su come creare applicazioni HTML5, CSS3 e Javascript, che avranno come obiettivo quello di rappresentare un punto di riferimento o di confronto per chi vuole iniziare a scrivere la propria</p>
<p>The post <a rel="nofollow" href="https://www.upcreative.net/creare-applicazioni-html5-css3-e-javascript/">Creare applicazioni HTML5, CSS3 e Javascript</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>Con questo post voglio inaugurare una <strong>collana di articoli-tutorial incentrati su come creare applicazioni HTML5, CSS3 e Javascript</strong>, che avranno come obiettivo quello di rappresentare un punto di riferimento o di confronto per chi vuole iniziare a scrivere la propria app o per coloro che già lo stanno facendo.</p>
<p>Tali applicazioni potranno poi essere eseguite sia su browser che su tutti i dispositivi mobile, su sistemi operativi come iOS, android e Windows Phone.</p>
<p>Il processo di realizzazione di una web app prevede un vasto percorso, più o meno intricato a seconda della complessità del progetto in questione, come per esempio:</p>
<ul>
<li>Lo studio della concorrenza</li>
<li>La definizione degli obiettivi e delle funzionalità che dovrà offrire</li>
<li>La creazione delle varie viste dell&#8217;interfaccia con il wireframing</li>
<li>La realizzazione grafica del template</li>
<li>La trasformazione del template in HTML</li>
<li>La scelta dell&#8217;ambiente di sviluppo</li>
<li>La scelta delle librerie e framework da utilizzare per l&#8217;astrazione ed il salvataggio dei dati, ( per es. il linguaggio lato server o il tipo di DB)</li>
<li>Ecc. &#8230;</li>
</ul>
<p>Ovviamente sono ancora molti i punti da aggiungere o da togliere a seconda del tipo di progetto che si vuole realizzare, ma mi soffermerò in particolar modo sulla parte &#8220;più meccanica&#8221; ( se così mi è concesso chiamarla), ovvero quella che riguarda la scelta delle <strong>librerie e del tipo di pattern da utilizzare</strong>, della creazione del <strong>markup HTML</strong> e del tipo di piattaforma per il salvataggio dei dati.</p>
<h3>Il pattern da utilizzare</h3>
<p>Poiché la mia attenzione é incentrata sulla creazione di web app ad architettura complessa, il tipo di pattern javascript (<a title="Creare applicazioni web con i javascript design patterns" href="http://www.upcreative.net/web-applications-codice-ben-strutturato-i-javascript-design-patterns/">leggi questo articolo </a>per capire cos&#8217;è un pattern javascript e quali sono i più utilizzati) è un aspetto chiave su cui meditare, in base al quale possono cambiare (anche completamente) tutti i passaggi successivi.</p>
<h3>La scelta del framework per la struttura del progetto</h3>
<p>Esistono diversi frameworks javascript che facilitano la costruzione e l&#8217;organizzazione strutturale di una web app complesse ( a tal proposito ti consiglio di <a title="I principali javascript MVC frameworks per creare applicazioni web" href="http://www.upcreative.net/creare-applicazioni-web-il-pattern-mvc-ed-i-principali-mvc-javascript-frameworks/">leggere questo post</a>, che elenca quelli più utilizzati), ed in questa collana di articoli ne prenderemo in considerazione uno in particolare.</p>
<h3>La scelta del framework per la creazione dell&#8217;interfaccia front-end</h3>
<p>Siccome a mio avviso solo per realizzazione grafica del layout dell&#8217;interfaccia bisognerebbe dedicare una collana di articoli a sé stante, in questa serie-tutorial utilizzeremo frameworks responsive (anche su questo argomento ho scritto un articolo sui <a title="I 10 migliori framework responsive per la creazione di web applications" href="http://www.upcreative.net/web-design-i-10-migliori-framework-responsive-css/">migliori 10 framework responsive</a> oppure uno su <a title="8 mobile framework per la creazione di applicazioni in HTML5, CSS e Javascript" href="http://www.upcreative.net/8-mobile-framework-per-applicazioni-html5-css-javascript/">8 front-end mobile frameworks</a> ), che ci risparmieranno gran parte del processo di creazione degli stili di elementi come griglie, pulsanti, form ecc..</p>
<h3>E molto altro</h3>
<div>Molti altri aspetti oltre a quelli appena elencati verrano affrontati nei prossimi articoli di questa collana-tutorial sulla creazione di applicazioni web javascript; il prossimo step sarà incentrato sulla scelta del pattern da utilizzare e sul framework per l&#8217;architettura della web application.<br />
Se sei interessato a questa serie di tutorial e non ne vuoi perdere nemmeno uno puoi iscriverti alla newsletter dal modulo sottostante, seguirmi tramite i <a title="Feed Rss di upcreative.net" href="http://feeds.feedburner.com/Upcreative">feed rss</a> o sul mio <a title="upCreative - Account Twitter" href="https://twitter.com/upCreativeIta">account Twitter</a>.</div>
<div>Al prossimo appuntamento!&nbsp;</p>
</div>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/creare-applicazioni-html5-css3-e-javascript/">Creare applicazioni HTML5, CSS3 e Javascript</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/creare-applicazioni-html5-css3-e-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I sistemi di javascript templating e le migliori librerie</title>
		<link>https://www.upcreative.net/web-application-i-sistemi-di-javascript-templating-e-le-migliori-librerie/</link>
		<comments>https://www.upcreative.net/web-application-i-sistemi-di-javascript-templating-e-le-migliori-librerie/#comments</comments>
		<pubDate>Thu, 24 Oct 2013 08:59:53 +0000</pubDate>
		<dc:creator><![CDATA[upcreative]]></dc:creator>
				<category><![CDATA[Creare applicazioni javascript]]></category>
		<category><![CDATA[Web Apps]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[markup html]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[templating engines]]></category>
		<category><![CDATA[web app]]></category>

		<guid isPermaLink="false">http://www.upcreative.net/?p=2234</guid>
		<description><![CDATA[<p>Numerose sono le librerie nate per supportare lo sviluppatore durante il processo di creazione di una web app javascript, ognuna relativa ad una determinata fase. Una categoria che ricopre grande importanza è senz&#8217;altro quella che riguarda il sistema di javascript</p>
<p>The post <a rel="nofollow" href="https://www.upcreative.net/web-application-i-sistemi-di-javascript-templating-e-le-migliori-librerie/">I sistemi di javascript templating e le migliori librerie</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>Numerose sono le librerie nate per supportare lo sviluppatore durante il processo di creazione di una web app javascript, ognuna relativa ad una determinata fase. Una categoria che ricopre grande importanza è senz&#8217;altro quella che riguarda il <strong>sistema di javascript templating</strong>.</p>
<p>Per la realizzazione di un&#8217;applicazione javascript infatti, vengono utilizzati nella maggior parte dei casi i template engines, che permettono di aggiornare facilmente il markup HTML dell&#8217;interfaccia invece di preoccuparsi di farlo in modo &#8220;manuale&#8221; usando librerie come jQuery.</p>
<p>Molteplici sono i benefici derivanti dall&#8217;utilizzo di questi sistemi, tra i quali possiamo sottolineare:</p>
<ul>
<li>aumento delle performance di esecuzione</li>
<li>riduzione e pulizia del codice</li>
<li>velocità di sviluppo</li>
</ul>
<h3>Come funzionano i sistemi di templating?</h3>
<div>
<p>La grande utilità di questi tipi di framework risiede nel fatto che la logica secondo la quale essi funzionano richiama a grandi linee quella dei template HTML generati usando <strong>linguaggi lato-server</strong>.</p>
<p>Nei markup HTML infatti, che sono dichiarati solitamente in file Javascript o all&#8217;interno del documento (sottoforma di tag script con un <em>type attribute alternate</em>) o in una variabile di tipo string, possono essere inserite delle variabili, dei cicli o delle condizioni secondo sintassi specifiche, e in alcuni casi può essere utilizzato direttamente anche codice javascript.</p>
<p>Il <strong>funzionamento</strong> è molto semplice: per prima cosa viene creato il markup, poi viene creata una compilazione tramite javascript, la quale è infine combinata con i dati che abbiamo a disposizione e per generare l&#8217;HTML da inserire in un punto specifico dell&#8217;interfaccia.</p>
<p>Di solito questo processo è gestito dai moduli delle View del progetto (nel caso di una architettura di <a title="Creare applicazioni con pattern MVC" href="http://www.upcreative.net/creare-applicazioni-web-il-pattern-mvc-ed-i-principali-mvc-javascript-frameworks/">tipo MVC</a>), e viene richiamato ogni volta che il Model a cui quella view è collegata subisce delle modifiche.</p>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/schema-funzionamento-template-engines.jpg"><img class="alignnone size-full wp-image-2237" alt="schema-funzionamento-template-engines" src="http://www.upcreative.net/wp-content/uploads/2013/10/schema-funzionamento-template-engines.jpg" width="690" height="400" /></a></p>
<p>Ecco l&#8217;esempio di una View che, all&#8217;evento di modifica del model associato, richiama l&#8217;aggiornamento del proprio markup tramite il sistema di templating (il codice è prelevato da una mia applicazione scritta utilizzando il framework MVC <a title="Backbone.js - Framework MVC" href="http://backbonejs.org">Backbone.js</a>).</p><pre class="crayon-plain-tag">window.WeathericonsView = Backbone.View.extend({    	
    initialize:function () {
        //all'evento di cambiamento degli attributi del model,
        // viene richiamata la funzione 'render' della view
        this.listenTo(this.model, &quot;change&quot;, this.render);		
    },    
    render:function () { 
        //this.template &egrave; la compilazione del template,
        //attribuita alla view da un javascript di utilit&agrave; esterno

        //l'istruzione this.model.toJSON() converte i dati del model 
        //in formato json per poter essere processato dal sistema 
        //di templating
        this.$el.html(this.template(this.model.toJSON())); 
        return this;
    }

});</pre><p>
Nei progetti più complessi,  ai fini di una buona strutturazione, è pratica molto comune <strong>creare un file .html separato</strong> per il template di ogni view (che vengono poi richiamati tramite tools javascript come <a title="Javascript per il caricamento di moduli esterni" href="http://requirejs.org">require.js</a>), in modo da distinguere ogni componente dall&#8217;altro.</p>
<h2>I framework più conosciuti ed utilizzati</h2>
<p>Nel mondo del web sono nati numerosi framework open-source per il<strong> templating client-side</strong>. La decisione su quale utilizzare è dettata da molti fattori, come per esempio l&#8217;architettura e la complessità del progetto, le <strong>performance di esecuzione</strong> del sistema o la sintassi utilizzata (ogni sistema utilizza la propria).</p>
<p>I vari tipi di template engines si suddividono in due categorie principali:</p>
<ul>
<li><strong>embedded javascript, </strong>che comprende i frameworks che permettono l&#8217;utilizzo di codice javascript all&#8217;interno dei propri template</li>
<li><strong>logic less, </strong>che comprende<strong> </strong>quelli che non permettono l&#8217;utilizzo di javascript, ma che limitano l&#8217;uso di logiche come cicli e condizioni a sintassi personalizzate</li>
</ul>
<p>Di seguito voglio proporti i sistemi di templating più utilizzati e performanti, e con cui personalmente mi sono trovato più a mio agio.</p>
<h3><a title="Underscore - semplice sistema di templating" href="http://underscorejs.org">Underscore.js</a></h3>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_01.jpg"><img class="alignnone size-full wp-image-2244" alt="I-sistemi-di-javascript-templating-e-le-migliori-librerie_01" src="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_01.jpg" width="690" height="350" /></a></p>
<p>E&#8217; un sistema di templating proprio della libreria underscore.js, viene richiamato con  il metodo <em>_.template e </em> appartiene alla categoria degli embedded javascript. E&#8217; indicato per progetti con <strong>architettura più semplice</strong>, e visto che la maggior parte dei progetti javascript include solitamente la libreria underscore (per via delle innumerevoli funzioni di utilità che offre), questo sistema di template costituisce una risorsa molto utilizzata.</p>
<h3><a title="Handlebars.js - Systema di templating" href="http://handlebarsjs.com">Handlebars.js</a></h3>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_02.jpg"><img class="alignnone size-full wp-image-2245" alt="I-sistemi-di-javascript-templating-e-le-migliori-librerie_02" src="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_02.jpg" width="690" height="350" /></a></p>
<p>Se hai bisogno di realizzare qualcosa di più complesso e con maggiore flessibilità, allora Handlebars fa al caso tuo. Appartenente alla categoria <em>Logic-less</em>, grazie ai suoi numerosi costrutti logici (come loop e condizioni &#8211; rispettivamente #each e #if), alla presenza di funzioni di utilità globali ed alla possibilità di scrivere funzioni personalizzate, con Handlebars avrai a disposizione un tutto il necessario per la creazione di template molto complessi.<br />
<strong></strong></p>
<h3><a title="Mustache.js - template engine" href="http://mustache.github.io">Mustache.js</a></h3>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_03.jpg"><img class="alignnone size-full wp-image-2246" alt="I-sistemi-di-javascript-templating-e-le-migliori-librerie_03" src="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_03.jpg" width="690" height="350" /></a></p>
<p>Altro sistema <em>logic-less molto utilizzato,</em> nonché ottima soluzione di templating, costituisce la base del sopra citato handlebars.js, quindi si presenta molto più semplice e con qualche funzione di utilità in meno. Grazie alla sua sintassi pulita è facile da scrivere, rileggere e mantenere, anche se in alcuni casi troppo basilare. Inoltre il markup non viene pre compilato e quindi ha una velocità di rendering più lenta di Handlebars.</p>
<h3><a title="Dust.js - Logic less template engine" href="http://akdubya.github.io/dustjs/">Dust.js</a></h3>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_04.jpg"><img class="alignnone size-full wp-image-2247" alt="I-sistemi-di-javascript-templating-e-le-migliori-librerie_04" src="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_04.jpg" width="690" height="350" /></a></p>
<p>Sviluppato da LinkedIn, dust.js è un altro <em>logic-less</em> che offre una logica molto semplice ed intuitiva, per codice più pulito e compatto; presenta una buona collezione di funzioni di utilità, la possibilità di generare il markup in modo asincrono e quella di cerare template &#8220;assemblabili&#8221;.</p>
<h3><a title="Hogan.js Sistema di templating" href="http://twitter.github.io/hogan.js/">Hogan.js</a></h3>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_05.jpg"><img class="alignnone size-full wp-image-2248" alt="I-sistemi-di-javascript-templating-e-le-migliori-librerie_05" src="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_05.jpg" width="690" height="350" /></a></p>
<p>E&#8217; sviluppato da Twitter, rappresenta una soluzione di templating <em>logic-less</em> molto semplice ed alquanto basilare. Costruito come handlebars.js sulla base di mustache, anch&#8217;esso prevede un processo di precompilazione che velocizza quello di rendering.</p>
<h3><a title="Template engine" href="http://embeddedjs.com/" target="_blank">Embedded.js</a></h3>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_06.jpg"><img class="alignnone size-full wp-image-2249" alt="I-sistemi-di-javascript-templating-e-le-migliori-librerie_06" src="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_06.jpg" width="690" height="350" /></a></p>
<p>Come afferma il suo nome, Embedded JS appartiene alla categoria degli <em>embedded-javascript</em>. Esso utilizza gli stessi tag di underscore e funzioni di utilità inspirate a <a title="Web development framework" href="http://rubyonrails.org" target="_blank">Ruby on Rails</a>. Con questo sistema ogni template deve essere salvato in un file separato, il cui nome viene poi passato alla funzione di rendering.</p>
<h3><a title="Jade Templating - Ottimo sistema di templating" href="http://jade-lang.com/" target="_blank">Jade templating</a></h3>
<p><a ref="magnificPopup" href="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_07.jpg"><img class="alignnone size-full wp-image-2250" alt="I-sistemi-di-javascript-templating-e-le-migliori-librerie_07" src="http://www.upcreative.net/wp-content/uploads/2013/10/I-sistemi-di-javascript-templating-e-le-migliori-librerie_07.jpg" width="690" height="350" /></a></p>
<p>Altro <em>logic-less</em>, costituisce un sistema molto diverso dagli altri, per una caratteristica in particolare, la sintassi, che si basa in massima parte sull&#8217;impiego di indentazioni di riga e spazi.</p>
<h3>Altri sistemi di templating engine:</h3>
<ul>
<li><a href="https://github.com/medikoo/domjs">Dom.js</a></li>
<li><a href="http://olado.github.com/doT/">doT.js</a></li>
<li><a href="http://embeddedjs.com/">EJS</a></li>
<li><a href="http://icanhazjs.com/">ICanHaz.js</a></li>
<li><a href="http://borismoore.github.com/jsrender/demos/index.html">JsRender.js</a></li>
<li><a href="https://github.com/adammark/Markup.js">Markup.js</a></li>
<li><a href="http://ejohn.org/blog/javascript-micro-templating/">Microtemplating</a></li>
</ul>
</div>
</div></div><p>The post <a rel="nofollow" href="https://www.upcreative.net/web-application-i-sistemi-di-javascript-templating-e-le-migliori-librerie/">I sistemi di javascript templating e le migliori librerie</a> appeared first on <a rel="nofollow" href="https://www.upcreative.net">upCreative</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.upcreative.net/web-application-i-sistemi-di-javascript-templating-e-le-migliori-librerie/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
