 
 
 <?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; progress bar</title>
	<atom:link href="https://www.upcreative.net/tag/progress-bar/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 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>
	</channel>
</rss>
