<?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>Emilio Cobos</title>
	<atom:link href="http://emiliocobos.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://emiliocobos.net</link>
	<description>Diseño y desarrollo web, Wordpress y Blogger</description>
	<lastBuildDate>Mon, 03 Jun 2013 19:59:39 +0000</lastBuildDate>
	<language>es-ES</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Creando el .htaccess perfecto</title>
		<link>http://emiliocobos.net/creando-el-htaccess-perfecto/</link>
		<comments>http://emiliocobos.net/creando-el-htaccess-perfecto/#comments</comments>
		<pubDate>Mon, 22 Apr 2013 00:30:40 +0000</pubDate>
		<dc:creator>Emilio Cobos Álvarez</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[.htaccess]]></category>

		<guid isPermaLink="false">http://emiliocobos.net/?p=700</guid>
		<description><![CDATA[.htaccess es un archivo de configuración de Apache, que nos permite establecer reglas en un directorio. De él puede depender una buena parte del rendimiento de nuestras páginas web. En&#8230; <a class="jump-link" href="http://emiliocobos.net/creando-el-htaccess-perfecto/">Leer más <span class="meta-nav">&#187;</span></a>]]></description>
				<content:encoded><![CDATA[<p><code>.htaccess</code> es un archivo de configuración de Apache, que nos permite establecer reglas en un directorio. De él puede depender una buena parte del rendimiento de nuestras páginas web.</p>

<p>En este artículo os voy a enseñar mis <strong>líneas de .htaccess básicas para cualquier página web</strong>.</p>

<h2>Nota inicial</h2>
<p><code>.htaccess</code> <strong>se evalúa cada solicitud</strong>, añadiendo carga al servidor. Por eso, siempre que sea posible, en producción modifica el archivo <code>httpd.conf</code> directamente.</p>

<p>Desgraciadamente, esto no es posible para la inmensa mayoría de los mortales (entre los que me incluyo).</p>

<p>Finalmente indicar que buena parte de estas líneas de código vienen gracias a <a target="_blank" href="http://html5boilerplate.com/">html5 Boilerplate</a>. Creo que recopilarlos aquí y hacerlos accesibles a todos puede ser una buena idea.</p>

<h2>Redirección del domino</h2>

<p>Hay dos opciones: Que quieras redirigir el dominio <strong>con www a sin www</strong> (de www.midominio.com a midominio.com) o viceversa. Mantener ambos puede llevar problemas de SEO, o acceso a archivos.</p>

<h3>De con www a sin www</h3>

<pre data-language="htaccess"><code># Eliminar www.
&lt;IfModule mod_rewrite.c&gt;
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
&lt;/IfModule&gt;</code></pre>

<h3>De sin www a con www</h3>
<pre data-language="htaccess"><code>&lt;IfModule mod_rewrite.c&gt;
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
  RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
&lt;/IfModule&gt;</code></pre>

<h2>Caché de archivos</h2>
<p>La caché de archivos puede ser inmensamente beneficiosa para la velocidad de una web. Básicamente: Si un usuario visita cinco páginas de nuestra web, no tiene por qué descargar los mismos archivos estáticos (como imágenes, css y javascript) cinco veces. El navegador <strong>puede almacenar esos archivos en el sistema</strong> para obtenerlos mucho más rápidamente, pero para ello <strong>necesita instrucciones del servidor</strong>.</p>

<pre data-language="htaccess"><code>&lt;IfModule mod_expires.c&gt;
  ExpiresActive on

  # Por defecto 1 mes de caché
  ExpiresDefault                          "access plus 1 month"

  # los manifiestos appcache necesitan solicitarse cada vez, por firefox 3.6 (probablemente no necesario actualmente?
  ExpiresByType text/cache-manifest       "access plus 0 seconds"

  # El HTML nunca debe de ser cacheado
  ExpiresByType text/html                 "access plus 0 seconds"

  # Los datos dinámicos tampoco (tal vez podría variar dependiendo de tu aplicación)
  ExpiresByType text/xml                  "access plus 0 seconds"
  ExpiresByType application/xml           "access plus 0 seconds"
  ExpiresByType application/json          "access plus 0 seconds"

  # Una hora para los feeds (cambiar dependiendo de la fecha de actualización de tu web)
  ExpiresByType application/rss+xml       "access plus 1 hour"
  ExpiresByType application/atom+xml      "access plus 1 hour"

  # Favicon (Sólo una semana porque el nombre no cambia, luego podría haber cambios y mantenerse el cacheado)
  ExpiresByType image/x-icon              "access plus 1 week"

  # Imágenes, vídeo, audio: 1 mes
  ExpiresByType image/gif                 "access plus 1 month"
  ExpiresByType image/png                 "access plus 1 month"
  ExpiresByType image/jpeg                "access plus 1 month"
  ExpiresByType video/ogg                 "access plus 1 month"
  ExpiresByType audio/ogg                 "access plus 1 month"
  ExpiresByType video/mp4                 "access plus 1 month"
  ExpiresByType video/webm                "access plus 1 month"

  # Fuentes web: 1 mes
  ExpiresByType application/x-font-ttf    "access plus 1 month"
  ExpiresByType font/opentype             "access plus 1 month"
  ExpiresByType application/x-font-woff   "access plus 1 month"
  ExpiresByType image/svg+xml             "access plus 1 month"
  ExpiresByType application/vnd.ms-fontobject "access plus 1 month"

  # CSS y JavaScript: 1 año. Ten en cuenta que si cambias los ficheros deberías usar una query string o un nombre de archivo diferente para evitar que los visitantes reciban archivos cacheados.
  ExpiresByType text/css                  "access plus 1 year"
  ExpiresByType application/javascript    "access plus 1 year"

&lt;/IfModule&gt;

# Eliminar E-Tag
# Estamos enviando periodos de caché muy amplios, así que no es necesario que el navegador compruebe mediante E-Tag si el fichero cambió
&lt;IfModule mod_headers.c&gt;
  Header unset ETag
&lt;/IfModule&gt;
FileETag None</code></pre>

<h2>Compresión GZIP</h2>
<p>GZIP es la manera más rápida de reducir el tamaño del archivo enviado al navegador, mejorando el tiempo de carga. Con las siguientes líneas la activarás en tu web:</p>
<pre data-language=".htaccess"><code>    # Force compression for mangled headers.
    # http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping
    &lt;IfModule mod_setenvif.c&gt;
        &lt;IfModule mod_headers.c&gt;
            SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
            RequestHeader append Accept-Encoding &quot;gzip,deflate&quot; env=HAVE_Accept-Encoding
        &lt;/IfModule&gt;
    &lt;/IfModule&gt;

    &lt;IfModule mod_filter.c&gt;
        AddOutputFilterByType DEFLATE application/atom+xml \
                                      application/javascript \
                                      application/json \
                                      application/rss+xml \
                                      application/vnd.ms-fontobject \
                                      application/x-font-ttf \
                                      application/x-web-app-manifest+json \
                                      application/xhtml+xml \
                                      application/xml \
                                      font/opentype \
                                      image/svg+xml \
                                      image/x-icon \
                                      text/css \
                                      text/html \
                                      text/plain \
                                      text/x-component \
                                      text/xml
    &lt;/IfModule&gt;

&lt;/IfModule&gt;</code></pre>

<h2>Codificación UTF-8</h2>

<p>Si alguna vez habéis tenido problemas con caracteres extraños en vuestro servidor, puede ser por dos cosas: La base de datos o el propio servidor, si es por lo segundo, con las siguientes líneas debería de estar solucionado:</p>

<pre data-language="htaccess"><code>AddDefaultCharset utf-8
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml</code></pre>

<h2>Forzar IE a no emularse</h2>

<p>Puede que la conozcáis o no, pero hay una pequeña cabecera usada por IE llamada <code>X-UA-Compatible</code>, que puede hacer que IE9 se comporte como si fuera IE7 (por ejemplo). Esto causa bastantes problemas, porque además de usar un navegador menos compilante con los estándares, crea inconsistencias entre versiones, para asegurarse de que IE10 actúa como IE10, IE9 como IE9, etc&#8230; y que IE6/7/8 usen Chrome Frame si está instalado:</p>

<pre data-language="htaccess"><code># Eliminar www.
&lt;IfModule mod_headers.c&gt;
    Header set X-UA-Compatible "IE=edge,chrome=1"
    # Sólo queremos añadirlo para páginas HTML, el resto es un desperdicio de ancho de banda
    &lt;FilesMatch "\.(appcache|crx|css|eot|gif|htc|ico|jpe?g|js|m4a|m4v|manifest|mp4|oex|oga|ogg|ogv|otf|pdf|png|safariextz|svg|svgz|ttf|vcf|webapp|webm|webp|woff|xml|xpi)$"&gt;
        Header unset X-UA-Compatible
    &lt;/FilesMatch&gt;
&lt;/IfModule&gt;</code></pre>

<h2>¿Alguna línea de código más?</h2>
<p>Soy todo oídos si tienes algo que aportar :)</p>
]]></content:encoded>
			<wfw:commentRss>http://emiliocobos.net/creando-el-htaccess-perfecto/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Polyfill para input type time &#8211; TimePikr</title>
		<link>http://emiliocobos.net/polyfill-input-type-time/</link>
		<comments>http://emiliocobos.net/polyfill-input-type-time/#comments</comments>
		<pubDate>Tue, 09 Apr 2013 21:16:49 +0000</pubDate>
		<dc:creator>Emilio Cobos Álvarez</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://emiliocobos.net/?p=694</guid>
		<description><![CDATA[Bueno, siento haber dejado de publicar tanto, pero por razones de tiempo (odio segundo de bachillerato ;)) no he podido. Ésto es simplemente la presentación oficial de un script que&#8230; <a class="jump-link" href="http://emiliocobos.net/polyfill-input-type-time/">Leer más <span class="meta-nav">&#187;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Bueno, siento haber dejado de publicar tanto, pero por razones de tiempo (odio segundo de bachillerato <i class="icon guino">;)</i>) no he podido.</p>

<p>Ésto es simplemente la presentación <em>oficial</em> de un script que hice hace poco, para emular el funcionamiento de <code>input[type="time"]</code> en navegadores que no lo soportaran, y que puedes ver <a href="https://github.com/ecoal95/time-pollyfill">en github</a></p>

<p style='text-align: center;'><a href="/demos/timepicker/demo.html" target="_blank" title="Link de descarga" class="boton">Demo</a> <a download href="https://github.com/ecoal95/time-pollyfill/archive/master.zip" target="_blank" title="Link de descarga" class="boton">Descarga</a> <a href="https://github.com/ecoal95/time-pollyfill" target="_blank" title="Link de descarga" class="boton">Ver en GitHub</a></p>

<p>Para que os hagáis una idea, el soporte para <code>&lt;input type="time"&gt;</code> es muy escaso. Actualmente sólo Chrome y Opera.</p>

<p>El uso es sencillo, simplemente creamos una instancia del objeto (<code>TimePikr</code>), pasáis el elemento y listo! Si hay soporte nativo se deja como está. Si no hay soporte o el elemento no es del tipo esperado se aplican ciertas operaciones mágicas que&#8230;</p>

<p>No, ahora en serio, simplemente ocultamos el elemento y lo reemplazamos por un <code>input[type="text"]</code> con dos flechas y un par de eventos, que hacen el resto: <strong>validación</strong>, <strong>acceso rápido</strong>&#8230;</p>

<h2 id="uso">Uso</h2>

<p>Hace falta cargar <strong>dos archivos</strong>: el CSS (que hace que las flechitas se vean genial <i class="icon guino">;)</i>) y el Javascript. Un uso básico sería así:</p>

<pre data-language="html"><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;!-- ... --&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;timepicker.css&quot;&gt;
    &lt;!-- ... --&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;!-- ... --&gt;
    &lt;input type=&quot;time&quot; id=&quot;timepikr-me&quot;&gt;
    &lt;!-- ... --&gt;
    &lt;script src=&quot;timepicker.js&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var picker = new TimePikr({
            element: document.getElementById('timepikr-me');
        });
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>

<p>Obviamente, si hay soporte nativo no son necesarios, así que&#8230; Carga condicional via <a href="http://emiliocobos.net/modernizr-uso-y-funciones/" title="Modernizr: Comprobando las capacidades del navegador">Modernizr</a> al rescate!</p>

<pre data-language="javascript"><code>Modernizr.load({
    test: Modernizr.inputtypes.time,
    nope: ['timepicker.css', 'timepicker.js'],
    callback: function() {
        var picker = new TimePikr({
            element: document.getElementById('timepikr-me');
        });
    }
})</code></pre>

<p>Espero que os sea útil :)</p>]]></content:encoded>
			<wfw:commentRss>http://emiliocobos.net/polyfill-input-type-time/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Uso de navegadores en España y latino américa: Dejad de dar soporte a IE7!</title>
		<link>http://emiliocobos.net/uso-de-navegadores/</link>
		<comments>http://emiliocobos.net/uso-de-navegadores/#comments</comments>
		<pubDate>Mon, 18 Mar 2013 19:36:16 +0000</pubDate>
		<dc:creator>Emilio Cobos Álvarez</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://emiliocobos.net/?p=688</guid>
		<description><![CDATA[No sé por qué, pero estaba revisando las estadísticas de StatCounter para España, y me llevé una muy grata sorpresa: El uso de Internet Explorer 7 está actualmente por debajo&#8230; <a class="jump-link" href="http://emiliocobos.net/uso-de-navegadores/">Leer más <span class="meta-nav">&#187;</span></a>]]></description>
				<content:encoded><![CDATA[<p>No sé por qué, pero estaba revisando <a href="http://gs.statcounter.com/#browser_version_partially_combined-ES-monthly-201109-201302" title="Estadísticas del uso de navegadores en España de 2011 a Febrero de 2012" target="_blank">las estadísticas de StatCounter para España</a>, y me llevé una muy grata sorpresa: El <strong>uso de Internet Explorer 7</strong> está actualmente por debajo del 0.75%. Parece que <a href="http://www.theverge.com/2011/12/15/2637946/microsoft-internet-explorer-automatic-updates-january" target="_blank">las actualizaciones automáticas de Micro$oft</a> han surtido efecto.</p>

<p>Por asegurarme, comprobé también en algunos países de latino américa, y las estadísticas son muy similares, e incluso mejores para el desarrollador.</p>

<p>Yo, en mis proyectos ya no doy soporte a este navegador, pero éstas estadísticas sólo dicen lo siguiente: <strong>No perdáis tiempo en hacks para que las cosas funcionen en ese navegador</strong>, no dejéis de usar una funcionalidad por que no la soporte, simplemente <strong>usad estándares</strong> (que IE8 soporta <em>decentemente</em>).</p>

<p>Si os preocupáis por la gente que usa IE7, probablemente lo mejor sea avisarles de que actualicen su navegador, o instalen <a href="http://www.google.com/chromeframe/?hl=es" target="_blank">Google Chrome Frame</a>.</p>

<p>Si finalmente también os preocupáis de la gente que tal vez tenga que navegar con IE7 por culpa de los ordenadores de la oficina, tal vez la mejor solución para facilitarte a ti la vida como desarrollador, <strong>y a ellos como usuarios</strong>, sea servir una <a href="http://universal-ie6-css.googlecode.com/files/ie6.0.3.css" target="_blank">hoja de estilos universal</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://emiliocobos.net/uso-de-navegadores/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Reloj animado sólo con CSS (radial-gradient y steps)</title>
		<link>http://emiliocobos.net/css-clock-animation-steps/</link>
		<comments>http://emiliocobos.net/css-clock-animation-steps/#comments</comments>
		<pubDate>Tue, 12 Mar 2013 20:03:15 +0000</pubDate>
		<dc:creator>Emilio Cobos Álvarez</dc:creator>
				<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">http://emiliocobos.net/?p=682</guid>
		<description><![CDATA[Vale, por si no lo sabíais, las animaciones con CSS son alucinantes. A mi me ha dado por experimentar últimamente con ellas, y aquí tenéis el resultado: Ver en Codepen&#8230; <a class="jump-link" href="http://emiliocobos.net/css-clock-animation-steps/">Leer más <span class="meta-nav">&#187;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Vale, por si no lo sabíais, las <strong>animaciones con CSS</strong> son alucinantes. A mi me ha dado por experimentar últimamente con ellas, y aquí tenéis el resultado:</p>

<pre class="codepen" data-height="400" data-type="result" data-href="Gwdst" data-user="ecoal95" data-safe="true"><code></code><a href="http://codepen.io/ecoal95/pen/Gwdst" target="_blank">Ver en Codepen</a></pre>
<script async src="http://codepen.io/assets/embed/ei.js"></script>

<h2>Explicaciones</h2>

<p>El reloj es un simple <code>&lt;div&gt;</code> hecho circular via <code>border-radius</code>, con un borde gris.</p>

<p>Los cuatro indicadores están hechos con dos <strong>pseudo-elementos</strong> del mismo tamaño, uno de ellos rotado 90 grados. Son del alto del reloj, así que <strong>forman una cruz perfectamente centrada</strong>. El efecto de mostrar sólo el puntero se consigue en vez de dándoles un fondo sólido, usando un fondo con <code>radial-gradient</code>, que es transparente excepto en el fragmento del 75 al 90%:</p>
<pre data-language="scss"><code>/* un círculo transparente desde el centro al 75%, de color desde el 75% al 90%, y transparente a partir de ahí */
background-image: radial-gradient(circle, transparent, transparent 75%, $clock-indicator-color 75%, $clock-indicator-color 90%, transparent 90%, transparent);</code></pre>

<p>Las agujas son tres elementos diferentes, posicionados absolutamente, y que siguen una animación llamada <code>rotate</code> con un tiempo diferente (<code>60s</code> para el segundero, <code>3600s</code> para la aguja de los minutos y <code>86400s</code> para la de los segundos).</p>

<h3>steps()</h3>

<p>El efecto de los segundos se consigue usando <code>animation-timing-function: steps();</code>, que es una función que toma el número de pasos que tiene que dar la animación (60 en nuestro caso, el número de segundos que tiene un minuto), y la palabra clave <code>start</code> o <code>end</code>, que es el momento en el que el valor cambiará.</p>]]></content:encoded>
			<wfw:commentRss>http://emiliocobos.net/css-clock-animation-steps/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cómo usar la meta viewport</title>
		<link>http://emiliocobos.net/meta-viewport-html/</link>
		<comments>http://emiliocobos.net/meta-viewport-html/#comments</comments>
		<pubDate>Thu, 28 Feb 2013 23:55:16 +0000</pubDate>
		<dc:creator>Emilio Cobos Álvarez</dc:creator>
				<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://emiliocobos.net/?p=665</guid>
		<description><![CDATA[Con todo el auge del diseño web responsive (aún no se cuál sería la correcta traducción al español), aún no he encontrado una guía completa sobre ella en español, así&#8230; <a class="jump-link" href="http://emiliocobos.net/meta-viewport-html/">Leer más <span class="meta-nav">&#187;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Con todo el auge del diseño web responsive (aún no se cuál sería la correcta traducción al español), aún no he encontrado una guía completa sobre ella en español, así que voy a intentarlo:</p>

<figure id="attachment_667" class="post-caption alignnone" style="width: 300px;"><a target="_blank" href="http://emiliocobos.net/wp-content/uploads/2013/02/comparativa-viewport.png"><img src="http://emiliocobos.net/wp-content/uploads/2013/02/comparativa-viewport-300x266.png" alt="Comparativa entre no usar la etiqueta viewport y hacerlo" ></a><figcaption class="wp-caption-text">Sin (izquierda) y con (derecha) la etiqueta viewport.</figcaption></figure>

<h2>Ejemplo</h2>
<p>Éste es un pequeño ejemplo del uso más frecuente que se le puede dar a la etiqueta: </p>
<pre data-language="html"><code>&lt;meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"&gt;</code></pre>

<h2>Función</h2>
<p>La <strong>etiqueta meta viewport</strong> es una etiqueta que se está moviendo a CSS (aunque hasta que haya mejor soporte no deberías de dejar de usar la etiqueta, deberías de <a target="_blank" href="http://emiliocobos.net/css-directiva-supports-viewport-document/" title="CSS3: Lo que está por venir">echar un vistazo a la directiva <code>@viewport</code></a>).</p>

<p>Básicamente, indica cómo debería de comportarse el navegador móvil a la hora de mostrar en pantalla la página web.</p>

<p><strong>Por defecto</strong> los navegadores móviles muestran con un ancho determinado la página (en el caso del iPhone, 980px, por ejemplo). Por lo tanto la página no sólo <strong>se mostrará reducida</strong>, sino que además <strong>no se aplicarán nunca nuestras <code>@media</code> queries</strong> que afecten a dispositivos móviles. A efectos prácticos el iPhone mostraría una web de 980px.</p>

<p>Sin embargo, con ésta etiqueta, <strong>podemos establecer el ancho, el alto, el zoom de la página&#8230;</strong>.</p>

<h2>Referencia</h2>
<p>La <strong>meta viewport</strong> consiste en una lista de <code>claves=valores</code> separadas por comas. Aquí estaría un ejemplo con todas las opciones disponibles:</p>

<p><i>Nota:</i> <code>float</code>, es un número con o sin decimales, <code>pixels</code>, es un número entero puesto sin unidades, el resto son palabras literales</p>

<pre data-language="html"><code>&lt;meta name="viewport" content="
	width = [pixels | device-width ],
	height = [pixels | device-height],
	initial-scale = float,
	minimum-scale = float,
	maximum-scale = float,
	user-scalable = [yes | no]
"&gt;</code></pre>

<p>Ahora iremos una por una. Todos los ejemplos se basan en el siguiente código (variando el <code>content</code>) de la etiqueta viewport:</p>

<pre data-language="html"><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;meta charset=&quot;utf-8&quot;&gt;
	&lt;meta name=&quot;viewport&quot; content=&quot;&quot;&gt;

	&lt;title&gt;Viewport&lt;/title&gt;

	&lt;style&gt;
		body {
			margin: 0;
		}
		p {
			width: 300px;
			padding: 15px;
			background: red;
		}
	&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;p&gt;Hola a todo el mundo! [...]&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>

<h3>width</h3>
<p><code>width</code> indica <strong>el ancho que tomará la página en el dispositivo</strong>.</p>

<p>Lo ideal suele ser usar la palabra clave <code>device-width</code> (que representa el ancho del dispositivo), pero para páginas con contenido de un ancho fijo (no fluido), es posible usar un valor estático en píxels (leer más abajo).</p>

<p>Para el ejemplo he puesto uno como <code>width=device-width</code>:</p>
<figure id="attachment_671" class="post-caption alignnone" style="width: 168px;"><a target="_blank" href="http://emiliocobos.net/wp-content/uploads/2013/03/con.png"><img src="http://emiliocobos.net/wp-content/uploads/2013/03/con-168x300.png" alt="Uso de width=device-width" class="size-medium wp-image-671" /></a><figcaption class="wp-caption-text">Uso de width=device-width</figcaption></figure>

<p>Y para el caso (como es) de un diseño estático (300px + 30 de los paddings), he hecho otro ejemplo con <code>width=330</code>, que queda escalado adecuadamente para que la página entre exactamente en el viewport:</p>

<figure id="attachment_672" class="post-caption alignnone" style="width: 167px;"><a target="_blank" href="http://emiliocobos.net/wp-content/uploads/2013/03/con-330.png"><img src="http://emiliocobos.net/wp-content/uploads/2013/03/con-330-167x300.png" alt="Uso de width=300" class="size-medium wp-image-672" /></a><figcaption class="wp-caption-text">Uso de width=300</figcaption></figure>

<h3>height</h3>
<p><code>height</code> indica el alto (¿a que no lo habríais adivinado?). Sinceramente, aún <strong>no he visto caso útil para él</strong>, aunque sigue las mismas directrices que width (<code>device-height</code> o valor en píxels).</p>

<h3>initial-scale</h3>
<p>¿Con un dispositivo móvil puedes hacer zoom en cualquier lado de la página, verdad? Pues con esto se regula a qué zoom estará inicialmente la página. Es <strong>recomendable ponerlo en principio como <code>initial-scale=1</code></strong>, ya que Opera Mini suele hacer zoom de más al principio si no se especifica.</p>

<p>Para poner un ejemplo algo diferente, he creado un ejemplo con <code>initial-scale=0.75</code>, que mostrará la página a un 75% de su ancho original:</p>

<figure id="attachment_670" class="post-caption alignnone" style="width: 167px;"><a target="_blank" href="http://emiliocobos.net/wp-content/uploads/2013/03/con-initialscale.png"><img src="http://emiliocobos.net/wp-content/uploads/2013/03/con-initialscale-167x300.png" alt="initial-scale puesto como 0.75" class="size-medium wp-image-670" /></a><figcaption class="wp-caption-text">initial-scale puesto como 0.75</figcaption></figure>

<h3>maximum/minimum-scale</h3>

<p><code>maximum-scale</code>, sirve para establecer el zoom máximo de la página, y <code>minimum-scale</code> para el mínimo (sorprendente, ¿eh? <i class="icon guino">;)</i>).</p>

<p>Lo más frecuente es establecer <code>maximum-scale=1</code> para evitar que el usuario haga zoom hacia atrás de la página.</p>

<p>El uso de <code>minimum-scale</code> lo discutiremos más abajo.</p>

<h3>user-scalable</h3>
<p><code>user-scalable</code> te permite controlar si el usuario puede hacer zoom en la página (por defecto es <code>yes</code>). El porqué no ponerlo como <code>no</code> más abajo.</p>

<h3>Otras</h3>

<p>Existen otros valores como <code>target-densitydpi</code> (<a target="_blank" href="http://developer.android.com/guide/webapps/targeting.html">propietaria de Android</a>) que no suele ser utilizado (es más recomendable hacer media queries según la resolución).</p>

<h2 id="malas-practicas">Malas prácticas</h2>
<p>En mi opinión hay <strong>dos muy malas prácticas</strong> a la hora de usar la etiqueta meta viewport:</p>

<ol>
    <li><code>user-scalable=no</code>: No dejar al usuario moverse con la página con libertad haciendo zoom puede no ser un problema para la mayoría de los usuarios, pero definitivamente puede convertirse en un <strong>gran problema para gente con problemas de visión</strong>. Además, <strong>es incómodo</strong> no poder hacer zoom en una página cuando te apetece.</li>
    <li><code>minimum-scale</code>: Lo mismo de antes, limitar el zoom al usuario para mí es un craso error en accesibilidad</li>
</ol>

<h2>El futuro de la etiqueta viewport: @viewport {}</h2>
<p>El futuro de la etiqueta viewport no está en una etiqueta viewport, está <strong>en tu hoja de estilos</strong>. Opera e Internet Explorer ya han hecho la primera implementación de <strong><code>@viewport</code></strong>. Si te interesa, ya <a href="http://emiliocobos.net/css-directiva-supports-viewport-document/" title="CSS3: Lo que está por venir">se ha hablado de ello aquí</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://emiliocobos.net/meta-viewport-html/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>FeedReader: Pequeño agregador de feeds en PHP</title>
		<link>http://emiliocobos.net/agregador-feeds-php/</link>
		<comments>http://emiliocobos.net/agregador-feeds-php/#comments</comments>
		<pubDate>Wed, 27 Feb 2013 22:52:32 +0000</pubDate>
		<dc:creator>Emilio Cobos Álvarez</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://emiliocobos.net/?p=657</guid>
		<description><![CDATA[Acabo de terminar los exámenes, y por eso pido disculpas por no haber mantenido el ritmo de publicación en el blog. Siempre he querido tener una lista de lo que&#8230; <a class="jump-link" href="http://emiliocobos.net/agregador-feeds-php/">Leer más <span class="meta-nav">&#187;</span></a>]]></description>
				<content:encoded><![CDATA[<p><strong>Acabo de terminar los exámenes</strong>, y por eso pido disculpas por no haber mantenido el ritmo de publicación en el blog.</p>

<p>Siempre he querido tener una <strong>lista de lo que leo disponible para todo el mundo</strong>, para aquel al que pueda ayudar. El blogroll hasta ahora era el sitio, pero creo que tener los últimos artículos de los sitios será más de ayuda que un simple link en el blogroll.</p>

<p style='text-align: center;'><a href="http://emiliocobos.net/demos/feedreader/" target="_blank" title="Link de descarga" class="boton">Demo</a>  <a href="https://github.com/ecoal95/feedreader/" target="_blank" title="Link de descarga" class="boton">Ver en GitHub</a></p>

<p>Por eso he hecho ésta pequeña utilidad con PHP, que gracias a <strong>Google Feed API</strong> (<a href="https://developers.google.com/feed/v1/" target="_blank">+ info</a>) lee los feeds cada 6 horas y los actualiza. Para no tener que usar la API constantemente, uso mi <a href="http://emiliocobos.net/php-cache/" title="Implementar un sistema de caché simple en PHP" target="_blank"><strong>sistema de caché</strong> con <strong>PHP</strong></a>, lo que hace que el sitio cargue con velocidad todas las veces menos una al día.</p>

<p>La idea está inspirada en <a href="http://ksesocss.blogspot.com/2012/11/netK.html" target="_blank">NetK</a>, de un blog que por aquí ya conoceréis.</p>

<p>Iré actualizando la lista de feeds constantemente (ahora faltan muchos) para que os sea de utilidad.</p>

<p>El código está enterito en <strong><a href="https://github.com/ecoal95/feedreader">Github</a></strong>, así que podéis echarle un vistazo, jugar con él&#8230;</p>

<p style='text-align: center;'><a href="http://emiliocobos.net/demos/feedreader/" target="_blank" title="Link de descarga" class="boton">Demo</a>  <a href="https://github.com/ecoal95/feedreader/" target="_blank" title="Link de descarga" class="boton">Ver en GitHub</a></p>


<h2 id="llamamiento">Llamamiento</h2>
<p>Si tienes un blog con contenidos originales, y quieres que se muestre aquí, puedes o bien <a href="http://contacto.emiliocobos.net/" target="_blank">contactar conmigo</a>, o bien dejar aquí un comentario. <small>Puedes hacer lo mismo si tu blog ya está aquí y no quieres que esté.</small></p>

<h2 id="aviso">Aviso</h2>
<p>La intención de esta utilidad es <strong>compartir conocimiento</strong>, nunca copiar contenido. <strong>Dicho queda</strong>. Así que por favor, si vas a hacer algo basándote en esto, procura ser bueno <i class="icon guino">;)</i></p>]]></content:encoded>
			<wfw:commentRss>http://emiliocobos.net/agregador-feeds-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Opera ahora se pasa a WebKit</title>
		<link>http://emiliocobos.net/opera-ahora-se-pasa-a-webkit/</link>
		<comments>http://emiliocobos.net/opera-ahora-se-pasa-a-webkit/#comments</comments>
		<pubDate>Wed, 13 Feb 2013 16:16:58 +0000</pubDate>
		<dc:creator>Emilio Cobos Álvarez</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://emiliocobos.net/?p=646</guid>
		<description><![CDATA[Ésto no es ningún tipo de broma, como en principio podíais haber imaginado. Sigue leyendo para más información. Parece ser que Opera (el navegador que todo el mundo adora pero&#8230; <a class="jump-link" href="http://emiliocobos.net/opera-ahora-se-pasa-a-webkit/">Leer más <span class="meta-nav">&#187;</span></a>]]></description>
				<content:encoded><![CDATA[<div class="important-note" data-label="Atención"><p>Ésto no es ningún tipo de broma, como en principio podíais haber imaginado. Sigue leyendo para más información.</p></div>

<p>Parece ser que <a href="//opera.com" target="_blank">Opera</a> (el navegador que todo el mundo adora pero que poca gente usa), ha anunciado junto con la llegada a 300 millones de usuarios, que <strong>cambiará su motor a WebKit</strong>. Eso significa que también usará V8 como motor de Javascript.</p>

<h2>Causas</h2>
<p>Opera siempre ha usado Presto (creado por ellos), por eso en principio todo esto me ha parecido un shock, pero <a href="http://www.brucelawson.co.uk/" target="_blank">Bruce Lawson</a> nos explica en el <a href="http://my.opera.com/ODIN/blog/300-million-users-and-move-to-webkit" target="_blank">anuncio oficial</a> las razones:</p>

<ol>
   <li><strong>Más compatibilidad</strong>, sobre todo en páginas móbiles (que suelen no incorporar prefijos <code>-o-</code>).</li>
   <li><strong>Chromium es código abierto</strong> así que, con Opera colaborando, podrán dedicarse a mejorar de forma común más tiempo del que lo hacen ahora mismo cada uno por su lado</li>
</ol>

<h2>Consecuencias</h2>

<ul>
    <li><strong>Opera tendrá bastante menos poder &#8220;político&#8221; dentro de la comunidad web que el que tiene ahora</strong>: Opera ha sido una compañía que <strong>siempre ha movido la web hacia delante soportando estándares</strong>. Ahora pasarán a tener mucha menos autoridad en ese campo.</li>
    <li><strong>Adiós al prefijo <code>-o-</code></strong>. El motor de renderizado será el de Chromium, así que usará el prefijo <code>-webkit-</code>.</li>
    <li><strong>Colaboración</strong>: Opera va a seguir colaborando en el proyecto WebKit y Chromium, lo que hará que la web avance más rápidamente. La primera aportación de Opera a WebKit va a ser la <strong>estructura multicolumna en CSS</strong> (<strong>multi-column layout</strong>). Aquí está el <a href="https://lists.webkit.org/pipermail/webkit-dev/2013-February/023820.html" target="_blank">mail oficial</a> por parte de Opera.</li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://emiliocobos.net/opera-ahora-se-pasa-a-webkit/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Calificación con estrellas para WordPress: EC-Stars-Rating</title>
		<link>http://emiliocobos.net/ec-stars-rating-wordpress-plugin/</link>
		<comments>http://emiliocobos.net/ec-stars-rating-wordpress-plugin/#comments</comments>
		<pubDate>Tue, 05 Feb 2013 23:13:28 +0000</pubDate>
		<dc:creator>Emilio Cobos Álvarez</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Clasificación por estrellas]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://emiliocobos.net/?p=631</guid>
		<description><![CDATA[Hace poco veíamos cómo crear un sistema de calificación por estrellas con CSS. Hoy, eso ha cobrado un nuevo nivel: mi primer plugin para WordPress. Es un plugin muy sencillo&#8230; <a class="jump-link" href="http://emiliocobos.net/ec-stars-rating-wordpress-plugin/">Leer más <span class="meta-nav">&#187;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Hace poco veíamos cómo crear un <a href="http://emiliocobos.net/calificacion-estrellas-solo-con-css/" title="Calificación con estrellas sólo con CSS">sistema de calificación por estrellas con CSS</a>.</p>

<p>Hoy, eso ha cobrado un nuevo nivel: <strong>mi primer plugin para WordPress</strong>.</p>

<p>Es un plugin <strong>muy sencillo</strong> de usar, con <strong>opciones</strong> fáciles, y <strong>muy ligero</strong>. Podéis verlo en funcionamiento en este mismo post (y en el resto) <i class="icon guino">;)</i></p>

<h2>Instalación</h2>

<h3>1- Instalar el plugin</h3>
<p><strong>Actualización:</strong> Ahora el plugin está en el directorio oficial de WordPress, así que ya podéis instalarlo buscando <strong>EC-Stars-Rating</strong> desde vuestro escritorio, o <a href="http://wordpress.org/extend/plugins/ec-stars-rating/" target="_blank">descargarlo desde la página oficial</a>. También podéis calificarlo si queréis <i class="icon guino">;)</i>.</p>

<p>Luego tenéis que <strong>activarlo</strong>, pero ya sabéis cómo va eso, no?</p>

<h3>2- Mostrar las estrellas</h3>
<p>Ahora sólo falta que en vuestro tema pongáis (allá donde queráis que aparezca, probablemente en <code>single.php</code> o <code>content-single.php</code>) la siguiente línea de código:</p>

<pre><code>&lt;?php 
if(function_exists('ec_stars_rating')) {
	ec_stars_rating();
}
?&gt;</code></pre>

<p><strong>Listo!</strong> He pensado en incluirlo en el directorio de WordPress, pero primero tengo que tener una página de documentación (o sea esta).</p>

<h2>Configuración</h2>
<p>Básicamente el plugin tiene una página (en <strong>Ajustes &raquo; EC Stars Rating</strong>), donde podéis escoger:</p>

<ul>
    <li><strong>Tamaño de las estrellas:</strong> El valor de la propiedad <strong>font-size</strong> de CSS para las estrellas (si las estrellas son más grandes o pequeñas).</li>
    <li><strong>Colores:</strong> El color de las estrellas por defecto, de las estrellas votadas (el valor actual) o al pasar el ratón por encima, y el color de las estrellas al hacer click.</li>
    <li><strong>Mostrar los votos:</strong> Si el número de votos y votantes se debería de mostrar.</li>
    <li><strong>Usar microformats:</strong> Si se debería usar <a target="_blank" href="http://emiliocobos.net/tutorial-seo-1-los-microformats/" title="Tutorial SEO [1]: Los microformats">microformats</a> o <a target="_blank" href="http://emiliocobos.net/tutorial-seo2-microdata/" title="Tutorial SEO[2]: Microdata">microdata</a>. Con microformats aparece un link al post, y consigue que salgan las famosas <a target="_blank" href="http://www.google.com/webmasters/tools/richsnippets?url=http%3A%2F%2Femiliocobos.net%2Fdetectar-el-ultimo-post-publicado-en-blogger%2F">estrellas en google</a>.</li>
    <li><strong>Usar jQuery:</strong> He hecho una versión del script sin jQuery, para aquellos que no lo usen (el 95% de los sitios de WordPress lo usa, pero el mío no, así que&#8230; <i class="icon guino">;)</i>). Sin jQuery no hay soporte para IE7, pero esto a mí no me parece ningún problema&#8230;</li>
</ul>

<h2>Soporte</h2>
<p>Hasta que este plugin sea aceptado en el directorio de WordPress, cualquier problema (espero que pocos), lo podréis <strong>comentar aquí</strong>.</p>

<p style='text-align: center;'> <a download href="https://github.com/ecoal95/ec-stars-rating/blob/master/ec-stars-rating.zip?raw=true" target="_blank" title="Link de descarga" class="boton">Descarga</a> </p>]]></content:encoded>
			<wfw:commentRss>http://emiliocobos.net/ec-stars-rating-wordpress-plugin/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>Detectar el último post publicado en blogger</title>
		<link>http://emiliocobos.net/detectar-el-ultimo-post-publicado-en-blogger/</link>
		<comments>http://emiliocobos.net/detectar-el-ultimo-post-publicado-en-blogger/#comments</comments>
		<pubDate>Fri, 25 Jan 2013 01:06:26 +0000</pubDate>
		<dc:creator>Emilio Cobos Álvarez</dc:creator>
				<category><![CDATA[Blogger]]></category>

		<guid isPermaLink="false">http://emiliocobos.net/?p=616</guid>
		<description><![CDATA[Ayer me mandaron un correo interesante, me preguntaba cómo podía detectar el primer post publicado, pero también en la página del propio post (no nos vale un check isFirstPost). La&#8230; <a class="jump-link" href="http://emiliocobos.net/detectar-el-ultimo-post-publicado-en-blogger/">Leer más <span class="meta-nav">&#187;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Ayer me mandaron un correo interesante, me preguntaba cómo podía detectar el primer post publicado, pero <strong>también en la página del propio post</strong> (no nos vale un check <code>isFirstPost</code>).</p>

<p>La solución no es fácil (me llevó tiempo encontrarla), y reside en usar la variable <code>&lt;data:top.newerPageUrl/&gt;</code>. Básicamente, si es un post nuevo, no tendrá un post siguiente, así que ahí está la clave:</p>

<p>El código debería de ir en la plantilla (edición HTML y accesorios expandidos), dentro de cualquiera de estos elementos:</p>

<ul>
	<li><code>&lt;b:includable id='post' var='post'&gt;</code> (cualquiera de sus ocurrencias, aunque tened en cuenta que algunas sólo se muestran en la plantilla para móbiles).</li>
	<li><code>&lt;b:loop values='data:post' var='post'&gt;</code></li>
</ul>

<h2>Código básico</h2>
<pre data-language='blogger-xml'><code>&lt;b:if cond='data:post.isFirstPost'&gt;
	&lt;!-- Si es el primer post de la página --&gt;
	&lt;b:if cond='data:top.newerPageUrl'&gt;
		&lt;!-- El post tiene un post nuevo, abortar! --&gt;
	&lt;b:else/&gt;
		&lt;!-- &Eacute;ste es el &uacute;ltimo post publicado --&gt;
		&Uacute;ltimo post
	&lt;/b:if&gt;
&lt;/b:if&gt;</code></pre>

<h2>Ejemplo de uso básico: mostrar el texto &#8220;último post&#8221;</h2>
<p>Debajo de <code>&lt;b:includable id='post' var='post'&gt;</code> (o en el sitio donde quieras que aparezca dentro de ese includable):</p>

<pre data-language='blogger-xml'><code>&lt;b:if cond='data:post.isFirstPost'&gt;
	&lt;b:if cond='data:top.newerPageUrl'&gt;&lt;b:else/&gt;
		&lt;p class='last-post-text'&gt;&Uacute;ltimo post&lt;/p&gt;
	&lt;/b:if&gt;
&lt;/b:if&gt;</code></pre>

<h2>Ejemplo de uso avanzado: añadir una clase con CSS al post-outer</h2>
<p>El método de uso será similar al utilizado para <a href="http://emiliocobos.net/editar-entradas-blogger-segun-etiquetas/" title="Personalizar las entradas de blogger según sus etiquetas">personalizar las entradas según sus etiquetas</a>. Simplemente sería cambiar:</p>

<pre><code>&lt;div class='post hentry' ...&gt;</code></pre>

<p>Por:</p>

<pre><code>&amp;lt;div class='post hentry&lt;b:if cond='data:post.isFirstPost'&gt;&lt;b:if cond='data:top.newerPageUrl'&gt;&lt;b:else/&gt; last-post &lt;b:if cond='data:post.pageType == "item"'&gt; last-post-item&lt;b:else/&gt;last-post-homepage&lt;/b:if&gt;&lt;/b:if&gt;
&lt;/b:if&gt;'&amp;gt;</code></pre>

<p>Y su correspondiente <code>&lt;/div&gt;</code> (encima de el <code>&lt;/b:includable&gt;</code>) por <code>&amp;gt;/div&amp;lt;</code></p>

<p><strong>Conseguido!</strong> Ahora puedes hacer con tu CSS:</p>

<pre data-language="CSS"><code>.last-post {
	/*Estilos comunes para el primer post aquí*/
}
.last-post-item {
	/*Estilos para el último post en su página*/
}
.last-post-homepage {
	/*Estilos para el último post en la página principal*/
}</code></pre>]]></content:encoded>
			<wfw:commentRss>http://emiliocobos.net/detectar-el-ultimo-post-publicado-en-blogger/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Calificación con estrellas sólo con CSS</title>
		<link>http://emiliocobos.net/calificacion-estrellas-solo-con-css/</link>
		<comments>http://emiliocobos.net/calificacion-estrellas-solo-con-css/#comments</comments>
		<pubDate>Fri, 18 Jan 2013 00:54:38 +0000</pubDate>
		<dc:creator>Emilio Cobos Álvarez</dc:creator>
				<category><![CDATA[CSS]]></category>

		<guid isPermaLink="false">http://emiliocobos.net/?p=608</guid>
		<description><![CDATA[Hay un tutorial que por petición me gustaría hacer, pero que últimamente no estoy encontrando tiempo para ello. Se trata de hacer una pequeña clasificación con estrellas, lo típico que&#8230; <a class="jump-link" href="http://emiliocobos.net/calificacion-estrellas-solo-con-css/">Leer más <span class="meta-nav">&#187;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Hay un tutorial que por petición me gustaría hacer, pero que últimamente no estoy encontrando tiempo para ello. Se trata de hacer una pequeña clasificación con estrellas, lo típico que veis en miles de web, pero <strong>bien hechas</strong>. No usaremos imágenes: sólo texto y <strong>CSS</strong> para el efecto.</p>

<p>También hace falta algo de <strong>Javascript</strong> para llevar a cabo el envío de los datos, y <strong>PHP</strong> para recibirlos, pero eso lo voy a dejar para un poco más adelante.</p>

<p>Así que empezaremos por un poquito de HTML básico: un contenedor con 5 links (uno por estrella), con el carácter unicode de la estrella (<code>&amp;#9733;</code>). Además, añadiremos un <code>noscript</code> para que los usuarios que no tengan Javascipt:</p>

<pre data-language="html"><code>&lt;div class=&quot;ec-stars-wrapper&quot;&gt;
	&lt;a href=&quot;#&quot; data-value=&quot;1&quot; title=&quot;Votar con 1 estrellas&quot;&gt;&amp;#9733;&lt;/a&gt;
	&lt;a href=&quot;#&quot; data-value=&quot;2&quot; title=&quot;Votar con 2 estrellas&quot;&gt;&amp;#9733;&lt;/a&gt;
	&lt;a href=&quot;#&quot; data-value=&quot;3&quot; title=&quot;Votar con 3 estrellas&quot;&gt;&amp;#9733;&lt;/a&gt;
	&lt;a href=&quot;#&quot; data-value=&quot;4&quot; title=&quot;Votar con 4 estrellas&quot;&gt;&amp;#9733;&lt;/a&gt;
	&lt;a href=&quot;#&quot; data-value=&quot;5&quot; title=&quot;Votar con 5 estrellas&quot;&gt;&amp;#9733;&lt;/a&gt;
&lt;/div&gt;
&lt;noscript&gt;Necesitas tener habilitado javascript para poder votar&lt;/noscript&gt;</code></pre>

<p>Actualmente quedaría algo así:</p>

<div>
	<a href="#" data-value="1" title="Votar con 1 estrellas">&#9733;</a>
	<a href="#" data-value="2" title="Votar con 2 estrellas">&#9733;</a>
	<a href="#" data-value="3" title="Votar con 3 estrellas">&#9733;</a>
	<a href="#" data-value="4" title="Votar con 4 estrellas">&#9733;</a>
	<a href="#" data-value="5" title="Votar con 5 estrellas">&#9733;</a>
</div>
<noscript>Necesitas tener habilitado javascript para poder votar</noscript>

<h2>El CSS</h2>
<p>Ahora viene la parte truculenta, el CSS, que hará el efecto <code>:hover</code>. Brevemente: Símplemente cuando tengan el ratón encima del padre, pondremos las estrellas como activas. Luego utilizamos el selector <code>~</code> para seleccionar las de la derecha, y quitárselo.</p>

<pre data-language="css"><code>.ec-stars-wrapper {
	/* Espacio entre los inline-block (los hijos, los `a`) 
	   http://ksesocss.blogspot.com/2012/03/display-inline-block-y-sus-empeno-en.html */
	font-size: 0;
	/* Podríamos quitarlo, 
		pero de esta manera (siempre que no le demos padding), 
		sólo aplicará la regla .ec-stars-wrapper:hover a cuando
		también se esté haciendo hover a alguna estrella */
	display: inline-block;
}
.ec-stars-wrapper a {
	text-decoration: none;
	display: inline-block;
	/* Volver a dar tamaño al texto */
	font-size: 32px;
	font-size: 2rem;
	
	color: #888;
}

.ec-stars-wrapper:hover a {
	color: rgb(39, 130, 228);
}
/*
 * El selector de hijo, es necesario para aumentar la especifidad
 */
.ec-stars-wrapper > a:hover ~ a {
	color: #888;
}</code></pre>

<p>Ahora tendríamos algo como ésto:</p>

<div class="ec-stars-wrapper">
	<a href="#" data-value="1" title="Votar con 1 estrellas">&#9733;</a>
	<a href="#" data-value="2" title="Votar con 2 estrellas">&#9733;</a>
	<a href="#" data-value="3" title="Votar con 3 estrellas">&#9733;</a>
	<a href="#" data-value="4" title="Votar con 4 estrellas">&#9733;</a>
	<a href="#" data-value="5" title="Votar con 5 estrellas">&#9733;</a>
</div>
<noscript>Necesitas tener habilitado javascript para poder votar</noscript>
<style scoped type="text/css">
.ec-stars-wrapper {
	/* Espacio entre los inline-block (los hijos, los `a`) 
	   http://ksesocss.blogspot.com/2012/03/display-inline-block-y-sus-empeno-en.html */
	font-size: 0;
	/* Podríamos quitarlo, 
		pero de esta manera (siempre que no le demos padding), 
		sólo aplicará la regla .ec-stars-wrapper:hover a cuando
		también se esté haciendo hover a alguna estrella */
	display: inline-block;
}
.ec-stars-wrapper a {
	text-decoration: none;
	display: inline-block;
	/* Volver a dar tamaño al texto */
	font-size: 32px;
	font-size: 2rem;
	
	color: #888;
}

.ec-stars-wrapper a,
.ec-stars-wrapper a:hover {
	text-decoration: none;
}

.ec-stars-wrapper:hover a {
	color: rgb(39, 130, 228);
}
/*
 * El selector de hijo, es necesario para aumentar la especifidad
 */
.ec-stars-wrapper > a:hover ~ a {
	color: #888;
}
</style>

<h2>Ir más allá</h2>
<p>El efecto ahora mismo no es precisamente alucinante, pero puedes hacer ciertas cosas para mejorarlo:</p>
<ul>
    <li><strong>Usa <code><a target="_blank" href="http://vagabundia.blogspot.com/2009/08/sombras-la-propiedad-text-shadow.html">text-shadow</a></code></strong>: Las estrellas son textos, así que puedes jugar con esta propiedad tanto como quieras para crear efectos mejores (<a href="http://codepen.io/ecoal95/pen/BrLhG">ver ejemplo</a>).</strong></li>
    <li><strong>Gradientes</strong> (<small>sólo <code>webkit</code></small>): Usando <code>-webkit-background-clip: text;</code>, junto con <code>-webkit-text-fill-color: transparent;</code>, podrás aplicar un gradiente a las estrellas (<a href="http://codepen.io/ecoal95/pen/hxgIz" target="_blank">Ver ejemplo</a>)</li>
    <li><strong>Fuentes con iconos</strong>: Así podrás usar la estrella que más te parezca, y además los que tengan navegadores que no soporten ese carácter, verán la estrella en todo su esplendor, y no ese cuadrado molesto de unicode.</li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://emiliocobos.net/calificacion-estrellas-solo-con-css/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>
