<?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>pon css en tu vida! &#187; rating</title>
	<atom:link href="http://blog.joanfernandez.es/tag/rating/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.joanfernandez.es</link>
	<description>css, html, javascript, php y mucho mas...</description>
	<lastBuildDate>Wed, 15 Sep 2010 08:23:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Sistema de rating con jQuery.</title>
		<link>http://blog.joanfernandez.es/2009/07/sistema-de-rating-con-jquery/</link>
		<comments>http://blog.joanfernandez.es/2009/07/sistema-de-rating-con-jquery/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 10:10:27 +0000</pubDate>
		<dc:creator>Joan</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Cómo se hizo]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[rating]]></category>
		<category><![CDATA[tutoriales]]></category>

		<guid isPermaLink="false">http://blog.joanfernandez.es/?p=289</guid>
		<description><![CDATA[Uno de los primeros posts que escribí en este blog, fue un tutorial para crear un sistema de valoración por css.
Ese sistema nos puede interesar cuando no necesitamos la valoración del usuario, y tan solo queremos mostrar un ranking estático de forma mucho más visual de lo que podría ser el típico numero de 1 [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los primeros posts que escribí en este blog, fue un tutorial para crear un <a title="Sistema de valoración por css" href="http://blog.joanfernandez.es/2009/05/sistema-de-valoracion-por-css/">sistema de valoración por css</a>.</p>
<p>Ese sistema nos puede interesar cuando no necesitamos la valoración del usuario, y tan solo queremos mostrar un ranking estático de forma mucho más visual de lo que podría ser el típico numero de 1 a 5.</p>
<p>Hoy, para cerrar el círculo, vamos a ver como crear otro sistema de valoración, esta vez utilizando jQuery.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-290" title="sistema-rating-jquery" src="http://blog.joanfernandez.es/wp-content/uploads/2009/07/sistema-rating-jquery.png" alt="sistema-rating-jquery" width="550" height="339" /></p>
<p style="text-align: center;"><a title="Ver ejemplo valoración jQuery" href="http://blog.joanfernandez.es/ejemplos/valoracion-jquery/">- VER DEMO -</a> | <a title="Descargar archivos tutorial" href="http://blog.joanfernandez.es/ejemplos/tutorial-valoracion-jquery.rar">- DESCARGAR EJEMPLO -</a></p>
<p><span id="more-289"></span></p>
<h3>Creando el HTML</h3>
<p>El código HTML necesario es muy simple:</p>
<pre class="brush: xml;">
&lt;h1&gt;Test rating jQuery&lt;/h1&gt;
&lt;div id=&quot;rating&quot;&gt;
&lt;span class=&quot;moving-bg&quot;&gt;&amp;nbsp;&lt;/span&gt;
&lt;span&gt;&amp;nbsp;&lt;/span&gt;
&lt;/div&gt;
&lt;div id=&quot;status2&quot;&gt;8.0&lt;/div&gt;
&lt;div id=&quot;msg&quot;&gt;&lt;/div&gt;
</pre>
<p>Necesitamos 2 capas, una para la barra (<em>rating</em>), otra para el valor numérico de la votación (<em>status2</em>). La tercera capa (<em>msg</em>) es simplemente para mostrar al usuario la votación que ha realizado, y es totalmente prescindible.</p>
<p>Como veis, el código no es demasiado semántico, pero es algo que se puede perdonar en favor de una mayor interactividad por parte del usuario.</p>
<p>Los resultados, por ahora, <a title="Ver ejemplo valoración jQuery - Paso 1" href="http://blog.joanfernandez.es/ejemplos/valoracion-jquery/index-html.html">no son espectaculares</a>.</p>
<h3>Añadiendo CSS.</h3>
<p>Para formar la &#8220;rejilla&#8221; de valoración, necesitaremos 2 imágenes: <a title="Rejilla" href="http://blog.joanfernandez.es/ejemplos/valoracion-jquery/images/grid.png">la rejilla</a> y el <a title="Fondo degradado" href="http://blog.joanfernandez.es/ejemplos/valoracion-jquery/images/rainbow.png">fondo con el degradado</a>.</p>
<p>La idea es la siguiente:</p>
<p><img class="aligncenter size-full wp-image-293" title="esquema" src="http://blog.joanfernandez.es/wp-content/uploads/2009/07/esquema.png" alt="esquema" width="411" height="145" /><em>rainbow.png</em> y <em>grid.png</em> son imágenes de fondo para el <em>div#rating </em>y el segundo <em>span</em>, respectivamente. El <em>span.moving-bg</em>, situado en medio de los dos, es el que iremos moviendo dependiendo de la posición del cursor, o del valor de la votación.</p>
<p>Al desplazar el span gris,  a través de las transparencias de grid.png se podrá ver el degradado que hay como fondo, dando la sensación de que son las &#8220;celdas&#8221; de grid.png las que se van &#8220;llenando&#8221;.</p>
<p>El CSS quedaría así:</p>
<pre class="brush: css;">
#rating {
background: transparent url(images/rainbow.png) 0 0 no-repeat;
width: 216px;
height: 41px;
float: left;
position: relative;
z-index: 2;
overflow: hidden;
cursor: pointer;
}
#rating span{
display: block;
width: 216px;
height: 41px;
background: transparent url(images/grid.png) 0 0 no-repeat;
position: relative;
z-index: 1;
}
#rating span.moving-bg{
position: absolute;
top:0;
left:0;
background-image: none;
background-color: #CCC;
}
#status2 {
width: 50px;
float: left;
border: 1px solid #ccc;
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
-khtml-border-radius: 5px;
font-size: 2em;
text-align: center;
font-weight: bold;
margin-left: 10px;
}
#msg {
clear: both;
}
</pre>
<p>Después aplicar los estilos del CSS, el <a title="Ver ejemplo valoración jQuery - Paso 2" href="http://blog.joanfernandez.es/ejemplos/valoracion-jquery/index-css.html">resultado mejora notablemente</a>.</p>
<h3>Dale vida con jQuery</h3>
<p>Ahora, lo tenemos todo ya preparado para añadir el &#8220;toque mágico&#8221; con jQuery, y convertir esto en un sistema de valoración como esperamos.</p>
<p>Analizando la situación, nos damos cuenta de que tendremos cuatro escenarios diferentes:</p>
<ol>
<li>Carga de la página</li>
<li>El usuario sitúa el cursor encima de la barra.</li>
<li>El usuario hace clic para emitir su voto.</li>
<li>El usuario quita el cursor de la barra.</li>
</ol>
<p>Sabemos que una tarea que tendremos que repetir con frecuencia es la de actualizar la posición del fondo gris, por lo tanto vamos a crear una sencilla función, para que nuestro código esté lo más limpio posible.</p>
<pre class="brush: jscript;">
/**
 * Mueve la capa de &quot;color&quot; para que se adapte al valor
 * pasado.
 * @param valor int
 * @param tamanyo_capa int
 */
function actualizarPos (valor, tamanyo_capa) {
var p = Math.round(valor * tamanyo_capa / 10);
$('#rating span.moving-bg').animate( { left: p }, 500 );
}
</pre>
<p>actualizarPos tan solo actualiza, dependiendo del tamaño de la capa contenedora, la posición del fondo gris, dependiendo de la valoración (valor).<br />
Nos valdremos de la función de jQuery <strong>document.ready</strong>, para ejecutar nuestro código cuando ya el DOM esté cargado:</p>
<pre class="brush: jscript;">
$(document).ready( function() {
// Obtenemos el valor inicial
var valoracion_defecto = parseFloat($('#status2').html());
// Obtenemos el tamaño del div
var w = $('#rating').css('width');
// eliminamos el px
var width_div = parseInt(w.slice(0,w.length-2));

// Al usuario siempre mostraremos una cifra con un solo decimal
var valoracion_defecto_num = valoracion_defecto.toPrecision(2);
actualizarPos(valoracion_defecto, width_div);

   $(&quot;#rating&quot;).mousemove(function(e){

// Obtenemos la posición del cursor dentro del elemento
var x = e.pageX - this.offsetLeft;
// Desplazamos la barra gris hasta esa posición
$('#rating span.moving-bg').css('left', x);
// Actualizamos el valor numérico
// Este valor siempre será un entero
$('#status2').html(Math.round(x*10/width_div));

   });
   $(&quot;#rating&quot;).click(function(e){
// Obtenemos la posicion del cursor dentro del elemento.
var x = e.pageX - this.offsetLeft;
// Obtenemos el resultado de la votación
var r = Math.round(x*100/width_div/10);

// Actualizamos el valor numerico
valoracion_defecto = (valoracion_defecto + r) / 2;
// lo mostramos en pantalla, siempre con un solo decimal
valoracion_defecto_num = valoracion_defecto.toPrecision(2);
$('#status2').html(valoracion_defecto_num);

// Actualizamos la posición de la barra gris
actualizarPos(valoracion_defecto, width_div);
// Mostramos el mensaje al usuario de su voto.
$('#msg').html(&quot;Has votado: &quot; + r);
   });

   $(&quot;#rating&quot;).mouseout(function(e){
// Actualizamos el valor numérico al que pertenece
$('#status2').html(valoracion_defecto_num);
// Actualizamos la posición de la barra gris
actualizarPos(valoracion_defecto, width_div);
   });

});
</pre>
<p>Dividimos el código en cuatro bloques:<br />
<strong>Al cargar la página</strong>, obtenemos el valor por defecto de la votación y posicionamos la barra gris dependiendo del valor obtenido.<br />
La valoración que se muestra al usuario siempre será una cifra con 1 decimal, por lo que utilizamos la función <strong>toPrecision()</strong>.</p>
<p><strong>Cuando el usuario situé el cursor encima del elemento</strong>, se ejecutará la función <strong>mousemove</strong>. En este caso, obtenemos la posición del cursor dentro del elemento, y movemos la barra gris a la posición del cursor. También actualizamos el valor numérico, que deberá ser un entero.</p>
<p><strong>Cuando el usuario mueva el cursor fuera de la barra (<em>mouseout</em>)</strong>, esta volverá a tomar el valor del campo numérico por defecto.</p>
<p><strong>Si el usuario hace click sobre la barra (<em>click</em>)</strong>, lo tomaremos como que quiere realizar una valoración. Entonces, actualizaremos el valor para hacer la media entre el valor existente, y su votación.<br />
Si asociamos el sistema a una base de datos, es en este método donde deberemos realizar la consulta de actualización mediante AJAX. Para este tutorial, nos conformaremos con actualizar el valor en pantalla, y que se vea reflejado en la barra.</p>
<p>Utilizando los métodos <strong>mousemove</strong>, <strong>mouseout </strong>y <strong>click</strong> de jQuery, cubrimos todos los posibles estados por los que puede pasar nuestro sistema de valoración, y con <strong>pageX </strong>y <strong>offsetLeft</strong>, seremos capaces de conocer la posición del cursor dentro del elemento.</p>
<p>Cómo conectar este sistema a una base de datos, y registrar las votaciones mediante AJAX, lo dejaremos para un próximo capítulo <img src='http://blog.joanfernandez.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><a title="Ver ejemplo valoración jQuery" href="http://blog.joanfernandez.es/ejemplos/valoracion-jquery/">- VER DEMO -</a><br />
<a title="Descargar archivos tutorial" href="http://blog.joanfernandez.es/ejemplos/tutorial-valoracion-jquery.rar">- DESCARGAR EJEMPLO -</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.joanfernandez.es/2009/07/sistema-de-rating-con-jquery/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

