<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3390721125845655478</id><updated>2024-09-19T16:46:01.585+02:00</updated><category term="js"/><category term="jQuery"/><category term="CSS3"/><category term="CSS"/><category term="php"/><category term="HTML5"/><category term="HTML"/><category term="webSockets"/><category term="AJAX"/><category term="CSS2"/><category term="android"/><category term="node"/><category term="Chrome"/><category term="JSONP"/><category term="Lego"/><category term="Photoshop"/><category term="WindowsPhone"/><category term="apache"/><category term="flash"/><category term="gimp"/><category term="iPad"/><category term="iPhone"/><category term="iPod"/><category term="longPolling"/><category term="mysql"/><category term="oracle"/><category term="plugin"/><title type='text'>#FFF 3Nibbles</title><subtitle type='html'>Mordisquitos de la web para la web</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>89</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-3993126934518845622</id><published>2011-11-23T14:09:00.001+01:00</published><updated>2011-11-24T09:48:38.507+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSS3"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><title type='text'>jQuery cssHook rotate3D</title><content type='html'>Los cssHooks de jQuery me parecen el no va más en simplificación y hacen un gran trabajo para hacer uniforme el comportamiento de los CSS a través de los distintos navegadores.&lt;br /&gt;
&lt;br /&gt;
Para el que no sepa qué es un cssHook, le remito a la documentación de jQuery (&lt;a href=&quot;http://api.jquery.com/jQuery.cssHooks/&quot;&gt;http://api.jquery.com/jQuery.cssHooks/&lt;/a&gt;), pero en pocas palabras es la posibilidad de definir y usar propiedades CSS inventadas (o no) de modo que se puedan leer y ficjar sus valores, ejecutando un código concreto en este caso, claro.&lt;br /&gt;
&lt;br /&gt;
Sirven para o crear nuevas propiedades CSS que hagan cosas maravillosas (este caso) o hacer compatibles distintos navegadores usando una misma propiedad CSS en todos ellos. P.e. con ellos se puede usar la propiedad border radius en IE6 y funcionará igual que en cualquier otro navegador.&lt;br /&gt;
&lt;br /&gt;
Este cssHook, realiza una rotación isométrica de un elemento HTML. Se puede usar directamente mediante el método .css() de jQuery (tanto para hacer el set como para el get), así como parte de una llamada al método .animate() en todas sus variantes. El ángulo es en grados y se permiten tanto valores positivos como negativos así como expresiones de jQuery tipo &#39;+=180deg&#39;, que lo que hará es sumarle 180 grados a la rotación actual.&lt;br /&gt;
&lt;br /&gt;
Como un ejemplo es mejor que mil palabras, os pongo el &lt;a href=&quot;http://jsfiddle.net/jrdiaz/QfYkV&quot;&gt;jsfiddle&lt;/a&gt; del cssHook para que podáis probarlo en directo. Haced click en la carta para darle la vuelta. podía haber usado la imagen de una moneda, pero he preferido la de una carta.&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;allowfullscreen&quot; frameborder=&quot;0&quot; src=&quot;http://jsfiddle.net/jrdiaz/QfYkV/embedded/result,js,html,css&quot; style=&quot;height: 465px; width: 100%;&quot;&gt;&lt;/iframe&gt;
&lt;br /&gt;
&lt;b&gt;Importante!&lt;/b&gt;&lt;br /&gt;
Dado que éste cssHook usa la propiedad CSS3 transform, para simplificar su uso sin tener que recurrir a transformaciones de matrices, usa a su vez otro cssHook que se encarga de hacer más sencilla la definición de la propiedad transform. En este caso, se ha usado el cssHook de &lt;a href=&quot;https://github.com/brandonaaron/jquery-cssHooks&quot;&gt;brandonaaron&lt;/a&gt;/&lt;a href=&quot;https://github.com/louisremi/jquery.transform.js&quot;&gt;Louis Rémi&lt;/a&gt; pero hay otras alternativas aunque posiblemente, menos elegantes.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Extra!&lt;/b&gt;&lt;br /&gt;
Además del rotate3D, se define también otro cssHook llamado &quot;flipped&quot; para el control de cuándo se pasa de una cara a la otra al realizar la rotación.&lt;br /&gt;
&lt;br /&gt;
Este cssHook, se encarga de mantener el estado de qué cara del elemento se está mostrando. Si la propiedad css &#39;flipped&#39; es false, es la parte de adelante, si es false, la de atrás. El valor de la propiedad se cambia automáticamente cuando se gira el elemento al llegar a los 90 y a los 270 grados (módulo 360, como es lógico).&lt;br /&gt;
&lt;br /&gt;
Asimismo, definiendo el método $.fn.flippedEvent, se consigue un callback en el momento que se produce el cambio de cara por ejemplo, para cambiar la imagen que se muestra.&lt;br /&gt;
&lt;pre clss=&quot;brush:js&quot;&gt;$.fn.flippedEvent = function( elem, isFlipped ) { &amp;lt;yourCode&amp;gt; };&lt;/pre&gt;
&lt;br /&gt;
Y ahora, la versión minimizada de todo el código, que llega a unos ridículos 500bytes!!!&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;(function(b){if(!b.cssHooks)throw&quot;jQuery 1.4.3 or above is required for this plugin to work&quot;;b.fn.flippedEvent=null;b.cssNumber.flipped=!0;b.cssHooks.flipped={get:function(a){return a.style.flipped||!1},set:function(a,d){var c=/true/i.test(d);&quot;function&quot;===typeof b.fn.flippedEvent&amp;amp;&amp;amp;b.fn.flippedEvent.flipEvent(a,c);a.style.flipped=c}};b.cssNumber.rotate3D=!0;b.cssHooks.rotate3D={get:function(a){return a.style.rotate3D},set:function(a,d){d=parseFloat(d);var c=d;if(c!=parseFloat(a.style.rotate3D)){var i=
0&amp;lt;=c?1:-1,f=Math.floor(Math.abs(c)),j=(180&amp;lt;=f%360?-1:1)*(1-f%180/90),g=b(a),e=parseInt(a.style.rotate3D),h=e&amp;lt;c?!0:!1,e=Math.abs(e)%180,c=Math.abs(parseInt(c))%180;(h&amp;amp;&amp;amp;90&amp;gt;e&amp;amp;&amp;amp;90&amp;lt;=c||!h&amp;amp;&amp;amp;90&amp;lt;e&amp;amp;&amp;amp;90&amp;gt;=c)&amp;amp;&amp;amp;g.css(&quot;flipped&quot;,!g.css(&quot;flipped&quot;));g.css(&quot;transform&quot;,&quot;skew(0deg, &quot;+i*f+&quot;deg) scale(&quot;+j+&quot;, 1)&quot;)}a.style.rotate3D=d}};b.fx.step.rotate3D=function(a){b.cssHooks.rotate3D.set(a.elem,a.now,a.unit)}})(jQuery);&lt;/pre&gt;
&lt;br /&gt;
Código completo del cssHook. Como podréis ver, hace falta muy poco código para hacer que todo funcione.&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;/**
 * rotate3D/flipped jQuery cssHook v0.1
 * ==========================================================
 * (C) 2011 José Ramón Díaz - jrdiazweb@gmail.com
 *
 * Elegant and simple cssHooks to perform 3D-like css rotations and control 
 * visible side. 
 * 
 * REQUIRES.
 * A cssHook/code make transform CSS3 property work converting human readable 
 * values into its transformation matrix. In my case i&#39;ve used the transform 
 * cssHooks from Louis-Rémi Babé to make it compatible, but you are free to use 
 * whatever you want meanwhile makes transform work.  
 *     https://github.com/brandonaaron/jquery-cssHooks
 *     https://github.com/louisremi/jquery.transform.js
 * 
 * CSS properties use the grammar:
 *     - &quot;rotate3D: &amp;lt;n&amp;gt;[deg]&quot;
 *     - &quot;flipped: true|false&quot;
 * 
 * When an element is rotated, flipped CSS property is set according the 
 * element orientation. Side changes occurs on 90/270 degrees.
 * 
 * Side change event callback can be used defining the function $.fn.flippedEvent. 
 *     $.fn.flippedEvent = function( elem, isFlipped ) { &amp;lt;yourcode&amp;gt; };
 * 
 * Examples:
 *     - elem.css(&#39;rotate3D&#39;)      - Gets current rotation
 *     - elem.css(&#39;rotate3D&#39;, 180) - Rotates element 180 degrees
 *     - elem.animate({ rotate3D, -180 }, 1000);    - Animates element from current rotation to -180 degrees
 *     - elem.animate({ rotate3D, &quot;+=360&quot; }, 1000); - Animates element adding 360 degrees to its current rotation
 *     - $(&#39;.c&#39;).animate({&#39;rotate3D&#39;: &#39;+=180&#39;}, 2000, &#39;easeOutBounce&#39;) - Animates using easing function &#39;easeInOutBounce&#39; defined in jQueryUI
 *
 * Browser copatibility.
 * Any modern CSS3 compatible browser.
 * 
 * NOTE: cssHooks needs jQuery v1.4.3 or greater.
 * 
 * Inspired by zachstronaut&#39;s rotate3Di
 *     http://www.zachstronaut.com/projects/rotate3di/
 * 
 * Legal stuff
 *     You are free to use this code, but you must give credit and/or keep header intact.
 *     Please, tell me if you find it useful. An email will be enough.
 *     If you enhance this code or correct a bug, please, tell me.
 */
(function ($) {
 // Check if cssHooks are supported
 if(!$.cssHooks) { throw( &quot;jQuery 1.4.3 or above is required for this plugin to work&quot; ); return; }

 ///////////////////////////////////////////////////////////////////////////
   // &#39;flipped&#39; cssHook. Property has the format: &quot;flipped: true|false&quot;
   $.fn.flippedEvent = null; // Event function called when changing the side: &quot;function( elem, isFlipped? ) {}&quot;
 $.cssNumber[&#39;flipped&#39;] = true; // Special units. None in this case
 $.cssHooks[&#39;flipped&#39;]  = {
  
  get      : function( elem, computed, extra ) { return elem.style[&#39;flipped&#39;] || false; },
  set      : function( elem, value ) { 
      var val = /true/i.test(value); // Boolean conversion
      if( typeof $.fn.flippedEvent === &quot;function&quot; )
       $.fn.flippedEvent.flipEvent( elem, val );
      elem.style[&#39;flipped&#39;] = val;  
     }
  
 };
        
 ///////////////////////////////////////////////////////////////////////////
 // &#39;rotate3D&#39; csshook. Property has the format: &quot;rotate3D: &amp;lt;n&amp;gt;deg|rad&quot;
 $.cssNumber[&#39;rotate3D&#39;] = true; // Special units support &#39;deg&#39;, &#39;rad&#39;, etc
 $.cssHooks[&#39;rotate3D&#39;]  = {
  
  get: function( elem, computed, extra ) { return elem.style[&#39;rotate3D&#39;]; },
  set: function( elem, value, unit ) {
      value = parseFloat( value );
      apply3DRotation( elem, value, unit );
      elem.style[&#39;rotate3D&#39;] = value;
     }
        
 };

 // Animation step function for &#39;rotate3D&#39; custom CSS property
 $.fx.step[&#39;rotate3D&#39;] = function ( fx ) { $.cssHooks[&#39;rotate3D&#39;].set( fx.elem, fx.now, fx.unit ); };

 // Performs 3D rotation on element
 var apply3DRotation = function( elem, value, unit ) {

  if( value == parseFloat( elem.style[&#39;rotate3D&#39;] ) ) return; // No changes

  var dir   = value &amp;gt;= 0 ? 1 : -1;
  var deg   = Math.floor( Math.abs( value ) );
  var scale = ( ( deg % 360 ) &amp;gt;= 180 ? -1 : 1 ) * ( 1 - ( deg % 180 ) / 90 );

  var el  = $(elem); // Caches jQuery element to speed up execution

  var old = parseInt( elem.style[&#39;rotate3D&#39;] );
  var inc = old &amp;lt; value ? true : false; 

  var before = Math.abs( old ) % 180;
  var after  = Math.abs( parseInt( value ) ) % 180;

  // Side change control
  if(  inc &amp;amp;&amp;amp; before &amp;lt; 90  &amp;amp;&amp;amp; after &amp;gt;= 90 || !inc &amp;amp;&amp;amp; before &amp;gt; 90  &amp;amp;&amp;amp; after &amp;lt;= 90 )
   el.css(&#39;flipped&#39;, !el.css(&#39;flipped&#39;) );

  // Performs CSS transform
  el.css( &#39;transform&#39;, &#39;skew(0deg, &#39; + dir * deg + &#39;deg) &#39; +
                 &#39;scale(&#39; + scale + &#39;, 1)&#39;
  );
 };

})(jQuery);&lt;/pre&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/3993126934518845622/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/11/jquery-csshook-rotate3d.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/3993126934518845622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/3993126934518845622'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/11/jquery-csshook-rotate3d.html' title='jQuery cssHook rotate3D'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-2987939533790611212</id><published>2011-11-15T09:00:00.000+01:00</published><updated>2011-11-15T09:00:02.104+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="php"/><title type='text'>Sesiones PHP a lo campestre III. No se puede hacer más lento.</title><content type='html'>Parafraseando al famoso mago (por si no lo conocéis es manco y hace trucos de cartas con una única mano), voy a darle la vuelta de tuerca definitiva a este método de obtener la información de sesión sin abrir la sesión.&lt;br /&gt;
&lt;br /&gt;
Una vez que ya sabemos dónde están los ficheros de sesión tal y como se ha visto en las entregas anteriores, podemos simular de forma idéntica a como hace PHP la carga de la información de la sesión en una matriz asociativa.&lt;br /&gt;
&lt;br /&gt;
El primer paso es cargar los contenidos del fichero de la sesión.&lt;br /&gt;
&lt;pre class=&quot;brush:php&quot;&gt;$fname    = session_save_path() . &quot;/sess_&quot; . $sid;
$_session = unserializeSession( file_get_contents( $fname ) );
&lt;/pre&gt;
&lt;br /&gt;
Y para ello, se usa la siguiente función. Si es que es demasiado fácil...&lt;br /&gt;
&lt;pre class=&quot;brush:php&quot;&gt;///////////////////////////////////////////////////////////////////////////////
/**
 * unserializeSession - Unserialize para ficheros de sesión
 *
 * Convierte una cadena que se corresponde con los contenidos de un fichero de sesión en un array 
 * asociativo con las claves y valores de la sesión correspondiente.
 *
 * @access    public
 * @link      http://www.php.net/manual/en/function.session-decode.php#101687
 *
 * @param     string  $data  Cadena de texto del fichero de la sesión
 * @return    array          Array asociativa con las claves y valores
 */
function unserializeSession( &amp;amp;$data )
{
       if(  strlen( $data) == 0)
       {
              return array();
       }

       // match all the session keys and offsets
       preg_match_all(&#39;/(^|;|\})([a-zA-Z0-9_]+)\|/i&#39;, $data, $matchesarray, PREG_OFFSET_CAPTURE);

       $returnArray = array();

       $lastOffset = null;
       $currentKey = &#39;&#39;;
       foreach ( $matchesarray[2] as $value )
       {
              $offset = $value[1];
              if(!is_null( $lastOffset))
              {
                     $valueText = substr($data, $lastOffset, $offset - $lastOffset );
                     $returnArray[$currentKey] = unserialize($valueText);
              }
              $currentKey = $value[0];

              $lastOffset = $offset + strlen( $currentKey )+1;
       }

       $valueText = substr($data, $lastOffset );
       $returnArray[$currentKey] = unserialize($valueText);

       return $returnArray;
}&lt;/pre&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/2987939533790611212/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/11/sesiones-php-lo-campestre-iii-no-se.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/2987939533790611212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/2987939533790611212'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/11/sesiones-php-lo-campestre-iii-no-se.html' title='Sesiones PHP a lo campestre III. No se puede hacer más lento.'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-3231024903475508659</id><published>2011-11-14T09:18:00.001+01:00</published><updated>2011-11-14T09:22:31.340+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="js"/><title type='text'>Colocando el cursor con javascript</title><content type='html'>Seguro que alguna vez hemos querido colocar el cursor de un cuadro de texto o un textarea para cualquier cosa que se nos haya ocurrido, la pega es que no hay métodos nativos para ello, pero jugando un poco con los rangos de selección, es fácil de hacer.&lt;br /&gt;
&lt;br /&gt;
A continuación os pongo dos pequeñas funciones para conseguir el setter/getter de la posición del cursor. Es una &quot;tontá&quot;, pero es efectiva. Además si lo minimizas ocupa una miseria.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;function getCursorPosition( elem ) {

    var CaretPos = 0;
    // IE Support
    if( document.selection ) {

        elem.focus();
        var Sel = document.selection.createRange();

        Sel.moveStart( &#39;character&#39;, -elem.value.length );

        CaretPos = Sel.text.length;
    }
    // Firefox support
    else if ( elem.selectionStart || elem.selectionStart == &#39;0&#39; )
        CaretPos = elem.selectionStart;

    return( CaretPos );
}


function setCursorPosition( elem, pos )
{
    if( elem.setSelectionRange )
    {
        elem.focus();
        elem.setSelectionRange( pos,pos );
    }
    else if( elem.createTextRange ) {
        var range = elem.createTextRange();
        range.collapse( true );
        range.moveEnd( &#39;character&#39;, pos );
        range.moveStart( &#39;character&#39;, pos );
        range.select();
    }
}&lt;/pre&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/3231024903475508659/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/11/colocando-el-cursor-con-javascript.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/3231024903475508659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/3231024903475508659'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/11/colocando-el-cursor-con-javascript.html' title='Colocando el cursor con javascript'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-5672440134614937888</id><published>2011-10-27T14:04:00.000+02:00</published><updated>2011-10-27T14:04:33.342+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><title type='text'>jQuery Canvas Minimap</title><content type='html'>Y para rematar la semana, la joya de la corona. Otro plugin hecho por mí que toma un contenedor y genera un minimapa de éste y que pese a basarse en otro ya existente llamado Fracs, le da un giro de tuerca y lo hace más flexible.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggx0LGDZV3CS3lgfErFPQiTb5hDNjfEaXXqEqzG7aT8t3ERrIMfT1fqfizZzYAwcd8b2iSq5_Pfd_OWUdUJ2tQDrajO_dQ3bbMTi6lAwkm8KE_xfnA3h70TnStciAq4RXCdJRtjMByy-0/s1600/jQueryCanvasMinimap.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggx0LGDZV3CS3lgfErFPQiTb5hDNjfEaXXqEqzG7aT8t3ERrIMfT1fqfizZzYAwcd8b2iSq5_Pfd_OWUdUJ2tQDrajO_dQ3bbMTi6lAwkm8KE_xfnA3h70TnStciAq4RXCdJRtjMByy-0/s1600/jQueryCanvasMinimap.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
El principio de este plugin es tomar un contenedor del que se quiere hacer un minimapa e indicando un canvas de destino, pinta sobre él los elementos cuyos selectores hayamos definido usando el estilo que deseemos.&lt;br /&gt;
&lt;br /&gt;
Usarlo es lo más sencillo del mundo. Dados un canvas #myCanvas y un contenedor&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;var minimapInstance = $(&#39;#myCanvas&#39;).minimap( $(&#39;myContainer&#39;) [, options] );&lt;/pre&gt;
&lt;br /&gt;
Las opciones son opcionales, pero recomendables pues es donde se definen qué elementos se representarán en el minimapa y cómo se hará. Concretamente, la encargada de ello es la propiedad &quot;style&quot; que &amp;nbsp;es un array de objetos con la siguiente estructura:&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;styleDef {
       // selector to use for that style
       selector: String / HTMLElement / [HTMLElement, ...] / jQuery

       // border stroke width
       strokeWidth: float / undefined / &#39;auto&#39;

       // border color
       strokeStyle: String / undefined / &#39;auto&#39;

       // fill color
       fillStyle: String / undefined / &#39;auto&#39;
 }&lt;/pre&gt;
&lt;br /&gt;
Como una imagen vale más que mil palabras, como es usual, el repositorio del código está en &lt;a href=&quot;http://jsfiddle.net/jrdiaz/Utght/&quot;&gt;mi jsFiddle&lt;/a&gt;. Solo hace falta el código javascript.&lt;br /&gt;
&lt;iframe src=&quot;http://jsfiddle.net/jrdiaz/Utght/embedded/result,js,html,css/&quot; style=&quot;height: 300px; width: 100%;&quot;&gt;&lt;/iframe&gt;
&lt;br /&gt;
El código completo es éste&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;/**
 * jquery.minimap-0.1.js - Container Minimap Plugin
 * ==========================================================
 * (C) 2011 José Ramón Díaz - jrdiazweb@gmail.com
 *
 * http://3nibbles.blogspot.com/jquery-canvas-minimap.html
 * http://plugins.jquery.com/project/CanvasMinimap
 *
 * Container Minimap is a plugin that creates a minimap of the desired container
 * scaled down and styled so you can highlight the overall position of the
 * contents of the container element.
 *
 * Scale is calculated based on the minumum of width or height of the canvas used
 * to draw the minimap. So, using only CSS or attributes you can modify the scale
 * adjusting it to the desired size of the container.
 *
 * INSTANTIATION
 * Call the minimap method over the selector of the canvas where the minimap is
 * going to be drawn
 *
 *     minimapInstance = $(&#39;#myCanvas&#39;).minimap( $(&#39;myContainer&#39;) [, options] );
 *
 * The only HTML needed is the target canvas and the container to be drawn.
 *
 * OPTIONS
 *     - container : document.    Defaults to whole page. Otherwise is a
 *                                selector of the desired container to be mapped.
 *     - styles    : [ styleDef, ... ]    array with the styles to apply.
 *     - viewportStyle : styleDef. Style of the viewport.
 *     - viewportDragStyle: styleDef. Style of the viewport
 *
 * The OutlineStyle style must be in the following format (Same format than Fracs):
 *
 *     styleDef {
 *         // selector to use for that style
 *         selector: String / HTMLElement / [HTMLElement, ...] / jQuery
 *
 *         // border stroke width
 *         strokeWidth: float / undefined / &#39;auto&#39;
 *
 *         // border color
 *         strokeStyle: String / undefined / &#39;auto&#39;
 *
 *         // fill color
 *         fillStyle: String / undefined / &#39;auto&#39;
 *     }
 *
 * strokeWidth, strokeColor, fillColor may have the special values
 * undefined to ignore and &#39;auto&#39; to fetch values from css.
 *
 * PUBLIC API
 *     - $.minimap.redraw()    Redraws the minimap
 *     - drag                  Boolean that indicates that the viewport is being dragged
 *
 * Legal stuff
 *     Based on jQuery plugin named Fracs, but modified to allow minimapping of a
 *     desired container and some other enhancements.
 *
 *     You are free to use this code, but you must give credit and/or keep header intact.
 *     Please, tell me if you find it useful. An email will be enough.
 *     If you enhance this code or correct a bug, please, tell me.
 */
(function( $ ) {

 var $window   = $(window)
   , $document = $(document)
   ;

 ////////////////////////////////////////////////////////////////////////////////
    Rect = function (left, top, width, height) {

        if (!(this instanceof Rect)) {
            return new Rect(left, top, width, height);
        }

        this.left   = Math.round( left   );
        this.top    = Math.round( top    );
        this.width  = Math.round( width  );
        this.height = Math.round( height );
        this.right  = this.left + this.width;
        this.bottom = this.top  + this.height;
    };

    Rect.prototype = {
        equals: function( that ) {
            return this.left === that.left &amp;amp;&amp;amp; this.top === that.top &amp;amp;&amp;amp; this.width === that.width &amp;amp;&amp;amp; this.height === that.height;
        },

        area: function() {
            return this.width * this.height;
        },

        intersection: function( rect ) {
            var left   = Math.max( this.left  , rect.left   ),
                right  = Math.min( this.right , rect.right  ),
                top    = Math.max( this.top   , rect.top    ),
                bottom = Math.min( this.bottom, rect.bottom ),
                width  = right  - left,
                height = bottom - top;

            return ( width &amp;gt;= 0 &amp;amp;&amp;amp; height &amp;gt;= 0 ) ? Rect( left, top, width, height ) : undefined;
        },

        envelope: function( rect ) {
            var left   = Math.min( this.left  , rect.left   ),
                right  = Math.max( this.right , rect.right  ),
                top    = Math.min( this.top   , rect.top    ),
                bottom = Math.max( this.bottom, rect.bottom ),
                width  = right  - left,
                height = bottom - top;

            return Rect( left, top, width, height );
        }
    };


    /**
     * Special constructors
     */
    Rect.ofDocument = function() {
        return Rect( 0, 0, $document.width(), $document.height() );
    };

    Rect.ofViewport = function() {
        return Rect( $window.scrollLeft(), $window.scrollTop(), $window.width(), $window.height() );
    };

    Rect.ofElement = function( element ) {
        var $element = $(element)
          , offset;

        if( !$element.is(&quot;:visible&quot;) ) {
            return Rect( 0, 0, -1, 0 );
        }

        offset = $element.offset();
        return Rect( offset.left, offset.top, $element.outerWidth(), $element.outerHeight() );
    };

    Rect.ofElementOS = function( element, contOffset ) {
        var $element = $(element)
          , offset;

        if( typeof contOffset === &#39;undefined&#39; || !contOffset ) contOffset = { left: 0, top: 0 };
        if( !$element.is(&quot;:visible&quot;) ) {
            return Rect( 0, 0, -1, 0 );
        }

        offset = $element.offset();
        return Rect( offset.left - contOffset.left, offset.top - contOffset.top, $element.outerWidth(), $element.outerHeight() );
    };


 ////////////////////////////////////////////////////////////////////////////////
    // Instantiation
    $.fn.minimap = function( container, options ) {

     var contOffset;

     // Private members
     function MiniMap( canvas, container, options ) {

         if ( !(this instanceof MiniMap) ) {
             return new MiniMap( canvas, container, options );
         }

         if ( !canvas.nodeName || canvas.nodeName.toLowerCase() !== &quot;canvas&quot; ) {
             return undefined;
         }

         var me = this
           , $canvas    = $(canvas)
           , $container = $(container) || document
           , width      = $canvas.width()  || $canvas.attr(&quot;width&quot;)
           , height     = $canvas.height() || $canvas.attr(&quot;height&quot;)
           , context    = canvas.getContext(&quot;2d&quot;)
           , drag       = false
           , vpRect
           , scale
           ;

         options = $.extend( {}, $.fn.minimap.defaults, options );

      // ========================================================================
      // Public Members
         this.redraw = function() {
          // Gets the container offset to transform contents position
          contOffset = $(container).offset();
          if( !contOffset ) contOffset = { left: 0, top: 0 };

          // Gets the Rect of the container
          docRec = null;
    if( $container === document )
     docRect = Rect.ofDocument();
    else
     docRect = Rect.ofElement( $container );
    vpRect = Rect.ofViewport();
    scale = Math.min(width / docRect.width, height / docRect.height);

    // Scales canvas on size and on inner transform
    $canvas.height( docRect.height * scale );
    $canvas.width(  docRect.width  * scale );

    context.setTransform( 1, 0, 0, 1, 0, 0 );
    context.clearRect( 0, 0, $canvas.width(), $canvas.height() );

    //context.scale( scale, scale ); // WRONG! deforms the projection
    context.scale( width / docRect.width, height / docRect.height );

    // Draws the minimap
    applyStyles();
    //drawViewport();
         },

         drawRect = function( rect, strokeWidth, strokeStyle, fillStyle, invert ) {
          // Draws a Rect on canvas
             if ( strokeStyle || fillStyle ) {
                 if (fillStyle) {
                     context.beginPath();
                     if (invert) {
                         context.rect( 0, 0, docRect.width, rect.top );
                         context.rect( 0, rect.top, rect.left, rect.height );
                         context.rect( rect.right, rect.top, docRect.right - rect.right, rect.height );
                         context.rect( 0, rect.bottom, docRect.width, docRect.bottom - rect.bottom );
                     } else {
                         context.rect( rect.left, rect.top, rect.width, rect.height );
                     }
                     context.fillStyle = fillStyle;
                     context.fill();
                 }
                 if (strokeStyle) {
                     context.beginPath();
                     context.rect( rect.left, rect.top, rect.width, rect.height );
                     context.lineWidth = scale ? Math.max( strokeWidth, 0.2 / scale ) : strokeWidth;
                     context.strokeStyle = strokeStyle;
                     context.stroke();
                 }
             }
         },

         drawElement = function( element, strokeWidth, strokeStyle, fillStyle ) {
          // Gets the Rect of an element and draws it on canvas
             var $element = $(element),
                 rect = Rect.ofElementOS( element, contOffset );
              //rect = Rect.ofElement( element );

             if ($element.css(&quot;visibility&quot;) === &quot;hidden&quot; || rect.width === 0 || rect.height === 0) {
                 return;
             }

             strokeWidth = strokeWidth === &quot;auto&quot; ? parseInt($element.css(&quot;border-top-width&quot;), 10) : strokeWidth;
             strokeStyle = strokeStyle === &quot;auto&quot; ? $element.css(&quot;border-top-color&quot;) : strokeStyle;
             fillStyle   = fillStyle   === &quot;auto&quot; ? $element.css(&quot;background-color&quot;) : fillStyle;
             drawRect(rect, strokeWidth, strokeStyle, fillStyle);
         },

         applyStyles = function () {
          // Loops through the contents of the container
             $.each( options.styles, function (idx, style) {
                 $(style.selector).each(function () {
                     drawElement( this, style.strokeWidth, style.strokeStyle, style.fillStyle );
                 });
             });
         },

         drawViewport = function () {
             var style = drag &amp;amp;&amp;amp; options.viewportDragStyle ? options.viewportDragStyle : options.viewportStyle;

             drawRect( vpRect, style.strokeWidth, style.strokeStyle, style.fillStyle, options.invertViewport );
         };

         me.redraw();
     }

        return new MiniMap( this.get(0), container, options );
    };

    // ========================================================================
    // Minimap options defaults
    $.fn.minimap.defaults = {
        container  : document,        // Defaults to whole page. Otherwise is a selector of the container
        styles     : [{               // Sample styles
                      selector: &quot;header,footer,section,article&quot;,
                      fillStyle: &quot;rgb(230,230,230)&quot;
                     }, {
                      selector: &quot;h1&quot;,
                      fillStyle: &quot;rgb(240,140,060)&quot;
                     }, {
                      selector: &quot;h2&quot;,
                      fillStyle: &quot;rgb(200,100,100)&quot;
                     }, {
                      selector: &quot;h3&quot;,
                      fillStyle: &quot;rgb(100,200,100)&quot;
                     }, {
                      selector: &quot;h4&quot;,
                      fillStyle: &quot;rgb(100,100,200)&quot;
                     }]
    };

}(jQuery));&lt;/pre&gt;
&lt;br /&gt;
Y el código minimizado que llega a ocupar menos de 1.5Kb es&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;/** !jquery.minimap-0.1.js - Container Minimap Plugin
 * (C) 2011 José Ramón Díaz - jrdiazweb@gmail.com
 * http://3nibbles.blogspot.com/jquery-canvas-minimap.html | http://plugins.jquery.com/project/CanvasMinimap
 *
 * Based on jQuery plugin named Fracs, but modified to allow minimapping of a desired container and some other enhancements.
 * You are free to use this code, but you must give credit and/or keep header intact.
 */
(function(f){var h=f(window),j=f(document);Rect=function(a,b,c,e){if(!(this instanceof Rect))return new Rect(a,b,c,e);this.left=Math.round(a);this.top=Math.round(b);this.width=Math.round(c);this.height=Math.round(e);this.right=this.left+this.width;this.bottom=this.top+this.height};Rect.prototype={equals:function(a){return this.left===a.left&amp;amp;&amp;amp;this.top===a.top&amp;amp;&amp;amp;this.width===a.width&amp;amp;&amp;amp;this.height===a.height},area:function(){return this.width*this.height},intersection:function(a){var b=Math.max(this.left,
a.left),c=Math.min(this.right,a.right),e=Math.max(this.top,a.top),a=Math.min(this.bottom,a.bottom);c-=b;a-=e;return c&amp;gt;=0&amp;amp;&amp;amp;a&amp;gt;=0?Rect(b,e,c,a):void 0},envelope:function(a){var b=Math.min(this.left,a.left),c=Math.max(this.right,a.right),e=Math.min(this.top,a.top),a=Math.max(this.bottom,a.bottom);return Rect(b,e,c-b,a-e)}};Rect.ofDocument=function(){return Rect(0,0,j.width(),j.height())};Rect.ofViewport=function(){return Rect(h.scrollLeft(),h.scrollTop(),h.width(),h.height())};Rect.ofElement=function(a){var a=
f(a),b;if(!a.is(&quot;:visible&quot;))return Rect(0,0,-1,0);b=a.offset();return Rect(b.left,b.top,a.outerWidth(),a.outerHeight())};Rect.ofElementOS=function(a,b){var c=f(a),e;if(typeof b===&quot;undefined&quot;||!b)b={left:0,top:0};if(!c.is(&quot;:visible&quot;))return Rect(0,0,-1,0);e=c.offset();return Rect(e.left-b.left,e.top-b.top,c.outerWidth(),c.outerHeight())};f.fn.minimap=function(a,b){function c(a,b,i){if(!(this instanceof c))return new c(a,b,i);if(a.nodeName&amp;amp;&amp;amp;a.nodeName.toLowerCase()===&quot;canvas&quot;){var g=f(a),h=f(b)||document,
j=g.width()||g.attr(&quot;width&quot;),l=g.height()||g.attr(&quot;height&quot;),d=a.getContext(&quot;2d&quot;),m,k,i=f.extend({},f.fn.minimap.defaults,i);this.redraw=function(){(e=f(b).offset())||(e={left:0,top:0});docRec=null;docRect=h===document?Rect.ofDocument():Rect.ofElement(h);m=Rect.ofViewport();k=Math.min(j/docRect.width,l/docRect.height);g.height(docRect.height*k);g.width(docRect.width*k);d.setTransform(1,0,0,1,0,0);d.clearRect(0,0,g.width(),g.height());d.scale(j/docRect.width,l/docRect.height);applyStyles()};drawRect=
function(a,b,c,e,f){if(c||e){if(e)d.beginPath(),f?(d.rect(0,0,docRect.width,a.top),d.rect(0,a.top,a.left,a.height),d.rect(a.right,a.top,docRect.right-a.right,a.height),d.rect(0,a.bottom,docRect.width,docRect.bottom-a.bottom)):d.rect(a.left,a.top,a.width,a.height),d.fillStyle=e,d.fill();if(c)d.beginPath(),d.rect(a.left,a.top,a.width,a.height),d.lineWidth=k?Math.max(b,0.2/k):b,d.strokeStyle=c,d.stroke()}};drawElement=function(a,b,c,d){var g=f(a),a=Rect.ofElementOS(a,e);g.css(&quot;visibility&quot;)===&quot;hidden&quot;||
a.width===0||a.height===0||(b=b===&quot;auto&quot;?parseInt(g.css(&quot;border-top-width&quot;),10):b,c=c===&quot;auto&quot;?g.css(&quot;border-top-color&quot;):c,d=d===&quot;auto&quot;?g.css(&quot;background-color&quot;):d,drawRect(a,b,c,d))};applyStyles=function(){f.each(i.styles,function(a,b){f(b.selector).each(function(){drawElement(this,b.strokeWidth,b.strokeStyle,b.fillStyle)})})};drawViewport=function(){var a=i.viewportStyle;drawRect(m,a.strokeWidth,a.strokeStyle,a.fillStyle,i.invertViewport)};this.redraw()}}var e;return new c(this.get(0),a,b)};f.fn.minimap.defaults=
{container:document,styles:[{selector:&quot;header,footer,section,article&quot;,fillStyle:&quot;rgb(230,230,230)&quot;},{selector:&quot;h1&quot;,fillStyle:&quot;rgb(240,140,060)&quot;},{selector:&quot;h2&quot;,fillStyle:&quot;rgb(200,100,100)&quot;},{selector:&quot;h3&quot;,fillStyle:&quot;rgb(100,200,100)&quot;},{selector:&quot;h4&quot;,fillStyle:&quot;rgb(100,100,200)&quot;}]}})(jQuery);&lt;/pre&gt;
&lt;br /&gt;
Éste ha quedado chulo, ein?</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/5672440134614937888/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/10/jquery-canvas-minimap.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/5672440134614937888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/5672440134614937888'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/10/jquery-canvas-minimap.html' title='jQuery Canvas Minimap'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggx0LGDZV3CS3lgfErFPQiTb5hDNjfEaXXqEqzG7aT8t3ERrIMfT1fqfizZzYAwcd8b2iSq5_Pfd_OWUdUJ2tQDrajO_dQ3bbMTi6lAwkm8KE_xfnA3h70TnStciAq4RXCdJRtjMByy-0/s72-c/jQueryCanvasMinimap.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-6773517586139614169</id><published>2011-10-27T13:51:00.001+02:00</published><updated>2011-10-27T13:51:16.156+02:00</updated><title type='text'>No significa nada, pero me hace ilu!</title><content type='html'>Mi plugin de WizardSteps está el número 3 de la lista de los 10 plugins de navegación más creativos según script-tutorials.com&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.script-tutorials.com/10-most-creative-jquery-navigation-plugins/&quot;&gt;http://www.script-tutorials.com/10-most-creative-jquery-navigation-plugins/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Y también se me nombra en otros sitios en posts con el apelativo de &quot;superb&quot; :D&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.multyshades.com/2011/08/30-superb-jquery-plugins-for-dropdown-navigation-menus/&quot;&gt;http://www.multyshades.com/2011/08/30-superb-jquery-plugins-for-dropdown-navigation-menus/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Ya se que no es un ranking mundial ni nada de eso, pero siempre es agradable algo de reconocimiento, no?&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/6773517586139614169/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/10/no-significa-nada-pero-me-hace-ilu.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/6773517586139614169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/6773517586139614169'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/10/no-significa-nada-pero-me-hace-ilu.html' title='No significa nada, pero me hace ilu!'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-8736096520892167763</id><published>2011-10-27T09:00:00.000+02:00</published><updated>2011-10-27T09:00:03.864+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><title type='text'>Detectando si un contenedor tiene barras de scroll</title><content type='html'>Hola, hoy toca algo un poco más ligero que la entrada de ayer y os comparto otro mini-plugin de jQuery para detectar si un elemento tiene barras de scroll o no. No es mío, pero lo importante es que es diminuto y funciona a la perfección.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;/* Plugin to test if the element has vertical scrollbar or not */
(function($) {
 $.fn.hasScrollBar = function() { return this.get(0).scrollHeight &amp;gt; this.height(); }
})(jQuery);&lt;/pre&gt;
&lt;br /&gt;
Para invocarlo, nada más sencillo que llamarlo sobre el selector del elemento a comprobar y devuelve tru o false.&lt;br /&gt;
&lt;br /&gt;
Por ejemplo si tenemos un div llamado #miDiv, sería: &amp;nbsp;$(&#39;#miDiv&#39;).hasScrollBar();&lt;br /&gt;
&lt;br /&gt;
Sencillo, no?, pues preparaos, que en breve viene el próximo macro-plugin jQuery by me (o al menos, mayormente jejejejeje).</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/8736096520892167763/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/10/detectando-si-un-contenedor-tiene.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/8736096520892167763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/8736096520892167763'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/10/detectando-si-un-contenedor-tiene.html' title='Detectando si un contenedor tiene barras de scroll'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-4748849360673576080</id><published>2011-10-26T09:00:00.000+02:00</published><updated>2011-11-24T09:33:29.713+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSS3"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><title type='text'>Plugin jQuery Sliding Panel</title><content type='html'>Hola, hoy os presento uno de los plugins de jQuery que he hecho y que os he prometido para esta semana. Hablamos de la continuación del &lt;a href=&quot;http://3nibbles.blogspot.com/2011/07/plugin-jquery-sliding-buttons.html&quot;&gt;Slide Button&lt;/a&gt; ya que comparte gran parte de la apariencia y funcionalidad, pero aplicado a paneles en vez de a botones.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnY9Xj9BPNnYHTadnqoQe7SdwKuFex6oCBBqsGK7m2pNkVFP5CLWRGTdlLIFcGDU6DE41sqaC6il4-j6wh7ze1YgB7RIR2ifr_flPhmboa1iTbi1Kf2QrXttZm-9C32uU6ww_yLOt7WMU/s1600/slidePanel.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;97&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnY9Xj9BPNnYHTadnqoQe7SdwKuFex6oCBBqsGK7m2pNkVFP5CLWRGTdlLIFcGDU6DE41sqaC6il4-j6wh7ze1YgB7RIR2ifr_flPhmboa1iTbi1Kf2QrXttZm-9C32uU6ww_yLOt7WMU/s400/slidePanel.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Este plugin está basado en uno denominado &lt;a href=&quot;http://www.jqeasy.com/jquery-slide-panel-plugin/&quot;&gt;jqEasy&lt;/a&gt;&amp;nbsp;(un saludo!), pero con cuyas tripas no estoy de acuerdo, ya que arrastraba varios fallos, no seguía las recomendaciones de desarrollo de plugins, definiciones CSS incompletas y memory leaks graves, así que opté por reescribirlo todo desde cero, tanto el CSS como javascript adaptándolo a la apariencia de los &lt;a href=&quot;http://3nibbles.blogspot.com/2011/07/plugin-jquery-sliding-buttons.html&quot;&gt;slide buttons&lt;/a&gt; (lo cual no quiere decir que mi código sea infalible, solo que los errores que detecté han sido corregidos).&lt;br /&gt;
&lt;br /&gt;
Usarlo es lo más sencillo del mundo, ya que solo hay que llamar a la función slidePanel() sobre el contenedor del widget, que tiene que tener una mínima estructura que os detallaré más adelante. La única particularidad es que si se quiere a la izquierda no hay que hacer nada, pero si se quiere a la derecha hay que anadir la clase &quot;.right&quot; al contendor (o usar las propiedades del plugin).&lt;br /&gt;
&lt;br /&gt;
Por defecto también considera que está &quot;fixed&quot; a la página, pero cambiando la propiedad position del CSS (o del objeto jQuery) a &quot;relative&quot; o &quot;absolute&quot;, se cambia el comportamiento del widget radicalmete. Para más detalles podéis comprobar el ejemplo del jsFiddle, donde hay ejemplos con las 6 combinaciones posibles.&lt;br /&gt;
&lt;br /&gt;
También es fácilmente integrable con jQueryUI (los estilos aún no, lo siento), pudiéndose usar dentro de una pila de llamadas para añadirle comportamiento con draggable() o modificando las funciones de despliegue del panel mediante las propiedades del objeto jQuery.&lt;br /&gt;
&lt;br /&gt;
Debe funcionar en todos los navegadores, incluido el IE6 (aunque no soporta la propiedad CSS &quot;position: fixed&quot; sustituyéndose por &quot;position: absolute&quot; de forma automática). Evidentemente, mientras más &quot;moderno&quot; sea el navegador, más bonito se verá (transparencias, esquinas redondeadas, etc), pero eso es cosa de CSS y no de código.&lt;br /&gt;
&lt;br /&gt;
Sin más demoras, os dejo el &lt;a href=&quot;http://jsfiddle.net/jrdiaz/JX8yt/&quot;&gt;jsF&lt;/a&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #0000ee;&quot;&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;
&lt;a href=&quot;http://jsfiddle.net/jrdiaz/JX8yt/&quot;&gt;iddle&lt;/a&gt;, donde está todo el código, css y ejemplos necesarios. El código está comentado así como documentado así que no deberíais tener mucho problema. Si&amp;nbsp;encontrarais&amp;nbsp;un bug, no dudéis en comunicármelo. Alternativamente, podéis visitar la página del plugin en la &lt;a href=&quot;http://plugins.jquery.com/project/FancySlidePanel&quot;&gt;página oficial de jQuery&lt;/a&gt;.&lt;br /&gt;
&lt;iframe src=&quot;http://jsfiddle.net/jrdiaz/JX8yt/embedded/result,html,js,css&quot; style=&quot;height: 600px; width: 100%;&quot;&gt;&lt;/iframe&gt;
&lt;br /&gt;
&lt;br /&gt;
Y para los más impacientes, el código completo:&lt;br /&gt;
&lt;br /&gt;
Estructura básica HTML&lt;br /&gt;
&lt;pre class=&quot;brush:html&quot;&gt;&amp;lt;div class=&quot;slidePanelWidget&quot; id=&quot;widget1&quot;&amp;gt;
    &amp;lt;a class=&quot;slidePanelButton&quot; href=&quot;&quot;&amp;gt;&amp;amp;nbsp;Widget 1&amp;lt;/a&amp;gt;
    &amp;lt;div class=&quot;slidePanel panel&quot;&amp;gt;

        These are the contents of the widget!&lt;/pre&gt;
&lt;pre class=&quot;brush:html&quot;&gt;    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
Código javascript minimizado. Llega a ocupar un mínimo de unos 900 bytes. Quién pide más?&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;/*! jquery.slidePanel-0.1.js - Slide Panel plugin for jQuery
* ==========================================================
* (C) 2011 José Ramón Díaz - jrdiazweb@gmail.com - v.0.1.0 (25/10/2010)
* Requires: jQuery v1.4.3+
* http://3nibbles.blogspot.com/2011/10/plugin-jquery-sliding-panel.html
* You are free to use this code, but you must give credit and/or keep header intact.
* Please, tell me if you find it useful. An email will be enough.
* If you enhance this code or correct a bug, please, tell me.
*/
(function(b){function f(c,d){var g=b.browser.msie&amp;amp;&amp;amp;b.browser.version==&quot;6.0&quot;,a=this;a.opts=d;a.widget=c;a.button=a.widget.find(&quot;.slidePanelButton&quot;);a.panel=a.widget.find(&quot;.slidePanel&quot;);a.left=a.widget.hasClass(&quot;right&quot;)?false:true;if(g)a.opts.position=a.opts.position==&quot;fixed&quot;?&quot;absolute&quot;:a.opts.position;a.opts.position&amp;amp;&amp;amp;a.button.css(&quot;position&quot;,a.opts.position);a.opts.buttonTop&amp;amp;&amp;amp;a.button.css(&quot;top&quot;,a.opts.buttonTop);a.opts.panelTop&amp;amp;&amp;amp;a.panel.css(&quot;top&quot;,a.opts.panelTop);a.button.attr(&quot;href&quot;,&quot;javascript:void(0)&quot;).click(function(){a.opts.ajax?
a.panel.is(&quot;:visible&quot;)?a.toggle():a.panel.load(a.opts.ajax,function(b,c){c!==&quot;success&quot;&amp;amp;&amp;amp;a.panel.html(&quot;Sorry, but there was an error loading the document.

&quot;);a.toggle()}):a.toggle();return false});a.deployed=false;a.toggle=function(b){if(typeof open===&quot;boolean&quot;)a.deployed=b;a.deployed?a.close():a.open()};var e=0;a.open=function(){a.deployed=true;var b=a.button.width();b&amp;amp;&amp;amp;(oldPaddingR=a.button.css(&quot;padding-right&quot;),oldPaddingL=a.button.css(&quot;padding-left&quot;),e=b);a.button.addClass(&quot;deployed&quot;);a.left?
a.button.animate({width:&quot;0px&quot;,&quot;padding-right&quot;:&quot;0px&quot;},a.opts.speed,a.opts.animFunction):a.button.animate({width:&quot;0px&quot;,&quot;padding-right&quot;:&quot;0px&quot;,&quot;padding-left&quot;:oldPaddingR},a.opts.speed,a.opts.animFunction);a.panel.toggle(a.opts.speed,a.opts.animFunction,function(){});a.opts.clickToClose&amp;amp;&amp;amp;a.enableCloseFn()};a.close=function(){a.deployed=false;a.panel.toggle(a.opts.speed,a.opts.animFunction,function(){});a.left?a.button.animate({width:e+&quot;px&quot;,&quot;padding-right&quot;:oldPaddingR},a.opts.speed,a.opts.animFunction):
a.button.animate({width:e+&quot;px&quot;,&quot;padding-right&quot;:oldPaddingR,&quot;padding-left&quot;:oldPaddingL},a.opts.speed,a.opts.animFunction);a.button.removeClass(&quot;deployed&quot;);a.opts.clickToClose&amp;amp;&amp;amp;a.disableCloseFn()};a.stopCloseFn=function(a){a.stopPropagation()};a.enableCloseFn=function(){b(document).bind(&quot;click&quot;,a.close);a.panel.bind(&quot;click&quot;,a.stopCloseFn)};a.disableCloseFn=function(){b(document).unbind(&quot;click&quot;,a.close);a.panel.unbind(&quot;click&quot;,a.stopCloseFn)}}b.fn.slidePanel=function(c){var d=b.extend({},{position:null,
buttonTop:null,panelTop:null,animFunction:&quot;swing&quot;,speed:&quot;fast&quot;,ajax:null,clickToClose:true},c);return!this.data(&quot;slidePanel&quot;)||typeof c==&quot;object&quot;?this.each(function(){var c=b(this);c.data(&quot;slidePanel&quot;,new f(c,d))}):this.data(&quot;slidePanel&quot;)}})(jQuery);&lt;/pre&gt;
&lt;br /&gt;
Código javascript completo&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;/*! jquery.slidePanel-0.1.js - Slide Panel plugin for jQuery
 * ==========================================================
 * (C) 2011 José Ramón Díaz - jrdiazweb@gmail.com
 * Version: 0.1.0 (25/10/2010)
 * Requires: jQuery v1.4.3+
 *
 * http://3nibbles.blogspot.com/2011/10/plugin-jquery-sliding-panel.html
 *
 * INSTANTIATION
 * The basic structure is a div indicating on his class if it must be at
 * left (default, no extra class needed) or right (&quot;.right&quot; class needed).
 * Inside the div there must be an &amp;lt;a class=&quot;slidePanelButton&quot;&amp;gt; and a
 * &amp;lt;div class=&quot;slidePanel&quot;&amp;gt;. That&#39;s all.
 *
 * Manual instantiation
 *     $(&#39;.slidePanelWidget&#39;).slidePanel( [ options_object ] );
 *
 * Optionally if you use jQueryUI, you can add draggable to it with
 *     $(&#39;.slidePanelWidget&#39;).slidePanel( [ options_object ] ).draggable( { axis: &#39;y&#39; } );
 *
 * OPTIONS
 *     - position     : null null (CSS position) / &#39;fixed&#39; / &#39;absolute&#39;
 *     - buttonTop    : null top position of the button inside slidePanelWidget. Null = CSS specified.
 *     - panelTop     : null top position of the panel inside slidePanelWidget. Null = CSS specified.
 *     - animFunction : &#39;swing&#39; Animation function used to deploy panel
 *     - speed        : &#39;fast&#39; Animation speed
 *     - ajax         : null URL of th AJAX call to perform to load panel contents. It is loaded before deploying the panel.
 *     - clickToClose : true True = click anywhere to close the panel
 *
 * API
 *     - toggle()  Toggles open/close panel state
 *     - open()    Forces open panel
 *     - close()   Forces close panel
 *     - deployed  Indicates that the control is deployed (opened)
 *
 * CLASSES USED
 *     - Container: .slidePanelWidget, .right
 *     - Button:    .slidePanelButton, .deployed
 *     - Content:   .slidePanel
 *
 * HTML format
 *     &amp;lt;div id=&quot;widget1&quot; class=&quot;slidePanelWidget&quot;&amp;gt;
 *        &amp;lt;a class=&quot;slidePanelButton&quot;&amp;gt;&amp;nbsp;Name&amp;lt;/a&amp;gt;
 *        &amp;lt;div class=&quot;slidePanel panel&quot;&amp;gt;
 *
 *            &amp;lt;!-- Widget contents --&amp;gt;
 *            Paste here the contents of the panel
 *            &amp;lt;!-- End of widget contents --&amp;gt;
 *
 *        &amp;lt;/div&amp;gt;
 *      &amp;lt;/div&amp;gt;
 *
 * Legal stuff
 *     You are free to use this code, but you must give credit and/or keep header intact.
 *     Please, tell me if you find it useful. An email will be enough.
 *     If you enhance this code or correct a bug, please, tell me.
 *
 * THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 * Modifications:
 *     - 2011-10-25  JRDiaz  Creation
 */
(function($){

    // Instantiation
 $.fn.slidePanel = function( options ) {
  var defaults = {
     position     : null
   , buttonTop    : null
   , panelTop     : null
   , animFunction : &#39;swing&#39;
   , speed        : &#39;fast&#39;
   , ajax         : null
   , clickToClose : true
  };

  var opts = $.extend( {}, defaults, options );

  if( !this.data(&#39;slidePanel&#39;) || typeof options == &#39;object&#39; )
  {
   // Not instantiated or part of a selector call
   return this.each(function() {
    var me = $(this);
    me.data(&#39;slidePanel&#39;, new SlidePanel( me, opts ));
   });
  }
  else
  {
   return this.data(&#39;slidePanel&#39;);
  }
    };

 // SlidePanel Object
    function SlidePanel( el, opts ) {
  var isIE6  = $.browser.msie &amp;amp;&amp;amp; $.browser.version == &quot;6.0&quot;;

  var me    = this;
  me.opts   = opts;
  me.widget = el;
  me.button = me.widget.find(&#39;.slidePanelButton&#39;);
  me.panel  = me.widget.find(&#39;.slidePanel&#39;);
  me.left   = me.widget.hasClass(&#39;right&#39;) ? false : true;

  // ie6 doesn&#39;t like fixed position
  if( isIE6 ) { me.opts.position = me.opts.position == &#39;fixed&#39; ? &#39;absolute&#39; : me.opts.position; }

  // set css properties for button and panel
  if( me.opts.position  ) me.button.css( &#39;position&#39;, me.opts.position );
  if( me.opts.buttonTop ) me.button.css( &#39;top&#39;, me.opts.buttonTop );
  if( me.opts.panelTop  ) me.panel.css ( &#39;top&#39;, me.opts.panelTop  );

  // Button click event
  //me.button.attr( &quot;href&quot;, &quot;javascript:void(0)&quot; ).mousedown(function() {
  me.button.attr( &quot;href&quot;, &quot;javascript:void(0)&quot; ).click( function() {
   // load default content if ajax is false
   if (!me.opts.ajax) {
    //me.panel.toggle( me.opts.speed, me.opts.animFunction, function () {} );
    me.toggle();
   }
   else
   {
    // Loads the panel contents via AJAX if opts.ajax is defined
    if ( !me.panel.is(&#39;:visible&#39;) ) { // fetch data ONLY when panel is hidden...
     me.panel.load(me.opts.ajax, function( response, status, xhr ) {
      if (status !== &quot;success&quot;) { // the ajax source wasn&#39;t loaded properly
       var msg = &quot;&amp;lt;p&amp;gt;Sorry, but there was an error loading the document.&amp;lt;/p&amp;gt;&quot;;
       me.panel.html(msg);
      };
      // Sets the HTML of the panel BEFORE opening it
      //me.panel.toggle( me.opts.speed, me.opts.animFunction, function () {} );
      me.toggle();
     });
    } else {
     //me.panel.toggle( me.opts.speed, me.opts.animFunction, function () {} );
     me.toggle();
    }
   }
   //me.button.toggleClass(&quot;deployed&quot;);
   return false;
  });

  // Control functions
  me.deployed = false;
  me.toggle = function( deployPanel ) {
   if( typeof open === &#39;boolean&#39; ) me.deployed = deployPanel; // Forces open or close
   if( !me.deployed ) me.open();
   else               me.close();
  };

  var oldPadding = &#39;0px&#39;;
  var oldWidth   = 0;
  me.open = function() {
   me.deployed = true;

   // Stores old values
   var w = me.button.width();
   if( w ) {
    oldPaddingR = me.button.css(&#39;padding-right&#39;);
    oldPaddingL = me.button.css(&#39;padding-left&#39;);
    oldWidth   = w;
   }
   me.button.addClass( &#39;deployed&#39; );
   // Animates button
   if( me.left )
    me.button.animate( { &#39;width&#39;: &#39;0px&#39;, &#39;padding-right&#39;: &#39;0px&#39; }, me.opts.speed, me.opts.animFunction );
   else
    me.button.animate( { &#39;width&#39;: &#39;0px&#39;, &#39;padding-right&#39;: &#39;0px&#39;, &#39;padding-left&#39;: oldPaddingR }, me.opts.speed, me.opts.animFunction );
   me.panel.toggle( me.opts.speed, me.opts.animFunction, function () {} );

   if ( me.opts.clickToClose ) me.enableCloseFn(); // Enables autoclose function if clickToClose is enabled
  };

  me.close = function() {
   me.deployed = false;

   me.panel.toggle( me.opts.speed, me.opts.animFunction, function () {} );
   // Animates button
   if( me.left )
    me.button.animate( { &#39;width&#39;: oldWidth + &#39;px&#39;, &#39;padding-right&#39;: oldPaddingR }, me.opts.speed, me.opts.animFunction );
   else
    me.button.animate( { &#39;width&#39;: oldWidth + &#39;px&#39;, &#39;padding-right&#39; : oldPaddingR, &#39;padding-left&#39;: oldPaddingL }, me.opts.speed, me.opts.animFunction );
   me.button.removeClass( &#39;deployed&#39; );

   if ( me.opts.clickToClose ) me.disableCloseFn(); // Disables autoclose function if clickToClose is enabled
  };

  // Autoclose panel when clicking outside
  me.stopCloseFn    = function(e) { e.stopPropagation(); }; // don&#39;t close panel when clicking inside it
        me.enableCloseFn  = function( ) { $(document).bind  ( &#39;click&#39;, me.close ); me.panel.bind  (&#39;click&#39;, me.stopCloseFn ); };
        me.disableCloseFn = function( ) { $(document).unbind( &#39;click&#39;, me.close ); me.panel.unbind(&#39;click&#39;, me.stopCloseFn ); }; // Removes binds
 };
})(jQuery);&lt;/pre&gt;
&lt;br /&gt;
Código CSS&lt;br /&gt;
&lt;pre class=&quot;brush:css&quot;&gt;/*
 * jQuery slidePanel plugin basic styles
 * Version: 0.1.0 (2011/10/25)
 */

/* Widget styles */
.slidePanelWidget { position: fixed; .position: absolute; left: 0; }
.slidePanelWidget.right { left: auto; right: 0; }

  /* Button styles */
  .slidePanelWidget a.slidePanelButton:focus { outline: none; }

  .slidePanelWidget .slidePanelButton {
    white-space: nowrap;
    overflow: hidden;
    position: absolute;
    top: 4px;
    height: 19px;
    background-color: #BAC8DC;

    text-decoration: none;
    color: #fff;
    font-weight: bold;

    z-index: 2;
  }

  /* Left/right button styles */
  .slidePanelWidget .slidePanelButton {
   left: 0;
    padding: 1px 10px 1px 20px;
    background-position: 0 0;

           -moz-border-radius-topright: 10px;
        -khtml-border-top-right-radius: 10px;
       -webkit-border-top-right-radius: 10px;
               border-top-right-radius: 10px;

        -moz-border-radius-bottomright: 10px;
     -khtml-border-bottom-right-radius: 10px;
    -webkit-border-bottom-right-radius: 10px;
            border-bottom-right-radius: 10px;
  }
  .slidePanelWidget.right .slidePanelButton {
   left: auto; right: 0;
    padding: 1px 20px 1px 10px;
    background-position: 100% 0;

                   -moz-border-radius: 0;
                 -khtml-border-radius: 0;
                -webkit-border-radius: 0;
                        border-radius: 0;

           -moz-border-radius-topleft: 10px;
        -khtml-border-top-left-radius: 10px;
       -webkit-border-top-left-radius: 10px;
               border-top-left-radius: 10px;

        -moz-border-radius-bottomleft: 10px;
    -khtml-border-bottom-right-radius: 10px;
    -webkit-border-bottom-left-radius: 10px;
            border-bottom-left-radius: 10px;
  }

  /* Dynamic change of sprites. Sprites are 19px tall */
  .slidePanelWidget .slidePanelButton         { /* Open sprite */ background: #BAC8DC url(data:image/png;base64,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) no-repeat 0 0; }
    .slidePanelWidget .slidePanelButton:hover { background-color: #59B; background-position: 0 -19px; }
    .slidePanelWidget.right .slidePanelButton:hover { background-position: 100% -19px; }

  .slidePanelWidget .slidePanelButton.deployed         { /* Closed sprite */ background: #666 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAYAAAD+MdrbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABZ0RVh0Q3JlYXRpb24gVGltZQAwMy8yMy8wOT6cudcAAAAfdEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIDi1aNJ4AAAHu0lEQVRIiX2Xe3BUVx3HP+fc3ezdbAJ5bIkkZAshoU3S0AQQgxQkPBywZUCHqYUqMJYxFmi1jtUW6IxIHaWD08q0kzpCdMYGis6A2nZGRiIOQyXGPhRoQssrMdsSwmbZbDb33n3ce/zj3mTSx3hmzl/33M/9Pb+/c4VSivElhJBAHjAFCHt7KqB7RyzgNjAMxIBRIKOUciYY40AhhAYUAhVADTAPaAZme1AFJIH3gS7gXeAq8BEwqpSyJ4AerBioBlYA32hubp6zYsUKWVZWhs/nQ0pJNpslGo3S2dlpv/XWW+8DHcApD5xQStkCkJ6LdwFfq6io2L5p06aCSCRCLBYjkUhgmiYAwWCQoqIiwuEwfX19dHR0jAwODr4E/MmzfFQDAkAEuD8SiTyxZcuWgvz8fHp6erh16xaZTAYhBEopxsbGiMViDA0NUVZWRmNjo97b29tgGMaA53py3NW5wBOtra0VhYWFXL58mfnz5xOJRAiFQvT395PJZKirq6Ompobp06dz4cIFysrKmDVrlt7d3T0N+DdwSwIlwLwFCxbcVVlZSTQaBSCXy7Fjxw52795NMBiktLSUPXv2sHPnTtLpNI7jMDAwQHV1NU1NTfWeUSUaUAts2rx585xMJkMymUQIQW9vL+FwmKqqKnRdZ+HChVRWVnL8+HFOnDhBKBRCSonP52PGjBny3Llzo8C7vvHsVlRUcOXKFbysM2XKFNrb25k7dy5r1qwBYGhoiPb2dgoKCpBSApBIJJg5cybAHKBIekkp9vl8DA8PY5omlmWRy+WIx+McPnx4ovAPHjyIZVnYtk06ncayLOLxOLqu44UuKCd1CZZlTWzDMABYv379BPDhhx9GKYVhGBNAy7IQQkyckYAJJC3Lwu/3Y5omhmEQj8fZtm0btbW1vPfeewwODlJbW0trayvxeBzDMDBNE7/fj2VZAHHAlEACuDQwMEA4HMY0TUZGRqirq2PDhg0A7N27l127dgHw4IMP0tDQwMjICIZhUFpaSl9fH8Al4LbEbfI3Ozs77dmzZ2PbNpqmsW/fPgAOHTrExYsX6erq4tixYwA8++yzaJpGLpejqqqKU6dOZYF/AjGBqyjNwE8ee+yxJk3T6OzsJJPJTMB9Ph9CCLLZLLlcDikleXl5tLS0YNs2bW1tbwPPAN0akPOUJDUwMLB44cKFgfLycqLRKLZtA+A4Do7jTCRP13WWLFmCruscOXLklmmabUA3cFMDHCALGKlUKtHb23tPY2NjcOnSpUgpGRsbI5lMksvlKCkpoaGhgVWrVjEyMsKrr756OxaLPQ90Av2ANVm+inC1bzmwcd68eXXLli3zVVZWEggEUEphmibXr1/n9OnT2Z6enneAI8CbwDUgqZSyP0tgP+eB7wU+D9ztdZPCVepeLwEXPdBNIPUxgZ1U3OMjoMCr/LBn+fgIMLwyi3l1lwKyahLEx6TlzQZLCOHgtmQRoE065/NinvKsyvCJ9VkWhoG6vbP47towK8vzCOkSoQkwHdQ1k9HXYpz8aT8veu4P/78hVbE2zPYnIzxen08wYUtGbYHluL2qS0WhpijSHP6TwvjZf3nhr3HagI/GoeNZFkD5ujBPPxXhO9MCUrtqSUwbAhLyJQgBYzakHdAlzNIdYlnH/uFVDpxN8DwwpJRS48AC4KG/NfFydVBqvYZEW7sNI1BI5tYN0qeOIoC8lQ/hv6Oc/PQo6T8foi7f4XzKya6/wLeAE0qpMZ9nXeSbZey+N4R2LS1RgOnA2t3PAbB/dQ+Bwil874VXAPjjrkcRCm5kJYumOv6N03jm6BD/EkJ8oHll8uWDc9iqa1KkbIEE+s+/TaZqLjNq7iYzdRrVX1pNxZ0z6Tz6W661/Zg7/AK/cENSqavijpv8A7jkA/KBlroQIpoROICUUKELuvY/SfX8Zpav/SoAsZuDnPv5D7g7AD4JSkDCFtSHkMBi4A0JhICGgIR4VmDYYNogAG3wOide+sVEWb2yfy9+IwEIMg5YNtzOCgo1AJqA0PhMKZOAaStMW2HZimRWkQwW0fL1zRPA+x/ZTlIvIpVTpG1F2nHPSreqpuNGwF2jOfAJheHAqA19acUXfnSA6voGLl08z83BG9TUN7Dk6QP0WYqkDSkbNKEYzbmNBu5MyQBD58egxK8wbMVgWqEtup+VG7cC0L7rcV76fisAqzdtRV/8AIMZxZitKPEr3hkF4EMgI72+PPtiFO7UFTkH0qFiHjnwa7dEXv4l5jtniJ95nb90/AaAbx/4FVZ+ERkbKgOKg1EUcAZICcAPLAVeO34PwQpdcHJYEMuC5SiCmht0AZ6bCr+AEp9gdaniQ0uxsYdR4CtAl+b5bgL3vJui5oESRE2+YjjrRjhPuDAh3JYrlFDsg5ZixZgNj1/GSdqcBH6nlEqOt14A98b6h0iA8hfnIBYUwtsp+MAQDGVd6LQ8qA4q6kPQnYSnrqL6Ld4HHgXOKaXSKKXwFKcQWAdcBnLrwqg35qKiX0QllqCG70Ndb0b9vh61vBgF2LiKvRJXkF3lmgQUHnQl8DrufdrxQjJ5296zI8CiyTCl1KcEVniFXox7cW8B7gNmePA+4Czwd8+6BO5fwATkY8BPgDXcPg95H1FAGhgDTKVU7lMvAv8D7eSa3J0E5V4AAAAASUVORK5CYII=) no-repeat 0 0; }
    .slidePanelWidget .slidePanelButton.deployed:hover { background-color: #59B; background-position: 0 -19px; }
    .slidePanelWidget.right .slidePanelButton.deployed:hover { background-position: 0 -19px; }


  /* Panel styles */
  .slidePanelWidget .slidePanel {
    display: none;
    position: absolute;
    width: auto;
    height: auto;
    z-index: 1;

    padding: 8px;
    color:#CCC;
    background: #111;

      -ms-filter: &quot;progid:DXImageTransform.Microsoft.Alpha(Opacity=90)&quot;;
          filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=90);
    -moz-opacity: .9;
         opacity: .9;
  }

  /* Left/right panel styles */
  .slidePanelWidget .slidePanel {
    left: 0;
           -moz-border-radius-topright: 4px;
        -khtml-border-top-right-radius: 4px;
       -webkit-border-top-right-radius: 4px;
               border-top-right-radius: 4px;

        -moz-border-radius-bottomright: 4px;
     -khtml-border-bottom-right-radius: 4px;
    -webkit-border-bottom-right-radius: 4px;
            border-bottom-right-radius: 4px;
  }
  .slidePanelWidget.right .slidePanel {
    left: auto;
    right: 0;

                   -moz-border-radius: 0;
                 -khtml-border-radius: 0;
                -webkit-border-radius: 0;
                        border-radius: 0;

           -moz-border-radius-topleft: 4px;
        -khtml-border-top-left-radius: 4px;
       -webkit-border-top-left-radius: 4px;
               border-top-left-radius: 4px;

        -moz-border-radius-bottomleft: 4px;
     -khtml-border-bottom-left-radius: 4px;
    -webkit-border-bottom-left-radius: 4px;
            border-bottom-left-radius: 4px;
  }&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/4748849360673576080/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/10/plugin-jquery-sliding-panels.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/4748849360673576080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/4748849360673576080'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/10/plugin-jquery-sliding-panels.html' title='Plugin jQuery Sliding Panel'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnY9Xj9BPNnYHTadnqoQe7SdwKuFex6oCBBqsGK7m2pNkVFP5CLWRGTdlLIFcGDU6DE41sqaC6il4-j6wh7ze1YgB7RIR2ifr_flPhmboa1iTbi1Kf2QrXttZm-9C32uU6ww_yLOt7WMU/s72-c/slidePanel.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-1144732637032119703</id><published>2011-10-25T09:00:00.000+02:00</published><updated>2011-10-25T09:00:05.793+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSS"/><title type='text'>Colocación de elementos mediante CSS</title><content type='html'>La entrada de hoy está dedicada a problemas del día a día para la colocación de elementos mediante CSS con recetas sencillas para resolverlos.&lt;br /&gt;
&lt;br /&gt;
En la prehistoria, si se quería un contenido centrado nada era más fácil que poner un &amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;, pero eso, aparte de viejuno, ahora mismo como te pillen haciéndolo, te cortan las manos.&lt;br /&gt;
&lt;blockquote&gt;
&lt;div style=&quot;background-color: white; font-family: verdana, helvetica, arial, sans-serif; font-size: 12px;&quot;&gt;
The &amp;lt;center&amp;gt; tag is supported in all major browsers. However, it is deprecated and should be avoided!&lt;/div&gt;
&lt;/blockquote&gt;
Así que ahora, los más listos habrán dicho que poniendo (con perdón del estyle inline) un &amp;lt;div style=&quot;text-align: center;&quot;&amp;gt;&amp;lt;/div&amp;gt; ya se arregla todo y se quedan tan panchos. Pues sí y no. Si se quiere centrar un texto, va perfecto, pero... y si lo que se quiere centrar es otro contenedor como por ejemplo un div o un span... centraríamos el texto del segundo contenedor, pero no el contenedor en sí.&lt;br /&gt;
&lt;br /&gt;
Pues para este tipo de disyuntivas, vamos a ver algunas recetas copy-paste.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Centrado de texto&lt;/b&gt;&lt;br /&gt;
Tal y como hemos visto, la propiedad CSS text-align:center hace el trabajo necesario.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Centrado de bloques de texto&lt;/b&gt;&lt;br /&gt;
Más que centrado, se le puede llamar márgenes equivalentes, que por ende, produce un efecto de centrado. Ni qué decir tiene, que sin especificar un ancho, no sirve de mucho.&lt;br /&gt;
&lt;pre class=&quot;brush:css&quot;&gt;P.bloqueCentradoDeTexto { margin-left: auto; margin-right: auto; width: 300px;}&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Centrado de imágenes&lt;/b&gt;&lt;br /&gt;
Equivalente al centrado de texto. La única diferencia es que para que funcione, hay que convertir la imagen en un bloque con display:block.&lt;br /&gt;
&lt;pre class=&quot;brush:css&quot;&gt;img.imagenCentrada { display: block; margin-left: auto; margin-right: auto; width: 300px;}&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Centrado vertical&lt;/b&gt;&lt;br /&gt;
Subamos la dificultad un nivel. En las tablas es muy sencillo... existe la propiedad CSS de vertical-align: middle, bueno, pues con otros elementos de bloque es también muy sencillo. El secreto es hacer que el contenedor de dichos elementos se comporte como una celda de tabla para aplicar la propiedad CSS de vertical-align dando además un alto al contendor.&lt;br /&gt;
&lt;pre class=&quot;brush:css&quot;&gt;div.containerDeBloqueCentradoVerticalmente { height: 500px; display: table-cell; vertical-align: middle;}&lt;/pre&gt;
&lt;br /&gt;
&lt;b&gt;Final Boss. Colocando elementos en la esquina inferior derecha.&lt;/b&gt;&lt;br /&gt;
Hay dos maneras, o con un &quot;float: right&quot; que sirve en los casos en los que el contenedor crece con los contenidos, pero si tenemos un contenedor que no solo no crece si no que a lo mejor tiene un alto fijo, no funciona. Para ello, hay una receta sencilla para conseguirlo sin tener que recurrir a código javascript mediante position:absolute. La pega es para variar IE6, que tiene un bug calculando el alto de elementos, pero que se evitar mediante hacks. Para la receta, defino dos clases, una para el contenedor &quot;.contenedor&quot; y otra para el contenido &quot;.&lt;span style=&quot;background-color: transparent;&quot;&gt;alineadoEnLaEsquina&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&quot; (en este caso un hipervínculo).&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:css&quot;&gt;div.contenedor {&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;brush:css&quot;&gt;    position: relative;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;brush:css&quot;&gt;    height: 1%; /* Hack para el IE6 */&lt;/pre&gt;
&lt;pre class=&quot;brush:css&quot;&gt;}&lt;/pre&gt;
&lt;pre class=&quot;brush:css&quot;&gt;a.alineadoEnLaEsquina {&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;brush:css&quot;&gt;    position: absolute;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=&quot;brush:css&quot;&gt;    bottom: 0;&amp;nbsp;&lt;span style=&quot;background-color: transparent;&quot;&gt;/* en vez de 0 y 0 se puede poner otra cantidad */&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=&quot;brush:css&quot;&gt;    right: 0;  /* para simular el margen respecto a la esquina */&lt;/pre&gt;
&lt;pre class=&quot;brush:css&quot;&gt;}&lt;/pre&gt;
&lt;br /&gt;
A disfrutarlo!.</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/1144732637032119703/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/10/colocacion-de-elementos-mediante-css.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/1144732637032119703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/1144732637032119703'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/10/colocacion-de-elementos-mediante-css.html' title='Colocación de elementos mediante CSS'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-5115728333514698475</id><published>2011-10-24T09:00:00.000+02:00</published><updated>2011-10-24T10:20:37.094+02:00</updated><title type='text'>Quién me lee?</title><content type='html'>La verdad es que para ser éste un blog que nació únicamente como memoria digital de las cosillas que voy descubriendo por la web, viendo las estadíasticas me he dado cuenta de tres cosas muy curiosas...&lt;br /&gt;
&lt;br /&gt;
La primera, es que mientras menos escribo más gente me lee... Cuando he estado publicando una o más entradas diarias no llegaba a 100 visitas al mes (y he contado a mi madre... dos veces). Sin embargo, ahora que me he tomado el verano de relax, en casi dos-tres meses sin escribir una línea, tengo unas 1500 visitas mensuales y creciendo exponencialmente. Curioso, no?&lt;br /&gt;
&lt;br /&gt;
La segunda, es que los que me lean (si es que hay alguien) son personas muy tímidas. 0 comentarios en total. Al menos tengo que administrar pocos comentarios soeces y descalificaciones personales. Eso es de agradecer.&lt;br /&gt;
&lt;br /&gt;
Lo tercero es la tecnología de los navegadores de la gente que me visita. Cuanto menos sorprendente. Os pego un extracto de las estadísticas:&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;table border=&quot;2&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Chrome&lt;/td&gt;&lt;td&gt;29%&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Google Desktop&lt;/td&gt;&lt;td&gt;28%&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Firefox&lt;/td&gt;&lt;td&gt;24%&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Internet Explorer&lt;/td&gt;&lt;td&gt;10%&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Safari&lt;/td&gt;&lt;td&gt;5%&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Opera&lt;/td&gt;&lt;td&gt;1%&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Mobile Safari&lt;/td&gt;&lt;td&gt;&amp;lt;1%&lt;/td&gt;&lt;td&gt;Hola Curro!&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;chromeframe&lt;/td&gt;&lt;td&gt;&amp;lt;1%&lt;/td&gt;&lt;td&gt;Todavía hay alguien (5) que lo usa! bien!&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ThunderBrowse&lt;/td&gt;&lt;td&gt;&amp;lt;1%&lt;/td&gt;&lt;td&gt;Y éso qué es?&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Mobile&lt;/td&gt;&lt;td&gt;&amp;lt;1%&lt;/td&gt;&lt;td&gt;1 visita. Ese soy yo :D&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;br /&gt;
Es decir, que el navegador más usado por gente dedicada a aprender cosas sobre la web es el Chrome, que si lo juntamos con el Google Desktop, que supongo que es el Reader de Google, suma la friolera del 57% de las visitas provenientes de productos de Google!!!.&lt;br /&gt;
&lt;br /&gt;
Luego viene el firefox y solamente un 10% de IE (no voy a hacer sangre desglosando por versiones :P)&lt;br /&gt;
&lt;br /&gt;
En fin... si trabajara en los informativos de la tele, diría que los que usan Chrome son más listos, audaces y ávidos de conocimiento, pero como no es así, simplemente diré que son más y punto, por ahí no me pilláis, pillines!&lt;br /&gt;
&lt;br /&gt;
Bueno, y esta cutre-entrada servirá para advertiros que la semana que viene postearé varios (&amp;gt;1) plugins de jQuery que he hecho. Os van a gustar. Estad atentos, y va por vosotros, esos casi 1500 ;)&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/5115728333514698475/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/10/quien-me-lee.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/5115728333514698475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/5115728333514698475'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/10/quien-me-lee.html' title='Quién me lee?'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-4682285554347109471</id><published>2011-10-21T14:37:00.000+02:00</published><updated>2011-10-21T14:37:46.172+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSS3"/><title type='text'>Copiando a Google, sí, ¿y?. Flexbox y overlay/dialog.</title><content type='html'>Retomemos viejas costumbres. Llevaba algún tiempo sin publicar nada básicamente porque llegaron las vacaciones y por pereza, sinceridad ante todo. Pero hay que luchar contra la apatía, así que para abrir boca, os voy a poner un cachito de código copiado vilmente desde Chrome aplicando las últimas tecnologías y ese toque minimalista de Google, pero al alcance de todos los navegadores (modernos).

Concretamente, os hablo del combo overlay/caja de diálogo que se usa en la configuración de Chrome pero fácilmente aplicable a cualquier web. A continuación, una captura.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9PQFh3_LDI_fJy0RS0JhyCbNrqJe9vv10hwgO3rqGdRgcIwCNPcDLTN5D9CWUvRTcRaav2htomiuyK9Lh7wHrrOIfEkrUsYcKMXJtrFBI2MHYCq7-_VRbCETBDW-11x5gFCrL04PRP0E/s1600/ChromeDialog.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;183&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9PQFh3_LDI_fJy0RS0JhyCbNrqJe9vv10hwgO3rqGdRgcIwCNPcDLTN5D9CWUvRTcRaav2htomiuyK9Lh7wHrrOIfEkrUsYcKMXJtrFBI2MHYCq7-_VRbCETBDW-11x5gFCrL04PRP0E/s320/ChromeDialog.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Las tecnologías principales que se han usado son el juego de propiedades CSS3 denominado flexbox que permite definir cajas de elementos distribuyendolas tanto a ellas como a sus contenidos dentro de la página y &amp;nbsp;varias propiedades visuales de CSS3 junto con sus variantes según el navegador, puestas en el orden correcto. De regalo, un clon de los botones de Chrome también, que se ven muy bonitos.&lt;br /&gt;
&lt;br /&gt;
Para más información sobre las propiedades de flexbox podéis ver un magnífico artículo en &lt;a href=&quot;http://www.html5rocks.com/en/tutorials/flexbox/quick/&quot;&gt;HTMLRocks&lt;/a&gt;. Es tontería explicarlo de nuevo aquí porque es una página muy trabajada con muchos ejemplos y que hasta detecta si el navegador usado para verla es capaz de mostrar correctamente todos los ejemplos, así que no os pongáis a verla con el IE6, que os veo y luego me venís llorando!.&lt;br /&gt;
&lt;br /&gt;
Para ver el código completo, en mi &lt;a href=&quot;http://jsfiddle.net/jrdiaz/xnHpQ/&quot;&gt;jsFiddle &lt;/a&gt;como es habitual.&lt;br /&gt;
&lt;iframe src=&quot;http://jsfiddle.net/jrdiaz/xnHpQ/embedded/result,html,css&quot; style=&quot;height: 300px; width: 100%;&quot;&gt;&lt;/iframe&gt;
&lt;br /&gt;
&lt;br /&gt;
El ejemplo se compone de dos partes. Por un lado una estructura muy sencilla en HTML&lt;br /&gt;
&lt;pre class=&quot;brush:html&quot;&gt;&amp;lt;!-- Overlay/dialog --&amp;gt;
&amp;lt;div id=&quot;overlay&quot; class=&quot;overlay&quot;&amp;gt;
    &amp;lt;div id=&quot;myDialog&quot; class=&quot;dialog&quot;&amp;gt;

        &amp;lt;!-- Título del diálogo --&amp;gt;
        &amp;lt;h1&amp;gt;Título del Diálogo&amp;lt;/h1&amp;gt;

        &amp;lt;!-- Cuerpo del diálogo --&amp;gt;
        &amp;lt;div class=&quot;dialog-area&quot;&amp;gt;
            &amp;lt;p&amp;gt;CUERPO&amp;lt;/p&amp;gt;
        &amp;lt;/div

        &amp;lt;!-- Pie del diálogo --&amp;gt;
        &amp;lt;div class=&quot;dialog-footer&quot;&amp;gt;
            &amp;lt;div class=&quot;extensible&quot;&amp;gt;PIE con botones a la derecha sin float&amp;lt;/div&amp;gt;
            &amp;lt;input type=&quot;button&quot; value=&quot;Botón1&quot;/&amp;gt;
            &amp;lt;input type=&quot;button&quot; value=&quot;Botón2&quot;/&amp;gt;
        &amp;lt;/div&amp;gt;

    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
Y por el otro, un CSS algo más complejo (CSS3, por supuesto). Los comentarios además de ayudar a identificar los estilos, dan información sobre para qué y cómo se usan.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:css&quot;&gt;/* ================================================================================ */
/* Sample styles */
html {
    font-family: arial;
}

/* Sample dialog styles */
#myDialog {
    background-color: white;
    margin-bottom: 6px;
    margin-top: 6px;
    width: 500px;
}


/* ================================================================================ */
/* Overlay/Dialog styles */
.overlay {
    -webkit-transition: 0.25s opacity;
       -moz-transition: 0.25s opacity;
        -ms-transition: 0.25s opacity;
         -o-transition: 0.25s opacity;
            transition: 0.25s opacity;  

    background: -webkit-radial-gradient(rgba(127, 127, 127, 0.5), rgba(127, 127, 127, 0.5) 35%, rgba(0, 0, 0, 0.7));
    background:    -moz-radial-gradient(rgba(127, 127, 127, 0.5), rgba(127, 127, 127, 0.5) 35%, rgba(0, 0, 0, 0.7));
    background:      -o-radial-gradient(rgba(127, 127, 127, 0.5), rgba(127, 127, 127, 0.5) 35%, rgba(0, 0, 0, 0.7));
    background:     -ms-radial-gradient(rgba(127, 127, 127, 0.5), rgba(127, 127, 127, 0.5) 35%, rgba(0, 0, 0, 0.7));
    background:         radial-gradient(rgba(127, 127, 127, 0.5), rgba(127, 127, 127, 0.5) 35%, rgba(0, 0, 0, 0.7));
    
    position: fixed;
    left: 0; top: 0; right: 0; bottom: 0;
    padding: 20px; padding-bottom: 130px;
    z-index: 10;
}


.overlay .dialog {
    -webkit-user-select: none;
       -moz-user-select: none;

    -webkit-box-shadow: 0px 5px 80px #505050;
       -moz-box-shadow: 0px 5px 80px #505050;
         -o-box-shadow: 0px 5px 80px #505050;
        -ms-box-shadow: 0px 5px 80px #505050;
            box-shadow: 0px 5px 80px #505050;

    background: white;
    border: 1px solid #BCC1D0;

    -webkit-border-radius: 2px;
       -moz-border-radius: 2px;
     -khtml-border-radius: 2px;
            border-radius: 2px;

    position: relative;
    min-width: 400px;
    padding: 0;
}


/* Dialog heading */
.overlay .dialog h1 {
    -webkit-padding-end: 24px; /* Specifies the space between an element&#39;s left or right border and its contents, depending on the writing direction */
       -moz-padding-end: 24px;

    -webkit-user-select: none;
       -moz-user-select: none;

    background: -webkit-linear-gradient(white, #F8F8F8);
    background:    -moz-linear-gradient(white, #F8F8F8);
    background:      -o-linear-gradient(white, #F8F8F8);
    background:         linear-gradient(white, #F8F8F8);

    border-bottom: 1px solid rgba(188, 193, 208, .5);
    padding: 10px 15px 8px 15px;
    margin: 0;

    font-size: 105%;
    font-weight: bold;
    color: #53637D;
    text-shadow: white 0 1px 2px;
}


/* Dialog area */
.overlay .dialog .dialog-area {
    -webkit-user-select: none;
       -moz-user-select: none;

    padding: 10px 15px;
}


/* Dialog footer */
.overlay .dialog .dialog-footer {

    border-top: 1px solid rgba(188, 193, 208, .5);
    padding: 12px;
}


/* ================================================================================ */
/* Flexible box model */
/* http://www.html5rocks.com/en/tutorials/flexbox/quick/ */
.overlay {
    display: -webkit-box;            /* Enables flexible box model */
    -webkit-box-orient: horizontal; /* How should the box&#39;s children be aligned */
      -webkit-box-pack: center;    /* Sets the alignment of the box along the box-orient axis. . So if box-orient is horizontal it will chose how the box&#39;s children are aligned horizontally, and vice-versa. */
     -webkit-box-align: center;   /* Basically box-pack&#39;s brother property. Sets how the box&#39;s children are aligned in the box. If the orientation is horizontal it will decide the alignment vertically and vice-versa */

    display: -moz-box;
    -moz-box-orient: horizontal;
      -moz-box-pack: center;
     -moz-box-align: center;

    display: box;
    box-orient: horizontal;
      box-pack: center;
     box-align: center;
}

.overlay .dialog .dialog-footer {
    display: -webkit-box;
    -webkit-box-orient: horizontal;
      -webkit-box-pack: end;
     -webkit-box-align: center;

    display: -moz-box;
    -moz-box-orient: horizontal;
      -moz-box-pack: end;
     -moz-box-align: center;

    display: box;
    box-orient: horizontal;
      box-pack: end;
     box-align: center;
}

.extensible {
    -webkit-box-flex: 1;  /* Float value. Extensible up to 1 (or value) times its width (or height depending on parent&#39;s orientation) */
       -moz-box-flex: 1;
            box-flex: 1;
}


/* ================================================================================ */
/* Chrome buttons */
button, input[type=&quot;button&quot;], input[type=&quot;submit&quot;] {
    -webkit-border-radius: 2px;
       -moz-border-radius: 2px;
     -khtml-border-radius: 2px;
            border-radius: 2px;

    -webkit-box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1);

    -webkit-user-select: none;
       -moz-user-select: none;

    background: -webkit-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);
    background:    -moz-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);
    background:      -o-linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);
    background:         linear-gradient(#FAFAFA, #F4F4F4 40%, #E5E5E5);

    border: 1px solid #AAA;
    color: #444;
    font-size: inherit;
    margin-bottom: 0px;
    min-width: 4em;
    padding: 3px 12px 3px 12px;
}&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/4682285554347109471/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/10/copiando-google-si-y-flexbox-y.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/4682285554347109471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/4682285554347109471'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/10/copiando-google-si-y-flexbox-y.html' title='Copiando a Google, sí, ¿y?. Flexbox y overlay/dialog.'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9PQFh3_LDI_fJy0RS0JhyCbNrqJe9vv10hwgO3rqGdRgcIwCNPcDLTN5D9CWUvRTcRaav2htomiuyK9Lh7wHrrOIfEkrUsYcKMXJtrFBI2MHYCq7-_VRbCETBDW-11x5gFCrL04PRP0E/s72-c/ChromeDialog.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-7115781304377286774</id><published>2011-07-29T14:10:00.000+02:00</published><updated>2011-07-29T14:10:59.895+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="php"/><title type='text'>Lectura de los ficheros de un directorio con ordenación en PHP</title><content type='html'>Un apunte rápido para hoy.&lt;br /&gt;
&lt;br /&gt;
Si necesitáis leer los nombres de los ficheros de un directorio en función de un filtrado arbitrario y recorrerlos en orden de fecha de creación, se puede hacer un bucle muy sencillo usando la maravillosa &lt;a href=&quot;http://php.net/manual/function.glob.php&quot;&gt;función glob&lt;/a&gt; que combinada con la &lt;a href=&quot;http://www.php.net/manual/function.usort.php&quot;&gt;función usort&lt;/a&gt; que permite especificar una función para ordenar, al final tendremos un array ordenado según el criterio definido.&lt;br /&gt;
&lt;br /&gt;
Al turrón!&lt;br /&gt;
&lt;pre class=&quot;brush:php&quot;&gt;$ruta = &quot;directorio/*.*&quot;; // Cambiad la máscara de ficheros por la que deseéis
$arr = glob( $ruta ); 
usort( $arr, create_function( &#39;$a,$b&#39;, &#39;return filemtime($a) - filemtime($b);&#39; ) );
&lt;/pre&gt;&lt;br /&gt;
Rápido y sencillo, como debe ser.</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/7115781304377286774/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/07/lectura-de-los-ficheros-de-un.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/7115781304377286774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/7115781304377286774'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/07/lectura-de-los-ficheros-de-un.html' title='Lectura de los ficheros de un directorio con ordenación en PHP'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-4519210986189849285</id><published>2011-07-27T12:52:00.005+02:00</published><updated>2014-03-24T12:47:45.849+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><title type='text'>jQuery FRoll plugin - Preview de vídeos sin necesidad de cargarlos</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;float: left; margin-right: 1em; text-align: left;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;data:image/png;base64,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&quot; style=&quot;margin-left: auto; margin-right: auto;&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
La carga de un objeto de tipo vídeo es una operación realmente costosa y  pesada respecto a rendimiento de una página. Máxime si estamos haciendo  una galería de vídeos donde se muestran varios vídeos a la vez.&lt;br /&gt;
&lt;br /&gt;
Una primera aproximación para aligerar esa carga es lo que se ha hecho toda la vida mediante la utilización de thumbnails de los vídeos, pero yo al menos siempre me quedo con la sensación de que quiero algo más... un triste fotograma de un vídeo no me saca de pobre y más si es un fotograma automatizado que puede que coincida con una pantalla en negro.&lt;br /&gt;
&lt;br /&gt;
Pero... y si tuviéramos varios fotogramas de un mismo vídeo. Se podrían poner uno a continuación del otro para hacer una secuencia, pero es algo que se antoja &quot;artificial&quot;... lo ideal sería que dichos fotogramas se reprodujeran en sucesión antes de la carga real del vídeo de modo que solo se muestre el vídeo en sí bajo petición por parte del usuario.&lt;br /&gt;
&lt;br /&gt;
Ahí es donde entra FRoll, un plugin 100% hecho por mí, haciéndonos la vida un poco más sencilla y más si el vídeo en cuestión está alojado en youtube, que hace el trabajo de sacar fotogramas de los vídeos por nosotros (sólo 3, pero qué le vamos a hacer).&lt;br /&gt;
&lt;br /&gt;
Una vez incluido este plugin, tendremos disponible el método .froll() que podremos llamar sobre las imágenes que deseemos convertir en previsualizaciones de vídeos. El nombre de los fotogramas se deriva a partir del nombre de la imagen original mediante sencillas reglas de transformación y ya se proporcionan reglas para los escenarios más comunes que son el de imágenes alojadas en youtube, thumbnail en local y fotogramas en remoto en youtube e imagen + fotogramas en local. Usando dichos ejemplos es fácil adaptar el comportamiento a las necesidades de cada uno.&lt;br /&gt;
&lt;br /&gt;
También soporta el la delegación del evento de click para permitirnos completar acciones sobre la imagen original y que el uso del plugin sea totalmente transparente tanto para el usuario como para el desarrollador.&lt;br /&gt;
&lt;br /&gt;
Para ver el plugin en acción, como es costumbre, podéis hacerlo en mi fiddle o en la página del plugin en el &lt;a href=&quot;http://plugins.jquery.com/project/froll&quot;&gt;sitio de jQuery&lt;/a&gt;.&lt;br /&gt;
&lt;iframe src=&quot;http://jsfiddle.net/jrdiaz/ZDLeE/embedded/result,js,css,html/&quot; style=&quot;height: 300px; width: 100%;&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Y ahora, el código del plugin, que está comentado hasta el aburrimiento para que no se pierda nadie, y ya sabéis, si lo usáis, mejorais, arregláis, hacédmelo saber ;)&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;/**
 * jquery.froll-0.1.js - Fancy Image Roll
 * ==========================================================
 * (C) 2011 José Ramón Díaz - jrdiazweb@gmail.com
 *
 * http://3nibbles.blogspot.com/2011/07/plugin-jquery-sliding-buttons.html
 * http://plugins.jquery.com/project/froll
 *
 * FRoll is a jQuery plugin to simplify the task of providing a simple and
 * efficient way to expand the image information of a picture using a sequence
 * of images.
 *
 * The direct use of this plugin is to provide a preview of a youtube video
 * using the Google API. In that case it presents a sucession of three
 * different moments of the video in a smooth sucession when mouse enters into
 * the image.
 *
 * Everything is self-contained. No need of extra CSS or complex controls,
 * just call the method over the image and you are ready.
 *
 * INSTANTIATION
 * Just call the &quot;.froll()&quot; method over the images selector.
 *
 *     $(&#39;.videoCaptionImg&#39;).froll( [ options_object ] );
 *
 * OPTIONS
 *     - transform  $.froll.youtube  Array that defines [0] as the regex to apply
 *                                   to src and [1] as the resulting string with
 *                                   {number} placeholder for the animation images.
 *     - frames     [1, 2, 3],       Array with the {number} of each frame of the animation
 *     - width      null,            Width of the animation frames.  Null = automatic
 *     - height     null,            Height of the animation frames. Null = automatic
 *     - speed      750,             Fade animation speed
 *     - time       1500,            Time between frames
 *     - click      function(taget)  Click callback function. Defaults to trigger click
 *                                   event over the container &amp;lt;a&amp;gt; of the img.
 *
 * PUBLIC API
 *     -  $.froll.stop()    Stops current animation and hides the preview
 *
 * HELPER CONSTANTS
 *     $.froll.youtube       Transform array that converts origin src stored in youtube
 *                           (http://img.youtube.com/vi/&amp;lt;video_ID&amp;gt;/0.jpg) into youtube previews.
 *     $.froll.youtubeLocal  Transform array that converts local stored captions with name the
 *                           id of the video, into youtube previews.
 *     $.froll.local         Transform array that converts local stored captions into local
 *                           stored previews with the same name but ended with &quot;_&amp;lt;number&amp;gt;&quot;
 *                           in the same directory than caption.
 *
 * CSS CLASSES
 *     - Container: #froll-overlay
 *     - Frames:    .froll-frame
 *
 * Legal stuff
 *     You are free to use this code, but you must give credit and/or keep header intact.
 *     Please, tell me if you find it useful. An email will be enough.
 *     If you enhance this code or correct a bug, please, tell me.
 */
(function( $ ) {

    ///////////////////////////////////////////////////////////////////////////////
    // Private members
    ///////////////////////////////////////////////////////////////////////////////

    var busy      = false,
        overlay   = null,
        frames    = [],
        frame     = -1,
        lframe    = 0,
        options   = {},
        target    = null,
        src       = &quot;&quot;,
        tickTimer = null,
        imgPreloader = new Image(),
        //isIE6 = $.browser.msie &amp;amp;&amp;amp; $.browser.version &amp;lt; 7 &amp;amp;&amp;amp; !window.XMLHttpRequest,

        // ========================================================================
        // Starts the animation
        _start = function() {
            _stop(); // Hides current animation (if any)

            if( !target.attr(&#39;src&#39;) ) return; // No image src

            // Gets the options and src transform
            options = target.data(&#39;froll&#39;);
            src = target.attr(&#39;src&#39;).replace( options.transform[0], options.transform[1] );

            // Moves the overlay to the target position
            var pos = _getPos(target);
            overlay.css({
                &#39;position&#39;  : &#39;absolute&#39;,
                &#39;left&#39;      : pos.left,
                &#39;top&#39;       : pos.top,
                &#39;width&#39;     : pos.width,
                &#39;height&#39;    : pos.height,
                &#39;zIndex&#39;    : 9999,
                &#39;background&#39;: &#39;transparent&#39;
                //,&#39;border&#39;: &#39;1px solid red&#39;
            }).show();

            // ========================================================================
            // Starts the frames preload chain loading first frame
            lframe = 0; // Frame being loaded
            if(!imgPreloader) imgPreloader = new Image();
            imgPreloader.onerror = function() { _error(); };
            imgPreloader.onload  = _preloadCompleted;

            imgPreloader.src = src.replace( /\{number\}/, &quot;&quot;+options.frames[lframe] );
            if(imgPreloader.complete) _preloadCompleted(); // Cached images don&#39;t fire onload events
        },

        // ========================================================================
        // Gracefully stops the animation
        _stop = function() {
            clearInterval(tickTimer); // Disables the timer
            imgPreloader.onerror = imgPreloader.onload = null;
            if( target &amp;amp;&amp;amp; overlay.is( &#39;:visible&#39; ) )
                overlay.hide().empty();   // Hides the overlay and deletes the frames

            frames = [];
            frame  = -1;
            //target = options = null;
            busy   = false;
        },

        // ========================================================================
        // Frame image load error
        _error = function() {
            alert( &quot;Error loading image at &quot; + src );
        },

        // ========================================================================
        // Function called on animation click
        _click = function(e) {
            if( typeof options.click !== &#39;undefined&#39; )
                options.click(target);
        },

        // ========================================================================
        // Image preload complete event
        _preloadCompleted = function() {
            // Gets default image dimensions
            if( !options.width )  options.width  = overlay.width();  //imgPreloader.width;
            if( !options.height ) options.height = overlay.height(); //imgPreloader.height;

            // Creates frame ima
            $(&quot;&amp;lt;img /&amp;gt;&quot;).attr({
                &#39;id&#39;   : &#39;froll-frame-&#39; + lframe,
                &#39;class&#39;: &#39;froll-frame&#39;,
                &#39;src&#39;  : imgPreloader.src
            }).css({
                &#39;position&#39;  : &#39;absolute&#39;,
                &#39;display&#39;   : &#39;block&#39;,
                &#39;left&#39;      : &#39;0px&#39;,
                &#39;top&#39;       : &#39;0px&#39;,
                &#39;width&#39;     : options.width+&#39;px&#39;,
                &#39;height&#39;    : options.height+&#39;px&#39;,
                &#39;zIndex&#39;    : lframe+1,
                &#39;opacity&#39;   : 0
                //,&#39;visibility&#39;: &#39;hidden&#39;
            }).appendTo( overlay );

            // Shows first frame
            if( lframe == 0 )
            {
                _tick();
                tickTimer = setInterval( _tick, options.time );
            }

            // Preloads next frame
            frames[ lframe++ ] = 1; // Marks frame as done
            if( lframe &amp;lt; options.frames.length )
            {
                // Intermediate frame
                imgPreloader.src = src.replace( /\{number\}/i, options.frames[lframe] );
                if(imgPreloader.complete) _preloadCompleted(); // Cached images don&#39;t fire onload events
            }
            else
                imgPreloader.onerror = imgPreloader.onload = null; // Last frame
        },

        // ========================================================================
        // Shows next frame
        _tick = function() {

            var l = options.frames.length - 1;
            var children = overlay.children();

            // Animates next frame
            if( frame == -1 )
            {
                // First run
                children.eq( 0 ).css(&#39;opacity&#39;, 0).stop( true, true ).animate( { &#39;opacity&#39;: 1 }, options.speed );
                frame = 0;
            }
            else if( frame == 0 )
            {
                // First frame (after a full run)
                for(var i = 1; i &amp;lt; l; i++) children.eq( i ).css( &#39;opacity&#39; , 0); // Hides all but first and last frames
                children.eq( 0 ).css( &#39;opacity&#39;, 1 ).show(); // Shows first frame (bellow last frame)
                children.eq( l ).stop( true, true ).animate( { &#39;opacity&#39;: 0 }, options.speed );
            }
            else if( frame &amp;lt;= l )
            {
                // Intermediate frame
                var next = children.eq( frame );
                if(next)
                    next.css(&#39;opacity&#39;, 0).stop( true, true ).animate( { &#39;opacity&#39;: 1 }, options.speed );
            }
            else
            {
                // The last frame. Resets animation to show first frame and hide the last one
                children.eq( 0 ).css( &#39;opacity&#39;, 1 );
                children.eq( l ).stop( true, true ).animate( { &#39;opacity&#39;: 0 }, options.speed );
            }
            frame = (frame+1) % (l+1);
        },

        // ========================================================================
        // Helper function to get the exact obj position in the page
        _getPos = function(obj) {

            var pos = obj.offset();

            pos.top   += parseInt( obj.css( &#39;paddingTop&#39; )       , 10 ) || 0;
            pos.left  += parseInt( obj.css( &#39;paddingLeft&#39; )      , 10 ) || 0;

            pos.top   += parseInt( obj.css( &#39;border-top-width&#39; ) , 10 ) || 0;
            pos.left  += parseInt( obj.css( &#39;border-left-width&#39; ), 10 ) || 0;

            pos.width  = obj.width();
            pos.height = obj.height();

            return pos;
        };


    ///////////////////////////////////////////////////////////////////////////////
    // Public members
    ///////////////////////////////////////////////////////////////////////////////

    // ========================================================================
    // Instantiation. Called on every object of the supplied selector
    $.fn.froll = function( obj ) {
        if (!$(this).length) {
            return this;
        }

        if( $(this).data( &#39;froll&#39; ) )
        {
            // Object already initialized. Starts the animation over it simulating a click
            if($(this).click) $(this).click();
        }
        else
        {
            // Object not initialized. Sets data and binds events
            $(this)
                .data( &#39;froll&#39;, $.extend( $.fn.froll.defaults, obj ) )
                .unbind( &#39;mouseenter&#39; )
                .bind( &#39;mouseenter&#39;, function(e) {
                    var self = $(this);
                    e.preventDefault();

                    if (busy &amp;amp;&amp;amp; self !== target) _stop(); // Stops current animation
                    busy = true;
                    //var rel = self.attr(&#39;rel&#39;) || &#39;&#39;;
                    target = self;

                    _start(); // Starts the animation over target element
                    return;
                });
        }

        return this;
    };


    // ========================================================================
    // Container class for the public interface
    $.froll = function(obj) {  };

    // ========================================================================
    // Inits the components needed for the animation overlay
    $.froll.init = function() {
        if ( $( &#39;#froll-overlay&#39; ).length ) {
            return;
        }

        // Components
        $(&#39;body&#39;).append(
            overlay    = $( &#39;&amp;lt;div id=&quot;froll-overlay&quot;&amp;gt;&amp;lt;/div&amp;gt;&#39; )
        );

        // Animation controls events
        overlay.mouseleave( _stop );
        overlay.click( _click );

        return this;
    };

    // ========================================================================
    // Stops current animation and hides overlay
    $.froll.stop = function() { _stop(); };

    // ========================================================================
    // Sample transformation arrays
    $.froll.youtube      = [ /.*\/(.*)\/0\.(jpg|gif|png|bmp|jpeg)(.*)?/i, &#39;http://img.youtube.com/vi/$1/{number}.$2&#39; ]; // Caption image is located in youtube (http://img.youtube.com/vi/&amp;lt;video_ID&amp;gt;/0.jpg)
    $.froll.youtubeLocal = [ /.*\/(.*)\.(jpg|gif|png|bmp|jpeg)(.*)?/i   , &#39;http://img.youtube.com/vi/$1/{number}.$2&#39; ]; // Caption image is located elsewhere but caption image name is the youtube video_ID
    $.froll.local        = [ /(.*)\/(.*)\.(jpg|gif|png|bmp|jpeg)(.*)?/i , &#39;$1/$2_{number}.$3$4&#39; ];                      // Caption image is located elsewhere and frames are in format &quot;originalImage_&amp;lt;frame&amp;gt;.jpg&quot; in the same directory

    // ========================================================================
    // Froll options defaults
    $.fn.froll.defaults = {
        transform  : $.froll.youtube, // Array that defines [0] as the regex to apply to src and [1] as the resulting string with {number} placeholder for the animation images
        frames     : [1, 2, 3],       // Array with the {number} of each frame of the animation
        width      : null,            // Width of the animation frames.  Null = automatic frame image width
        height     : null,            // Height of the animation frames. Null = automatic frame image height
        speed      : 750,             // Fade animation speed
        time       : 1500,            // Time between frames

        click      : function(taget) { $(target).closest(&#39;a&#39;).click(); } // Click callback function
    };

    // ========================================================================
    // Inits the animation overlay on DOM ready
    $(document).ready(function() {
        $.froll.init();
    });

})( jQuery );&lt;/pre&gt;
&lt;br /&gt;
Y ahora, la versión minimizada, que se queda en 2.5Kb (aún menos gzipeada, claro)&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;/**
 * jquery.froll-0.1.js - Fancy Image Roll - (C) 2011 José Ramón Díaz - jrdiazweb@gmail.com
 * http://3nibbles.blogspot.com/2011/07/jquery-froll-plugin-preview-de-videos.html
 * http://plugins.jquery.com/project/froll
 * You are free to use this code, but you must give credit and/or keep header intact.
 */
(function(a){var k=!1,d=null,g=-1,h=0,b={},e=null,i=&quot;&quot;,m=null,c=new Image,p=function(){j();if(e.attr(&quot;src&quot;)){b=e.data(&quot;froll&quot;);i=e.attr(&quot;src&quot;).replace(b.transform[0],b.transform[1]);var a=o(e);d.css({position:&quot;absolute&quot;,left:a.left,top:a.top,width:a.width,height:a.height,zIndex:9999,background:&quot;transparent&quot;}).show();h=0;c||(c=new Image);c.onerror=function(){alert(&quot;Error loading image at &quot;+i)};c.onload=l;c.src=i.replace(/\{number\}/,&quot;&quot;+b.frames[h]);c.complete&amp;amp;&amp;amp;l()}},j=function(){clearInterval(m);c.onerror= c.onload=null;e&amp;amp;&amp;amp;d.is(&quot;:visible&quot;)&amp;amp;&amp;amp;d.hide().empty();g=-1;k=!1},q=function(){typeof b.click!==&quot;undefined&quot;&amp;amp;&amp;amp;b.click(e)},l=function(){if(!b.width)b.width=d.width();if(!b.height)b.height=d.height();a(&quot;&amp;lt;img /&amp;gt;&quot;).attr({id:&quot;froll-frame-&quot;+h,&quot;class&quot;:&quot;froll-frame&quot;,src:c.src}).css({position:&quot;absolute&quot;,display:&quot;block&quot;,left:&quot;0px&quot;,top:&quot;0px&quot;,width:b.width+&quot;px&quot;,height:b.height+&quot;px&quot;,zIndex:h+1,opacity:0}).appendTo(d);h==0&amp;amp;&amp;amp;(n(),m=setInterval(n,b.time));h++;h&amp;lt;b.frames.length?(c.src=i.replace(/\{number\}/i,b.frames[h]), c.complete&amp;amp;&amp;amp;l()):c.onerror=c.onload=null},n=function(){var a=b.frames.length-1,f=d.children();if(g==-1)f.eq(0).css(&quot;opacity&quot;,0).animate({opacity:1},b.speed),g=0;else if(g==0){for(var c=1;c&amp;lt;a;c++)f.eq(c).css(&quot;opacity&quot;,0);f.eq(0).css(&quot;opacity&quot;,1).show();f.eq(a).animate({opacity:0},b.speed)}else g&amp;lt;=a?(f=f.eq(g))&amp;amp;&amp;amp;f.css(&quot;opacity&quot;,0).animate({opacity:1},b.speed):(f.eq(0).css(&quot;opacity&quot;,1),f.eq(a).animate({opacity:0},b.speed));g=(g+1)%(a+1)},o=function(a){var b=a.offset();b.top+=parseInt(a.css(&quot;paddingTop&quot;), 10)||0;b.left+=parseInt(a.css(&quot;paddingLeft&quot;),10)||0;b.top+=parseInt(a.css(&quot;border-top-width&quot;),10)||0;b.left+=parseInt(a.css(&quot;border-left-width&quot;),10)||0;b.width=a.width();b.height=a.height();return b};a.fn.froll=function(b){if(!a(this).length)return this;a(this).data(&quot;froll&quot;)?a(this).click&amp;amp;&amp;amp;a(this).click():a(this).data(&quot;froll&quot;,a.extend(a.fn.froll.defaults,b)).unbind(&quot;mouseenter&quot;).bind(&quot;mouseenter&quot;,function(b){var c=a(this);b.preventDefault();k&amp;amp;&amp;amp;c!==e&amp;amp;&amp;amp;j();k=!0;e=c;p()});return this};a.froll=function(){}; a.froll.init=function(){if(!a(&quot;#froll-overlay&quot;).length)return a(&quot;body&quot;).append(d=a(&#39;&amp;lt;div id=&quot;froll-overlay&quot;&amp;gt;&amp;lt;/div&amp;gt;&#39;)),d.mouseleave(j),d.click(q),this};a.froll.stop=function(){j()};a.froll.youtube=[/.*\/(.*)\/0\.(jpg|gif|png|bmp|jpeg)(.*)?/i,&quot;http://img.youtube.com/vi/$1/{number}.$2&quot;];a.froll.youtubeLocal=[/.*\/(.*)\.(jpg|gif|png|bmp|jpeg)(.*)?/i,&quot;http://img.youtube.com/vi/$1/{number}.$2&quot;];a.froll.local=[/(.*)\/(.*)\.(jpg|gif|png|bmp|jpeg)(.*)?/i,&quot;$1/$2_{number}.$3$4&quot;];a.fn.froll.defaults={transform:a.froll.youtube, frames:[1,2,3],width:null,height:null,speed:750,time:1500,click:function(){a(e).closest(&quot;a&quot;).click()}};a(document).ready(function(){a.froll.init()})})(jQuery);&lt;/pre&gt;
&lt;pre class=&quot;brush:js&quot;&gt;
&lt;/pre&gt;
&lt;pre class=&quot;brush:js&quot;&gt;Actualización. Añadida la clase CSS para cambiar el cursor a tipo &quot;mano&quot; al hacer hover. Ver en el jsfiddle.&lt;/pre&gt;
</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/4519210986189849285/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/07/jquery-froll-plugin-preview-de-videos.html#comment-form' title='7 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/4519210986189849285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/4519210986189849285'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/07/jquery-froll-plugin-preview-de-videos.html' title='jQuery FRoll plugin - Preview de vídeos sin necesidad de cargarlos'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-1438580444042958447</id><published>2011-07-21T09:44:00.000+02:00</published><updated>2011-07-21T09:44:34.943+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><title type='text'>Detectar la parte inferior de la página con Javascript</title><content type='html'>Cómo saber si el usuario ha hecho scroll hasta el final de la página? (así de pronto se me ocurre que puede ser útil para EULAs y compañía).&lt;br /&gt;
&lt;br /&gt;
Pues fácil, con este fragmento de código jQuery (que recomiendo se añada al final de la página o en el evento de domready)&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;
 $(window).scroll(function() {
 
  if(document.height == window.pageYOffset + window.innerHeight)
  {
   // the bottom of the document has been hit.
  }
 });
&lt;/script&gt;&lt;/pre&gt;&lt;br /&gt;
Un código HTML de ejemplo sería el siguiente:&lt;br /&gt;
&lt;pre class=&quot;brush:html&quot;&gt;&amp;lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&amp;lt;html&gt;
 &amp;lt;head&gt;
  &amp;lt;title&gt;Javascript - Detecting the bottom of the page&amp;lt;/title&gt;
 
  &amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js&quot;&gt;&amp;lt;/script&gt;
  &amp;lt;script type=&quot;text/javascript&quot;&gt;
 
   $(window).scroll(function() {
 
    $(&#39;#notification2&#39;).html(&#39;document.height = &#39; + document.height);
    $(&#39;#notification3&#39;).html(&#39;window.pageYOffset + window.innerHeight = &#39; + (window.pageYOffset + window.innerHeight));
 
    if(document.height == window.pageYOffset + window.innerHeight)
    {
     // hit bottom
     $(&#39;#notification1&#39;).html(&#39;HIT BOTTOM&#39;);
    }
    else
    {
     $(&#39;#notification1&#39;).html(&#39;NOT AT BOTTOM&#39;);
    }
   });
 
  &amp;lt;/script&gt;
 
  &amp;lt;style type=&quot;text/css&quot;&gt;
 
   body
   {
    margin:0px;
    padding:0px;
   }
 
   .box
   {
    width:400px;
    height:400px;
    margin:0px auto;
    background:#ccc;
   }
 
   .notification
   {
    position:fixed;
    color:#777;
    width:auto;
    height:auto;
    background:#ccc;
    padding:10px;
    font-family:Arial, Helvetica;
    font-weight:bold;
 
   }
 
  &amp;lt;/style&gt;
 
 &amp;lt;/head&gt;
 &amp;lt;body&gt;
 
 &amp;lt;div class=&quot;notification&quot; id=&quot;notification1&quot;&gt;NOT AT BOTTOM&amp;lt;/div&gt;
 &amp;lt;div class=&quot;notification&quot; style=&quot;top:50px;&quot; id=&quot;notification2&quot;&gt;document.height = &amp;lt;/div&gt;
 &amp;lt;div class=&quot;notification&quot; style=&quot;top:100px;&quot; id=&quot;notification3&quot;&gt;window.pageYOffset + window.innerHeight = &amp;lt;/div&gt;
 
 
  &amp;lt;div class=&quot;box&quot;&gt;&amp;lt;/div&gt;
  &amp;lt;div class=&quot;box&quot;&gt;&amp;lt;/div&gt;
  &amp;lt;div class=&quot;box&quot;&gt;&amp;lt;/div&gt;
  &amp;lt;div class=&quot;box&quot;&gt;&amp;lt;/div&gt;
  &amp;lt;div class=&quot;box&quot;&gt;&amp;lt;/div&gt;
  &amp;lt;div class=&quot;box&quot;&gt;&amp;lt;/div&gt;
 
 &amp;lt;/body&gt;
&amp;lt;/html&gt;&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/1438580444042958447/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/07/detectar-la-parte-inferior-de-la-pagina.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/1438580444042958447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/1438580444042958447'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/07/detectar-la-parte-inferior-de-la-pagina.html' title='Detectar la parte inferior de la página con Javascript'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-5231495585848118708</id><published>2011-07-15T13:37:00.001+02:00</published><updated>2011-07-15T14:04:45.656+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSS3"/><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><title type='text'>Plugin jQuery Sliding Buttons</title><content type='html'>Después de algún tiempo de diseño cociendo algunas cosas, he salido de la cueva y os presento otro plugin de jQuery totalmente hecho por mí. Ante vosotros está el magnífico Sliding Buttons!&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEoAAAApCAIAAAAd0ijSAAAFhUlEQVRoge2ZbUxTVxjHDxjRwRZDgCwsIxvBOKbLjKIWQWGLTrMv24TIVIbgC6UGh+C84juJmgxfWBaDQS9sytrKS2MYKqVWmdvAOuxEXEAnEAVBrBRfhrO02va/D6fevlBoLdJG3D/n0/Occ/v/3XvuPafPIRjVIp42MLL6H++ZVI9vVbQc3l67LKlq+oLywHll/rOExA1tXpn/gvLA5VURO+oSK1pZ1eNbLxLPYNSfaS8TyGMjRd7u4Rm6RYq8BfKPzraXG4yG4eIp79QsrnzP40h2W8KJ9y+pzrmIp9Vr9tSv4Qm9LG7bGIE8Vnw1r7GnTq3p7tPdd3jzXoj6dPfVmu7GnjrR1f1pp2MiRWM4Szyh176La3X6/sHG2sd7oFUvr4rgrjL32GsHGzY90KpHDOE59ECrzm/InnNsPGdvhXTWQ22v3c528B5qe5ecnMINzv4t/rneZvfozr8dG39dxJlcevKDf3T3BnazxdPp+1dIZ9ExUeKxFS2H3eLWRVW0HI4Sj6VuV8uidHqtTQdbvD31a7gP1C8dx93l03XVdEi4T3qeMsMma4VX13WKe9ziq3luNDksCZv3crbru89Ypsx4BqM+oTL82fsWZ4TR7T5dlBHGb859xr2EluuhGa/6hoj2iC3xU2tue8Kn6+p53BVT4kv9y2+WcHEzXrJ0Bk0XXN7qCYfD1cGGTaZ1oprHBU14nX2t3Np9v/+uhxwOS72aO/QbwxN63X50gwZNeGV/H6B4a+Qfe84hNGjrQpvLu6G00zGUQnL9II2Y8LbVLnX2gykVTCImefv4Bbw788v9tY9OrA4jZMras7SLTBBOyDvTwomNJsTnbIkcGCwCoEN1NTILwWfBZ5FZipOdAFBQDH4hRF0AgF7sYLFeNrg1UfM+SpFT95UVXuKpqTTR1FvvDF5w7OrNmzdlb0ibH+ZD/ObnsgPxQj9NZRiGSV8YRohfRALDMMyWH36uyhsYVAAXZEhjkVkG4XmIZcgqBL8Yvz9CQTH4LNIluOkM3l89CkqRVDXdCu+T8gCacLyxlAomERIuoL+iKop/k4yL3V0wEG+SQAoATdujCPFf/KPVNWyCGuQWgf8T6nWmwJUz4LPY/YcJj8/iW6UTePf6VZRioSTICi9a7EMTTw1PnMEbHxASGhoaGhLoS8aFrzyusjM5nwOvHRtZpJ+w6NCMdSyyqlFQDL4IO4+AfxQ1XY7wdHotpZhzbJx9vCcG3eDDzXhBEZ8nJycnLYuLmfgG8Z/J7Fo1kZDJ6Rye+QE7g3fTDl4Gh1eKxotYy2J9Jba6iMdNTsergtXkBI4kBBAy+YtFHxISkiKhMUlKCCFTs2qdxaOTsxgKjSnQIAefxc4LJrx2QFJumqVD4ak13fYnZ1LVNJq40nPeGbzgmBSGYZgNXy/hBRMyYeGu3PggQgJnJG7J3ZuzMjqYkMA49p6zeICiGmksMkohVEAsQxYL/lGc6zPjoRPbCh3hNd6tpRTJ0hlWeNzCIGze6wweXRe8fca/HhQWlZyv7EfTkdTZb/vShO9bvJRDlwchsR/UQSpFVpHpEa0rQUUHAAs84PJZCIbGK27Ktb8wHL9eQBOpsmgHeEOoX3XtkkKhvKYatDjgQBq0daG1F47e/0G0SjabUlS0sjTyamzKAKTKoinh93+u95DDYSlPmUH980/P5YJmPHl7KU1Hi306+9o84dB13epr4aoSNR0SLv7K/J0F0Hi3litssldy3G3TVR1q3MbVh2z2zLalpO+UmS9vKenAJcYmO1QhkCf0ym/IdqaU7xEZjIb8hmxuujlVCMToLuNSjeYiPJXDIxS98emIIVhJb3z6go9QOI3aAzBOo/n40lI2h8+W83ZEG0/oNYKHzy+1RjnefxPqd7wD22yPAAAAAElFTkSuQmCC&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;img alt=&quot;&quot; src=&quot;data:image/png;base64,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&quot; /&gt;&lt;/div&gt;&lt;br /&gt;
Este plugin transforma un inocente span o div con dos contenedores de tipo inline dentro en un vistoso botón cuyos contenidos (primer contendor) aparece y desaparece al pasar el ratón sobre él. Soporta eventos y funciona!&lt;br /&gt;
&lt;br /&gt;
Ahí va el jsFiddle de rigor y como siempre, si encuentras algún bug o lo mejoras, decídmelo, y si lo usas, cuéntamelo también, que al menos no tenga sensación de haber perdido el tiempo.&lt;br /&gt;
&lt;iframe src=&quot;http://jsfiddle.net/jrdiaz/fCRZK/embedded/result,js,css,html/&quot; style=&quot;height: 450px; width: 100%;&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Ejemplo&lt;br /&gt;
&lt;pre class=&quot;brush:html&quot;&gt;&lt;div class=&quot;slideButton&quot;&gt;    &lt;a href=&quot;&quot;&gt;Sliding contents&lt;/a&gt;
    &lt;a href=&quot;&quot;&gt;Button&lt;/a&gt;
&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;
Código javascript&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;/**
 * jquery.slideButton-0.1.js - Slide Button plugin for jQuery
 * ==========================================================
 *  (C) 2011 José Ramón Díaz - jrdiazweb@gmail.com
 *
 * http://3nibbles.blogspot.com/2011/07/plugin-jquery-sliding-buttons.html
 *
 * INSTANTIATION
 * Any container with the .slideButton class will be initialized
 * on domReady event using the options defined in object
 * &quot;slideButtonDefaults&quot;. This feature can be disabled by setting
 * the variable &quot;slideButtonAutoload&quot; to the false value.
 *
 * Manual instantiation
 *     $(&#39;.slideButton&#39;).slideButton( [ options_object ] );
 *
 * OPTIONS
 *     - direction    : &#39;left&#39;,   Slide direction &quot;left&quot; = LtR, &quot;right&quot; = RtL
 *     - border       : &#39;3px&#39;,    Border width == difference in height of control(&amp;gt;) and contents(&amp;lt;)
 *     - radius       : &#39;20px&#39;,   Border radius of the slideButton
 *     - height       : &#39;36px&#39;,   Maximum height of the slideButton. Includes all borders
 *     - width        : &#39;70px&#39;,   Minimum width. Applied to control
 *     - deployedWidth: &#39;225px&#39;,  Maximum width. Applied to container and deployed contents
 *     - inAnimation  : &#39;swing&#39;,  Function used to deploy (slide in) the elements. For more functions needs the easing packs
 *     - outAnimation : &#39;swing&#39;,  Function used to hide (slide out) the elements. For more functions needs the easing packs
 *     - inSpeed      : 500,      deploy effect duration
 *     - outSpeed     : 300,      hide effect duration
 *     - onClick      : null,     button click trigger callback function
 *     - onBlur       : null,     blur (slide out) trigger callback function
 *     - onDeploy     : null,     deploy (slide in) trigger callback function
 *     - onHide       : null,     hide (end of slide out) trigger callback function
 *
 * API
 *     - show()    Deploys the sliding contents
 *     - hide()    Hides the sliding contents
 *     - lock()    Locks the sliding contents open
 *     - locked    Indicates that the control is locked
 *     - deployed  Indicates that the control is deployed
 *
 * CLASSES
 *     - Container: .slideButton, .deployed, .clicked
 *     - Button:    .button
 *     - Content:   .content
 *
 * HTML format
 *     &lt;div class=&quot;slideButton&quot;&gt;*          &lt;a href=&quot;&quot;&gt;Sliding contents&lt;/a&gt;  
 *          &lt;a href=&quot;&quot;&gt;Button&lt;/a&gt;            
 *     &lt;/div&gt;*
 * Valid HTML content and control containers are any inline element (a, span, etc...).
 * Container must be div or span.
 *
 * Legal stuff
 *     You are free to use this code, but you must give credit and/or keep header intact.
 *     Please, tell me if you find it useful. An email will be enough.
 *     If you enhance this code or correct a bug, please, tell me.
 */
var slideButtonDefaults = {};   // The default options used for all auto loading sliding buttons
var slideButtonAutoload = true; // Enables the autoinstantiation feature for .slidingButton

(function( $ ) {
    // Private members
    function SlideButton( el, options ) {
        this.container = $(el);
        this.cA = null;
        this.cB = null;

        //this.el.attr(&#39;locked&#39;, &#39;off&#39;);

        // States control
        this.locked   = false;
        this.deployed = false;

        // Default options
        this.options = {
                direction    : &#39;right&#39;,   // Slide direction &quot;left&quot; = LtR, &quot;right&quot; = RtL
                border       : &#39;3px&#39;,    // Border width == difference in height of control(&amp;gt;) and contents(&amp;lt;)
                radius       : &#39;20px&#39;,   // Border radius of the slideButton
                height       : &#39;36px&#39;,   // Maximum height of the slideButton. Includes all borders
                width        : &#39;70px&#39;,   // Minimum width. Applied to control
                deployedWidth: &#39;225px&#39;,  // Maximum width. Applied to container and deployed contents

                inAnimation  : &#39;swing&#39;,  // Function used to deploy (slide in) the elements. For more functions needs the easing packs
                outAnimation : &#39;swing&#39;,  // Function used to hide (slide out) the elements. For more functions needs the easing packs
                inSpeed      : 300,      // deploy effect duration
                outSpeed     : 200,      // hide effect duration

                onClick      : null,     // button click trigger callback function
                onBlur       : null,     // blur (slide out) trigger callback function
                onDeploy     : null,     // deploy (slide in) trigger callback function
                onHide       : null,     // hide (end of slide out) trigger callback function
        };

        slideButtonDefaults = this.options; // Sets the initial value of global default options

        this.setOptions( options );
        this.initialize();
    }

    // Instantiation
    $.fn.slideButton = function( options ) {
        return new SlideButton(this.get(0) || $(&#39;&amp;lt;span /&amp;gt;&#39;) || $(&#39;&amp;lt;div /&amp;gt;&#39;), options);
    };

    // Public Members
    SlideButton.prototype = {
        // Plugin functions
        killerFn: null,

        initialize: function() {
            var me, o, c, children, cA, cB, h1, h2, w1, w2, w3, r1, r2, b;
            me = this;
            o  = me.options;
            c  = me.container;

            // Sets objects and variables initial values
            children = c.children();
            cA = me.cA = $( children[0] );
            cB = me.cB = $( children[1] );

            // Widths and heights
            b  =   parseInt(o.border);                  // Border
            h1 =   parseInt( o.height ) + &#39;px&#39;;         // Container/Contents height
            h2 = ( parseInt( h1 ) - (b * 2) ) + &#39;px&#39;; // Control height
            w1 =   parseInt( o.deployedWidth ) + &#39;px&#39;;  // Container and deployed width
            w2 =   parseInt( o.width ) + &#39;px&#39;;          // Contents width
            w3 = ( parseInt( w2 ) - (b * 2) ) + &#39;px&#39;;  // Control width
            r1 =   parseInt( o.radius ) + &#39;px&#39;;         // External border radius
            r2 = ( parseInt( o.radius ) - b ) + &#39;px&#39;; // Internal border radius

            // Container modifications
            if( !c.hasClass(&#39;slideButton&#39;) ) me.container.addClass( &#39;slideButton&#39; );
            c.width( w1 );
            c.height( h1 );
            //me.container.height(o.height);
            c.css({ &#39;position&#39;: &#39;relative&#39;, &#39;overflow&#39;: &#39;hidden&#39; });

            // Chidren modifications
            cA.addClass( &#39;content&#39; ); //o.direction + &#39;A content&#39; );
            cB.addClass( &#39;button&#39;  ); //o.direction + &#39;B button&#39; );

            // Wraps sliding contents into a span
            var text = cA.get(0).innerHTML;
            cA.get(0).innerHTML = &#39;&lt;span class=&quot;contents&quot;&gt;&#39; + text + &#39;&lt;/span&gt;&#39;;
            cA.find(&#39;span:first-child&#39;).hide();

            // Sets styles
            c.data( &#39;initialWidth&#39;, w1 ); // Stores the initial width in container data
            cA.width( w2 );
            cB.width( w3 );
            cA.height( h1 );
            cB.height( h2 );
            cA.css({ &#39;position&#39;: &#39;absolute&#39;, &#39;top&#39;: &#39;0px&#39; , &#39;lineHeight&#39;: h1, &#39;zIndex&#39;: 0, &#39;borderRadius&#39;: r1 });
            cB.css({ &#39;position&#39;: &#39;absolute&#39;, &#39;top&#39;: b+&#39;px&#39;, &#39;lineHeight&#39;: h2, &#39;zIndex&#39;: 1, &#39;borderRadius&#39;: r2 });

            if(o.direction == &#39;left&#39;)
            {
                cA.css({ &#39;right&#39;: &#39;0px&#39; , &#39;textAlign&#39;: &#39;left&#39; });
                cB.css({ &#39;right&#39;: b+&#39;px&#39; });
            }
            else
            {
                cA.css({ &#39;left&#39;: &#39;0px&#39; , &#39;textAlign&#39;: &#39;right&#39; });
                cB.css({ &#39;left&#39;: b+&#39;px&#39; });
            }

            // Killer function set
            this.killerFn = function( e ) {
                // Test if didn&#39;t clicked on the slideButton
                var tar = $(e.target);
                if (tar.parents( &#39;.slideButton&#39; ).size() === 0) {
                    me.locked   = false;
                    me.cB.removeClass( &#39;clicked&#39; );
                    me.hide();
                    me.disableKillerFn();
                }
            };

            // Stores slideButton instance in container
            c.data( &#39;slideButton&#39;, me );

            // Event listeners
            cB.hover( me.show, me.hide );
            cB.click( me.click );
        },

        setOptions: function(options) {
            var o = this.options;
            var c = this.container;

            // Uses container height if no options.height is given
            if(typeof(o.height) === &#39;undefined&#39; || o.height == null || o.height &amp;lt;= 0)
                if(c.height()) o.height = c.height();

            $.extend(o, options);
        },

        // Slide visualization functions
        show: function() {
            var me;
            if( typeof this.container !== &#39;undefined&#39; )
                me = this.cB;
            else
                me = $(this);

            // Gets the instance
            var sb = me.parent().data( &#39;slideButton&#39; );
            if(sb.deployed) return; // It is already deployed
            var o  = sb.options;

            var slidelem = me.prev();
            // Animates the contents of control
            slidelem.stop().animate( { &#39;width&#39;: parseInt(o[&#39;deployedWidth&#39;]) + &#39;px&#39; }, o[&#39;inSpeed&#39;] ); //, o[&#39;inAnimation&#39;] );
            // Animates the contents of content
            slidelem.find( &#39;span&#39; ).stop( true, true ).fadeIn();

            // Updates the state
            sb.container.addClass(&#39;deployed&#39;);
            sb.deployed = true;

            // Triggers events
            if( typeof o.onDeploy === &#39;function&#39; ) o.onDeploy(sb);
        },

        hide: function(force) {
            var me;
            if(typeof this.container !== &#39;undefined&#39;)
                me = this.cB;
            else
                me = $(this);

            if( typeof force !== &#39;object&#39; &amp;amp;&amp;amp; force == true ) me.removeClass(&#39;clicked&#39;);
            if( me.hasClass(&#39;clicked&#39;) ) return; // Ignore hide when in clicked (locked) state

            // Gets the instance
            var sb = me.parent().data( &#39;slideButton&#39; );
            if(!sb.deployed) return; // Already hidden
            var o  = sb.options;

            var slidelem = me.prev();
            // Animates the contents of control
            slidelem.stop().animate( { &#39;width&#39;: parseInt(o.width)+&#39;px&#39; }, o[&#39;outSpeed&#39;], o[&#39;outAnimation&#39;] );
            // Animates the contents of content
            slidelem.find( &#39;span&#39; ).stop( true, true ).fadeOut();

            // Updates the state
            sb.container.removeClass( &#39;deployed&#39; );
            sb.deployed = false;
            sb.locked   = false;

            // Triggers events
            if( typeof o.onHide === &#39;function&#39; ) o.onHide(sb);
        },

        click: function (ev) {
            var me = $(this);

            // Gets the instance
            var sb = me.parent().data( &#39;slideButton&#39; );
            var o  = sb.options;
            if( me.hasClass( &#39;clicked&#39; ) )
            {
                me.removeClass( &#39;clicked&#39; );
                sb.hide();
                sb.disableKillerFn();
            }
            else
            {
                sb.show();
                sb.enableKillerFn();
                me.addClass( &#39;clicked&#39; );
            }

            // Triggers events
            if( typeof o.onClick === &#39;function&#39; ) o.onClick(sb);
        },

        lock: function() {
            var sb = $(this).data( &#39;slideButton&#39; );
            if(!sb.deployed) sb.show();
            sb.enableKillerFn(); // Hooks the click event on the document to close
            sb.locked = true;
        },

        // Lock killer functions
        enableKillerFn: function() {
            var me = this;
            $(document).bind( &#39;click&#39;, me.killerFn );
        },

        disableKillerFn: function() {
            var me = this;
            $(document).unbind( &#39;click&#39;, me.killerFn );
        },

    };

}(jQuery));


// Autoinitializarion
$(document).ready(function() {
    if(slideButtonAutoload)
        $( &#39;.slideButton&#39; ).each( function ( index, elem ) {
            $(elem).slideButton( slideButtonDefaults );
        });
});


///////////////////////////////////////////////////////////////////////
/*
 * Border-radius jQuery cssHook
 * ==========================================================
 * (C) 2011 José Ramón Díaz - jrdiazweb@gmail.com
 *
 * Instead of using borderRadius cssHook from Brandon Aaron for example
 * (https://github.com/brandonaaron/jquery-cssHooks), I define a custom
 * cssHook for the borderRadius CSS property for the sake of simplicity
 * and to reduce other modules dependencies.
 *
 * If you prefer to use another cssHook from another source (Brandon&#39;s
 * one for example), just delete this and include the other cssHook.
 *
 * NOTE: cssHooks needs jQuery v1.4.3 or greater.
 */
(function( $ ){

    var div      = document.createElement(&#39;div&#39;),
        divStyle = div.style;

    if ( !$.cssHooks ) {
        // if not, output an error message
        throw(&quot;jQuery 1.4.3 or above is required for this plugin to work&quot;);
        return;
    }

    div = null; // Avoids IE memory leaks

    $.support.borderRadius =
        divStyle.MozBorderRadius    === &#39;&#39;? &#39;MozBorderRadius&#39;    :
       (divStyle.msBorderRadius     === &#39;&#39;? &#39;msBorderRadius&#39;     :
       (divStyle.WebkitBorderRadius === &#39;&#39;? &#39;WebkitBorderRadius&#39; :
       (divStyle.OBorderRadius      === &#39;&#39;? &#39;OBorderRadius&#39;      :
       (divStyle.borderRadius       === &#39;&#39;? &#39;borderRadius&#39;       :
        false))));

    // Border radius will be set only in border-radius compatible &quot;borderRadius&quot; browsers
    if ( $.support.borderRadius &amp;amp;&amp;amp; $.support.slideBorderRadius !== &quot;borderRadius&quot; )
    {

        $.cssHooks[&quot;borderRadius&quot;]    = {

                get: function( elem, computed, extra ) {
                    return $.css( elem, $.support.borderRadius );
                },
                set: function( elem, value) {
                    elem.style[$.support.borderRadius] = value;
                }

        };

    }

})(jQuery);&lt;/pre&gt;CSS &lt;br /&gt;
&lt;pre class=&quot;brush:css&quot;&gt;/**
 * Slide Button Styles.
 * ================================================
 * (C) 2011 José Ramón Díaz - jrdiazweb@gmail.com
 *
 * http://3nibbles.blogspot.com/2011/07/plugin-jquery-sliding-buttons.html
 *
 * Slide Button CSS styles. Note that rounded borders is a CSS3 feature,
 * so, it will be represented correctly in CSS3 ready browsers.
 *
 * Legal stuff
 *     You are free to use this CSS, but you must give credit or keep header intact.
 *     Please, tell me if you find it useful. An email will be enough.
 *     If you enhance this code or correct a bug, please, tell me.
 */
.slideButton                                   { font-weight: bold; font-size: 11px; font-family: Arial } /* Container                 */
  .slideButton a                               { text-decoration: none; }                                 /* a components containers   */

  .slideButton .button                         { background-color: #FFFFFF; color: #000000; text-align: center;
                                                 cursor: pointer; text-transform: uppercase; }            /* Control                   */
    .slideButton.deployed .button              { background-color: #9AFF66; color: #FFFFFF;  }            /* Control - Deployed state  */

  .slideButton .content                        { background-color: #36A300; color: #FFFFFF; }             /* Content                   */
    .slideButton.deployed .content             {  }                                                       /* Content - Deployed state  */

/* Depends on contents of the content component */
  .slideButton .button span                    { color: #9AFF66; }                                        /* Control spans             */
    .slideButton.deployed .button span         { color: #36A300; }                                        /* Control spans - Deployed  */
  .slideButton .content span span              { color: #9AFF66; }                                        /* Content spans             */
    .slideButton.deployed .content span        {  }                                                       /* Content spans - Deployed  */&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/5231495585848118708/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/07/plugin-jquery-sliding-buttons.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/5231495585848118708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/5231495585848118708'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/07/plugin-jquery-sliding-buttons.html' title='Plugin jQuery Sliding Buttons'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-6920982337243290470</id><published>2011-07-07T09:00:00.001+02:00</published><updated>2011-07-07T09:00:07.417+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="node"/><category scheme="http://www.blogger.com/atom/ns#" term="webSockets"/><title type='text'>Introducción a Node</title><content type='html'>No es un secreto que siempre me han atraido las aplicaciones en tiempo real, pero desgraciadamente en el desarrollo web, la comunicación bidireccional de la información para realimentarse de los datos siempre ha sido con suerte artificiosa.&lt;br /&gt;
&lt;br /&gt;
Afortunadamente, HTML5 ha venido al rescate de todos con la maravillosa implementación de los websockets... pero toda moneda tiene su revés... ningún servidor web soporta el protocolo de websockets, y no solo eso, si no que además, dicho soporte es poco menos que ciencia ficción porque el modelo de funcionamiento de los servidores web basado en petición-respuesta es incompatible con el modelo de funcionamiento de los websockets basado en eventos.&lt;br /&gt;
&lt;br /&gt;
Vamos a matizarlo un poco... poderse, se puede... pero el rendimiento es para echarse a llorar. Existe el paradigma de las 10k conexiones que dice que un servidor web debe ser capaz de servir a 10000 clientes simultáneos. Alguno dirá que 10k conexiones son una barbaridad, pero hay que tener en cuenta que con websockets los eventos tienen una vida muy corta y se pueden realizar muchos por cada página, con lo que poniendo una media de 10 conexiones por página nos da un total de 1000 clientes reales... y si es una página que tiene mucho tráfico, pues nos encontraremos con problemas muy rápido.&lt;br /&gt;
&lt;br /&gt;
La única solución que nos queda es montar un nuevo servidor web dedicado únicamente a websockets y que sea capaz de cumplir con el 10k. A día de hoy hay varias alternativas, unas comerciales y otras libres, pero la mejor sin duda (al menos para mí) es Node.js.&lt;br /&gt;
&lt;br /&gt;
Qué es &lt;a href=&quot;http://nodejs.org/&quot;&gt;Node.js&lt;/a&gt;? pues aunque cueste creerlo es un servidor de websockets basado en javascript (comorl???). Pues sí, y como muestra la gráfica de pruebas de stress a continuación, se lleva de calle a cualquier otra plataforma.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgusTR7rgdegEWccPvws4LGxEWpfojHSg5d1qLJCTnDhwo9momI7oS37F8vlf8bcC9sYLqtwBA_jRnnheIu7rOfuANmtuVizL01yNuQd0I9Exr01m9YcvyU29QUskE4wV7EonXm8rZDfyU/s1600/node_stress.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;351&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgusTR7rgdegEWccPvws4LGxEWpfojHSg5d1qLJCTnDhwo9momI7oS37F8vlf8bcC9sYLqtwBA_jRnnheIu7rOfuANmtuVizL01yNuQd0I9Exr01m9YcvyU29QUskE4wV7EonXm8rZDfyU/s400/node_stress.png&quot; width=&quot;400&quot; /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Para los que tengan curiosidad, la línea verde es Apache sobre Ubuntu que se ve claramente que no llega ni a las 1000 conexiones concurrentes mientras que Node sobrepasa ampliamente las 10k hasta las casi 14k con la misma máquina.&lt;br /&gt;
&lt;br /&gt;
Ahora vienen las pegas ya que tono no es un campo de flores. La programación orientada a eventos es radicalmente diferente en concepto a la procedimental de toda la vida... ergo, tendremos que aprender a programar de nuevo.&lt;br /&gt;
&lt;br /&gt;
Node se basa en el último motor de javascript + una librería de acceso de entrada salida asíncrona así que el concepto de páginas y carpetas se sustituye por otro parecido a servicios o puertas de entrada. Cada servicio de node será un servidor en sí escuchando en un websocket, listo para responder a los eventos que le lleguen.&lt;br /&gt;
&lt;br /&gt;
El servicio usado para las pruebas de carga es éste, que es un respondedor automático que dice &quot;Hello world&quot; a todas las peticiones después de 2 segundos.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;node.http.createServer(function (req, res) {
  setTimeout(function () {
    res.sendHeader(200, {&quot;Content-Type&quot;: &quot;text/plain&quot;});
    res.sendBody(&quot;Hello World&quot;);
    res.finish();
  }, 2000);
}).listen(8000);
puts(&quot;Server running at http://127.0.0.1:8000/&quot;);&lt;/pre&gt;&lt;br /&gt;
Lo que hace es escuchar el puerto 8000 y responde usando el protocolo http con el texto.&lt;br /&gt;
&lt;br /&gt;
El truco es que al contrario que los servidores tradicionales, en esos 2 segundos (simulación del proceso que tendría que hacer), el servidor sigue aceptando petic... err... eventos y no bloque la ejecución.&lt;br /&gt;
&lt;br /&gt;
Más de uno estará echando de menos librerías para acceso a base de datos (gracias PHP!) ya que aquí solo hay un esqueleto de aplicación sin demasiados añadidos aparte de leer y escribir.&lt;br /&gt;
&lt;br /&gt;
Las buenas noticias son que hay múltiples librerías que utilizando el protocolo TCP/IP son capaces por ejemplo de atacar a servidores MySQL y ejecutar las operaciones necesarias para consultar, insertar, modificar, etc.&lt;br /&gt;
&lt;br /&gt;
Otro ejemplo típico es un chat, que afortunadamente viene de &quot;serie&quot; como &lt;a href=&quot;http://chat.tinyclouds.org/&quot;&gt;ejemplo &lt;/a&gt;con su código fuente &lt;a href=&quot;https://github.com/ry/node_chat&quot;&gt;aquí&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Para montar el servidor, necesitamos un hospedaje LINUX que permita instalarlo o un hospedaje gratuito de Node como por ejemplo &lt;a href=&quot;http://chat.tinyclouds.org/&quot;&gt;Joyent&lt;/a&gt;. Para montarlo en casa, seguiremos necesitando linux y descargar los fuentes para luego compilarlos con&lt;br /&gt;
&lt;pre brush=&quot;php&quot;&gt;./configure
make
make install&lt;/pre&gt;La documentación, la podéis encontrar en &lt;a href=&quot;https://github.com/joyent/node/wiki&quot;&gt;esta dirección &lt;/a&gt;y la mailing list es &lt;a href=&quot;http://groups.google.com/group/nodejs&quot;&gt;ésta otra&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Para los que tengan curiosidad, se mantiene una lista de los módulos actualmente implementados en &lt;a href=&quot;https://github.com/joyent/node/wiki/modules&quot;&gt;esta dirección&lt;/a&gt; que hacen ver que es un proyecto que está pero que muy vivo.</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/6920982337243290470/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/07/introduccion-node.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/6920982337243290470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/6920982337243290470'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/07/introduccion-node.html' title='Introducción a Node'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgusTR7rgdegEWccPvws4LGxEWpfojHSg5d1qLJCTnDhwo9momI7oS37F8vlf8bcC9sYLqtwBA_jRnnheIu7rOfuANmtuVizL01yNuQd0I9Exr01m9YcvyU29QUskE4wV7EonXm8rZDfyU/s72-c/node_stress.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-1899935891689253430</id><published>2011-07-06T09:00:00.002+02:00</published><updated>2011-07-06T09:00:13.583+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSS3"/><title type='text'>Sprite Cow</title><content type='html'>Una de las mejores herramientas que he visto para la gestión de sprites es &lt;a href=&quot;http://spriteme.org/&quot;&gt;SpriteMe&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Pero tener una buena herramienta de generación no sirve de nada si no queda completamente definido qué sprites son los que están en la imagen para incluirlos en el CSS. Aquí entra en juego &lt;a href=&quot;http://www.spritecow.com/&quot;&gt;SpriteCow&lt;/a&gt;, que de forma visual y muy sencilla permite seleccionar áreas de la imagen previamente cargada en un canvas, generándonos el CSS para acceder a los sprites.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt=&quot;&quot; height=&quot;336&quot; src=&quot;data:image/png;base64,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&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Con ello, los pasos serían&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Generar la imagen del sprite. Ya sea a lo campestre con el photoshop o similar o con &lt;a href=&quot;http://spriteme.org/&quot;&gt;SpriteMe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Cargar la imagen con SpriteCow y seleccionar los sprites que se deseen, copiando y pegando el CSS generado.&lt;/li&gt;
&lt;/ol&gt;Rápido y sencillo, como debe ser.</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/1899935891689253430/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/07/sprite-cow.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/1899935891689253430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/1899935891689253430'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/07/sprite-cow.html' title='Sprite Cow'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-823756356542737330</id><published>2011-07-05T12:37:00.000+02:00</published><updated>2011-07-05T12:37:16.730+02:00</updated><title type='text'>Por qué lo llaman amor cuando quieren decir sexo</title><content type='html'>Pensamiento del día... &lt;br /&gt;
Realmente, para lo que quiero decir hay que cambiar &quot;amor&quot; por &quot;HTML5&quot; y &quot;sexo&quot; por &quot;CSS3&quot;. Realmente HTML se refiere a estructura y cuncionalidad, mientras que CSS a forma y generalmente se habla de cómo cambiar la apariencia de algo para que sea más &quot;moderno&quot;... realmente no lo sé.&lt;br /&gt;
&lt;br /&gt;
En la mayoría de los sitios de los que se habla de HTML5, realmente lo que nos muestran son técnicas CSS3... por qué?... no es por &quot;engañar&quot; al personal, ni por ignorancia del que habla, ni por ignorancia del que escucha...&lt;br /&gt;
&lt;br /&gt;
Tendrá más &quot;caché&quot; la palabra &quot;HTML&quot; que &quot;CSS&quot;? será que ambas versiones han salido &quot;a la vez&quot;? será un matrimonio tipo XSL + XSLT?&lt;br /&gt;
&lt;br /&gt;
Un misterio...</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/823756356542737330/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/07/por-que-lo-llaman-amor-cuando-quieren.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/823756356542737330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/823756356542737330'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/07/por-que-lo-llaman-amor-cuando-quieren.html' title='Por qué lo llaman amor cuando quieren decir sexo'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-4767422982534817920</id><published>2011-07-05T09:00:00.001+02:00</published><updated>2011-07-06T10:08:55.528+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="node"/><category scheme="http://www.blogger.com/atom/ns#" term="webSockets"/><title type='text'>Node.js -&gt; Node.exe</title><content type='html'>Magnífica noticia. Va a haber port oficial de Node.js a windows... y no solo eso, si no que Microsoft está 100% implicada en el producto. Si los principales anti-estándares, apoyan una solución con muchos puntos de convertirse en un estantad &lt;i&gt;de facto&lt;/i&gt; para la implementación de websockets, es más que probable, que una solución tan buena como es Node.js termine siendo La Manera de usar websockets independientemente de la plataforma del servidor.&lt;br /&gt;
&lt;br /&gt;
Podéis ver más en el &lt;a href=&quot;http://blog.nodejs.org/2011/06/23/porting-node-to-windows-with-microsoft%E2%80%99s-help/&quot;&gt;enlace a la noticia&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blog.nodejs.org/&quot; rel=&quot;home&quot; style=&quot;color: #0099cc; text-decoration: none;&quot; title=&quot;node blog&quot;&gt;node blog&lt;/a&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: #2f2f2f; color: #999999; font-family: &#39;Lucida Grande&#39;,Helvetica,Arial,sans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 19px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div id=&quot;main&quot; style=&quot;clear: both;&quot;&gt;&lt;div id=&quot;container&quot;&gt;&lt;div id=&quot;content&quot; role=&quot;main&quot;&gt;&lt;div class=&quot;post-151 post type-post status-publish format-standard hentry category-uncategorized&quot; id=&quot;post-151&quot; style=&quot;background-attachment: initial; background-clip: initial; background-color: #3c3c3c; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; margin-bottom: 47px; margin-left: 0px; margin-right: 0px; margin-top: 47px; overflow-x: hidden; overflow-y: hidden; padding-bottom: 35px; padding-left: 35px; padding-right: 35px; padding-top: 35px; position: relative; width: 530px;&quot;&gt;&lt;h1 class=&quot;entry-title&quot; style=&quot;color: #cccccc; font-size: 2.1em; font-weight: normal; font: normal normal normal 1.5384em/1.5em Helvetica, Arial, sans-serif; line-height: 1.2em; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Porting Node to Windows With Microsoft’s&amp;nbsp;Help&lt;/h1&gt;&lt;div class=&quot;entry-meta&quot; style=&quot;font-size: 0.9231em; position: absolute; right: 1em; top: 1em;&quot;&gt;&lt;span class=&quot;meta-prep meta-prep-author&quot;&gt;Posted on&lt;/span&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://blog.nodejs.org/2011/06/23/porting-node-to-windows-with-microsoft%e2%80%99s-help/&quot; rel=&quot;bookmark&quot; style=&quot;color: #ff9900; text-decoration: none;&quot; title=&quot;3:22 pm&quot;&gt;&lt;span class=&quot;entry-date&quot; style=&quot;color: #828282;&quot;&gt;June 23, 2011&lt;/span&gt;&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;meta-sep&quot;&gt;by&lt;/span&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;author vcard&quot;&gt;&lt;a class=&quot;url fn n&quot; href=&quot;http://blog.nodejs.org/author/ryandahl/&quot; style=&quot;color: #ff9900; text-decoration: none;&quot; title=&quot;View all posts by ryandahl&quot;&gt;ryandahl&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;entry-content&quot;&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;I’m pleased to announce that Microsoft is partnering with Joyent in formally contributing resources towards porting Node to Windows. As you may have heard in&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://nodejs.org/nodeconf.pdf&quot; style=&quot;color: #ff9900; text-decoration: none;&quot; title=&quot;a talk&quot;&gt;a talk&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;we gave earlier this year, we have started the undertaking of a native port to Windows – targeting the high-performance IOCP API.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;This requires a rather large modification of the core structure, and we’re very happy to have official guidance and engineering resources from Microsoft.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://www.cloudkick.com/&quot; style=&quot;color: #ff9900; text-decoration: none;&quot;&gt;Rackspace&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;is also contributing&lt;a href=&quot;https://github.com/piscisaureus&quot; style=&quot;color: #ff9900; text-decoration: none;&quot;&gt;Bert Belder&lt;/a&gt;‘s time to this undertaking.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 1em; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;The result will be an official binary node.exe releases on nodejs.org, which will work on Windows Azure and other Windows versions as far back as Server 2003.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/4767422982534817920/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/07/nodejs-nodeexe.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/4767422982534817920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/4767422982534817920'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/07/nodejs-nodeexe.html' title='Node.js -&gt; Node.exe'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-3516444641338280897</id><published>2011-07-04T10:08:00.000+02:00</published><updated>2011-07-04T10:08:45.215+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSS3"/><title type='text'>Creación de gradientes CSS3. Revisited</title><content type='html'>Este tema &lt;a href=&quot;http://3nibbles.blogspot.com/2011/04/creacion-de-gradientes-css3.html&quot;&gt;ya lo vimos&lt;/a&gt; hace unos cuantos posts, pero han aparecido una serie de herramientas muy útiles que nos pueden facilitar la vida de la migración de CSS2 a CSS3. Hoy nos vamos a centrar en cómo convertir nuestras imágenes antiguas con gradientes a CSS3.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Colorzilla&lt;/b&gt;&lt;br /&gt;
El primero por sencillez de uso es el ya consabido &lt;a href=&quot;http://www.colorzilla.com/gradient-editor/&quot;&gt;colorzilla &lt;/a&gt;que ya vimos en su momento. Lo importante, es que ahora tiene dos botones que son &quot;Import from image&quot; e &quot;Import from CSS&quot; que convierten los ficheros subidos en el gradiente CSS3 correspondiente.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://zoompf.com/grad2css.html&quot;&gt;&lt;b&gt;Image Gradient to CSS Gradient (ImageG2CSS)&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;
Otra herramienta minimalista (o mínima) que come urls de imágenes y escupe el CSS3 correspondiente. Hacer más en menos no se puede hacer.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;PNG2CSS&lt;/b&gt;&lt;br /&gt;
Para los que quieran una herramienta offline para hacérselo en casita, pueden pasarse por el &lt;a href=&quot;https://github.com/bluesmoon/pngtocss&quot;&gt;github de este proyecto &lt;/a&gt;para descargarse los fuentes y compilar la herramienta de conversión.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Como conclusión, deciros que he probado las 3 alternativas y todas funcionan muy bien.</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/3516444641338280897/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/07/creacion-de-gradientes-css3-revisited.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/3516444641338280897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/3516444641338280897'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/07/creacion-de-gradientes-css3-revisited.html' title='Creación de gradientes CSS3. Revisited'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-7456142212097416845</id><published>2011-07-02T21:17:00.003+02:00</published><updated>2011-07-02T21:20:00.618+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="js"/><title type='text'>Plugin de pasos de wizard</title><content type='html'>Inevitable como las mareas... si hace unos días os presentaba los CSSs para generar pasos de wizard, ahora llega el plugin que automatiza la asignación de estilos para los vagos como yo.&lt;br /&gt;
&lt;br /&gt;
Como es habitual, el código con un ejemplo funcionando, en mi jsFiddle&lt;br /&gt;
&lt;iframe src=&quot;http://jsfiddle.net/jrdiaz/kbsMW/embedded/result,js,css,html/&quot; style=&quot;height: 450px; width: 100%;&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Y ahora el código completo del plugin&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;/**
 * jquery.steps-0.1,js - Steps plugin for jQuery
 *  ================================================
 *  (C) 2011 José Ramón Díaz - jrdiazweb@gmail.com
 * 
 * Instantiation: $(&#39;.stepsDiv&#39;).steps()
 * 
 * Functions:
 *     $(&#39;.stepsDiv&#39;).steps(&#39;getStep&#39;) - Returns current step for stepDiv
 *     $(&#39;.stepsDiv&#39;).steps(&#39;start&#39;)   - Resets state to initial step
 *     $(&#39;.stepsDiv&#39;).steps(&#39;finish&#39;)  - Sets state to completed
 *     $(&#39;.stepsDiv&#39;).steps(&#39;next&#39;)    - Sets state to next state
 *     $(&#39;.stepsDiv&#39;).steps(&#39;prev&#39;)    - Sets state to previous state
 *     
 * Classes needed and meaning
 *     N/A              - Uncompleted step. Greyed by default
 *     end              - Last uncompleted step. Greyed and no &quot;arrow&quot;
 *     last             - Boundary class. Marks last completed step and last step
 *     current          - Current step
 *     completed        - Completed step
 *     completedLast    - Last completed step
 *     completedLastEnd - Last step when all steps are completed
 * 
 * Extending steps with representation
 *     You can also use the steps CSS. You can find it at
 *     http://3nibbles.blogspot.com/2011/06/pasos-de-wizard.html
 *     
 * Legal stuff
 *     You are free to use this CSS, but you must give credit or keep header intact.
 *     Please, tell me if you find it useful. An email will be enough.
 *     If you enhance this code or correct a bug, please, tell me.
 * 
 */
(function( $ ){

 $.fn.steps = function( options ) {  
  
  var self = this;
  
  
  //////////////////////////////////////////////////////////////////////////////////
  // DEFAULT VALUES
  var defaults = {};

  //////////////////////////////////////////////////////////////////////////////////
  // PRIVATE FUNCTIONS
  var init = function( options ) {
   
   // If options exist, merge them with default settings
   if ( options ) $.extend( defaults, options );
  
   var $this = $(this);
   var data = $this.data(&#39;steps&#39;);
   
   return this.each(function() {
    
    var $this = $(this);
    data      = $this.data(&#39;steps&#39;);
    
    // The plugin hasn&#39;t been initialized yet
    if ( ! data ) {
     
     // Initializes the plugin data
     $(this).data(&#39;steps&#39;, { 
      target : $this,
      step   : 0
     });
 
    };
   });   
   
  };
  
  var destroy = function( ) { 
   return this.each(function() { self.removeData(&#39;steps&#39;); })
  };

  //////////////////////////////////////////////////////////////////////////////////
  // PUBLIC FUNCTIONS
  var methods = {
    getStep: function( ) { return self.data(&#39;steps&#39;)[&#39;step&#39;]; },
    start:   function( ) { return methods.setStep(0); },
    finish:  function( ) { 
     var l = self.find(&#39;ul li&#39;).length;
     methods.setStep(l);
     self.data(&#39;steps&#39;)[&#39;step&#39;] = l; 
     return l;
    },
    prev:    function( ) { 
     var step = methods.getStep();
     var l    = self.find(&#39;ul li&#39;).length;
     if(step == l) step = step-1;
     return methods.setStep(step - 1); 
    },
    next:    function( ) {  
     return methods.setStep(methods.getStep() + 1);
    },
    setStep: function( stepNumber ) {  
     // Sets the step number
     var l = self.find(&#39;ul li&#39;).length;
     if(stepNumber &lt; 0) stepNumber = 0;
     if(stepNumber &gt; l) stepNumber = l;
     
     // Resets styles
     self.find(&#39;ul li&#39;).removeClass(&#39;current completed completedLast last end completedLastEnd&#39;);

     // Styles for intermediate steps
     self.find(&#39;ul li:lt(&#39; + ((stepNumber &lt; l) ? stepNumber : l-1) + &#39;)&#39;).addClass(&#39;completed&#39;);

     if(stepNumber &gt; 0 &amp;&amp; stepNumber &lt; l) 
      self.find(&#39;ul li:nth(&#39; + (stepNumber-1) + &#39;)&#39;).addClass(&#39;completedLast&#39;);
     if(stepNumber &lt; l)
      self.find(&#39;ul li:nth(&#39; + stepNumber + &#39;)&#39;).addClass(&#39;current&#39;);

     // Last step style
     if(stepNumber == l)  
      self.find(&#39;ul li:last&#39;).addClass(&#39;completedLastEnd&#39;);
     //if(stepNumber == l-1)  
     // self.find(&#39;ul li:last&#39;).addClass(&#39;currentEnd&#39;);
     else 
      self.find(&#39;ul li:last&#39;).addClass(&#39;end&#39;);
     
     self.data(&#39;steps&#39;)[&#39;step&#39;] = stepNumber; 
     return stepNumber;
    }
    
  };
  
  /////////////////////////////////////////////////////////////////////////////////////
  // Decides what to do
  if ( methods[options] ) {
   return methods[options].apply( self, Array.prototype.slice.call( arguments, 1 ));
  } else if ( typeof options === &#39;object&#39; || ! options ) {
   return init.apply( self, arguments );
  } else {
   //$.error( &#39;Method &#39; +  options + &#39; does not exist on jQuery.tooltip&#39; );
   return init.apply( self, {} );
  }    
    
 };
})( jQuery );

$(&#39;.steps&#39;).steps();&lt;/pre&gt;
El uso es muy sencillo. Sobre el elemento contenerdor de los pasos (.steps en nuestro caso) se invoca la función &quot;.steps()&quot; para inicializar el plugin y posteriormente se pueden llamar a los métodos definidos mediante &quot;obj.steps(&quot;metodo&quot;, [param]);&quot;

Los métodos de los que se deispone son:

&lt;ul&gt;&lt;li&gt;&#39;getStep&#39; - Estado en el que se encuentra&lt;/li&gt;
&lt;li&gt;&#39;start&#39; - Resetea el estado al principio&lt;/li&gt;
&lt;li&gt;&#39;finish&#39; - Finaliza todos los pasos&lt;/li&gt;
&lt;li&gt;&#39;next&#39; - Siguiente estado&lt;/li&gt;
&lt;li&gt;&#39;prev&#39; - Estado anterior&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
La versión minimizada es poco más de 1Kb (a un 10% Wow!) y la comprimida aún menos. Ya no hay excusas para usarlo.</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/7456142212097416845/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/07/plugin-de-pasos-de-wizard.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/7456142212097416845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/7456142212097416845'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/07/plugin-de-pasos-de-wizard.html' title='Plugin de pasos de wizard'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-2951614031114281121</id><published>2011-07-01T09:00:00.002+02:00</published><updated>2011-07-01T09:55:22.595+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSS"/><title type='text'>In defense of CSS hacks — introducing “safe CSS hacks”</title><content type='html'>Magnífico artículo que resume todas las técnicas de hacks de CSS para Internet Explorer con sus pros y contras (por qué solo hay hacks para Internet Explorer? /ironic_mode off).&lt;br /&gt;
&lt;br /&gt;
Lo incluyo entero como referencia pero podéis consultarlo online en &lt;a href=&quot;http://mathiasbynens.be/notes/safe-css-hacks&quot;&gt;ésta dirección&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: white; color: #333333; font-family: &#39;Lucida Grande&#39;,sans-serif; font-size: 14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 23px; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h1 style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 21px; font-weight: normal; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;In defense of CSS hacks — introducing “safe CSS hacks”&lt;/h1&gt;&lt;div class=&quot;meta&quot; style=&quot;font-size: 12px; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: -1em;&quot;&gt;&lt;time datetime=&quot;2011-05-19&quot; pubdate=&quot;&quot;&gt;19th May 2011&lt;/time&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;How do&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;you&lt;/i&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;target Internet Explorer in your CSS? Do you use CSS hacks, conditional stylesheets or something else?&lt;/div&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;It’s the perfect trollbait. There have been plenty of discussions about this, and I don’t mean to start a new one. Everyone’s entitled to their own opinion, but the thing is that it’s not purely a philosophical matter. I am writing this article because I noticed there’s a lot of misunderstanding on the subject of CSS hacks.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;People have been advocating three different approaches: conditional stylesheets, CSS hacks, or conditional classnames. All these techniques have their pros and cons. Let’s take a look.&lt;/div&gt;&lt;h2 id=&quot;conditional-stylesheets&quot; style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 21px; font-weight: normal; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Conditional stylesheets&lt;/h2&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ms537512.aspx&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;Conditional comments&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;make it very easy to specify stylesheets that should only be loaded in Internet Explorer, or even in specific versions of that browser. Non-IE browsers treat conditional comments as any other HTML comment. Here’s an example:&lt;/div&gt;&lt;pre style=&quot;-webkit-transition-delay: initial, initial; -webkit-transition-duration: 0.25s, 0.25s; -webkit-transition-property: background, -webkit-box-shadow; -webkit-transition-timing-function: linear, linear; background-attachment: initial; background-clip: initial; background-color: #e3e3e3; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px; white-space: pre-wrap; word-wrap: break-word;&quot;&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 0px; border-color: initial; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 0px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 0px; border-style: initial; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 0px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;&amp;lt;!--[if lte IE 8]&amp;gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;lte-ie-8.css&quot;&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;&amp;lt;!--[if lte IE 7]&amp;gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;lte-ie-7.css&quot;&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;&amp;lt;!--[if lte IE 6]&amp;gt;&amp;lt;link rel=&quot;stylesheet&quot; href=&quot;lte-ie-6.css&quot;&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;This snippet will cause&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;lte&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;ie&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: #006666;&quot;&gt;8.css&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;to be loaded in IE8, IE7, IE6 and even in IE5. (Older IE versions don’t support conditional comments.) In IE7 and older versions,&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;lte&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;ie&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: #006666;&quot;&gt;7.css&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;will be loaded as well. In IE6 all three additional stylesheets will be loaded.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;If you want to use this technique to style an element differently in specific versions of Internet Explorer, it’d look something like this:&lt;/div&gt;&lt;pre style=&quot;-webkit-transition-delay: initial, initial; -webkit-transition-duration: 0.25s, 0.25s; -webkit-transition-property: background, -webkit-box-shadow; -webkit-transition-timing-function: linear, linear; background-attachment: initial; background-clip: initial; background-color: #e3e3e3; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px; white-space: pre-wrap; word-wrap: break-word;&quot;&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 0px; border-color: initial; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 0px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 0px; border-style: initial; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 0px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;/* Main stylesheet */&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;foo &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; black&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;/* lte-ie-8.css, for IE8 and older */&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;foo &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; green&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;/* lte-ie-7.css, for IE7 and older */&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;foo &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; blue&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;/* lte-ie-6.css, for IE6 and older */&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;foo &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; red&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 16px; font-weight: bold; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Pros&lt;/h3&gt;&lt;ul style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;The conditional comments snippet is valid HTML.&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;Since there’s no need to use CSS hacks, you can even write valid CSS if you want to.&lt;/li&gt;
&lt;/ul&gt;&lt;h3 style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 16px; font-weight: bold; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Cons&lt;/h3&gt;&lt;ul style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;Performance decreases due to the multiple additional HTTP requests, depending on the browser.&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;&lt;a href=&quot;http://www.phpied.com/conditional-comments-block-downloads/&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;Conditional comments block downloads in IE&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;unless another (possibly empty) conditional comment is included earlier in the source.&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;The total file size increases, since the conditional comments have to be repeated for every HTML single document, and you’ll have to repeat the selector in every CSS file. More typing work!&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;Maintainability is negatively affected. You now have to maintain four separate stylesheets instead of just one. Whenever you make changes to your main CSS file, you need to remember to change the IE-specific CSS files if necessary.&lt;/li&gt;
&lt;/ul&gt;&lt;h2 id=&quot;conditional-classnames&quot; style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 21px; font-weight: normal; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Conditional classnames&lt;/h2&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Those not willing to use CSS hacks can always apply&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;conditional classnames&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;to the&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;tag&quot; style=&quot;color: #000088;&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;or&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;tag&quot; style=&quot;color: #000088;&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;element. This approach allows you to write clean and hack-free CSS at the cost of adding&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;del&gt;&lt;/del&gt;&lt;br /&gt;
hacks&lt;br /&gt;
&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;ins&gt;conditional comments&lt;/ins&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;to your HTML.&lt;/div&gt;&lt;pre style=&quot;-webkit-transition-delay: initial, initial; -webkit-transition-duration: 0.25s, 0.25s; -webkit-transition-property: background, -webkit-box-shadow; -webkit-transition-timing-function: linear, linear; background-attachment: initial; background-clip: initial; background-color: #e3e3e3; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px; white-space: pre-wrap; word-wrap: break-word;&quot;&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 0px; border-color: initial; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 0px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 0px; border-style: initial; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 0px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;&amp;lt;!--[if lt IE 7]&amp;gt;&amp;lt;html class=&quot;ie6&quot;&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;&amp;lt;!--[if IE 7]&amp;gt; &amp;nbsp; &amp;lt;html class=&quot;ie7&quot;&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;&amp;lt;!--[if IE 8]&amp;gt; &amp;nbsp; &amp;lt;html class=&quot;ie8&quot;&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;&amp;lt;!--[if gt IE 8]&amp;gt;&amp;lt;!--&amp;gt;&lt;/span&gt;&lt;span class=&quot;tag&quot; style=&quot;color: #000088;&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;&amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;This allows you to keep your browser-specific CSS in the same file:&lt;/div&gt;&lt;pre style=&quot;-webkit-transition-delay: initial, initial; -webkit-transition-duration: 0.25s, 0.25s; -webkit-transition-property: background, -webkit-box-shadow; -webkit-transition-timing-function: linear, linear; background-attachment: initial; background-clip: initial; background-color: #e3e3e3; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px; white-space: pre-wrap; word-wrap: break-word;&quot;&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 0px; border-color: initial; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 0px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 0px; border-style: initial; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 0px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;foo &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; black&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;ie8 &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;foo &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; green&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;/* IE8 */&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;ie7 &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;foo &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; blue&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;/* IE7 */&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;ie6 &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;foo &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; red&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;/* IE6 and IE5 (but who cares, right?) */&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 16px; font-weight: bold; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Pros&lt;/h3&gt;&lt;ul style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;The conditional classes snippet is valid HTML. (Prior to HTML5, you would have to add the classes to the&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;tag&quot; style=&quot;color: #000088;&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;&lt;/code&gt;element instead.)&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;Since there’s no need to use CSS hacks, you can even write valid CSS if you want to.&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;No additional HTTP requests are being issued to get the IE-specific styles.&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;In this particular case, the conditional comments&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/#comment-33260&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;don’t block downloads&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;h3 style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 16px; font-weight: bold; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Cons&lt;/h3&gt;&lt;ul style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;This technique increases the file size of every HTML document you use it for.&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;The use of the IE-specific classnames automatically increases the specificity of your selectors, which may not be what you want.&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;Since you’ll need the classnames in the selectors, you’ll have to use separate CSS rules for IE-specific styles.&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;The&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#charset&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;character encoding declaration&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;(e.g.&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;tag&quot; style=&quot;color: #000088;&quot;&gt;&amp;lt;meta&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;atn&quot; style=&quot;color: #660066;&quot;&gt;charset&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;atv&quot; style=&quot;color: #008800;&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;tag&quot; style=&quot;color: #000088;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;) should be placed within the first 1024 bytes of the HTML document. Using this technique, you may cross this limit, especially if you’re adding lots of other attributes to the&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;tag&quot; style=&quot;color: #000088;&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;element (since you’ll have to repeat them inside every conditional comment).&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;Using conditional comments around the opening&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;tag&quot; style=&quot;color: #000088;&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;tag&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://github.com/paulirish/html5-boilerplate/issues/378&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;throws IE into compatibility view&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;unless you set the&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;UA&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;typ&quot; style=&quot;color: #660066;&quot;&gt;Compatible&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;header in a server-side config.&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;Simon Pieters&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://twitter.com/zcorpan/status/71149993297330177&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;reports&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;that using conditional comments before&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;tag&quot; style=&quot;color: #000088;&quot;&gt;&amp;lt;meta&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;atn&quot; style=&quot;color: #660066;&quot;&gt;http-equiv&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;atv&quot; style=&quot;color: #008800;&quot;&gt;&quot;X-UA-Compatible&quot;&lt;/span&gt;&lt;span class=&quot;tag&quot; style=&quot;color: #000088;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;causes IE to ignore the&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;tag&quot; style=&quot;color: #000088;&quot;&gt;&amp;lt;meta&amp;gt;&lt;/span&gt;&lt;/code&gt;. So again, you’ll need to set the&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;X&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;UA&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;typ&quot; style=&quot;color: #660066;&quot;&gt;Compatible&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;header in a server-side config.&lt;/li&gt;
&lt;/ul&gt;&lt;h2 id=&quot;css-hacks&quot; style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 21px; font-weight: normal; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;CSS hacks&lt;/h2&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Paul Irish maintains&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://paulirish.com/2009/browser-specific-css-hacks/&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;a comprehensive list of CSS hacks for various browsers&lt;/a&gt;. In reality, you’ll rarely need to specifically target anything but IE. Here’s an overview of the three most popular CSS hacks and which browsers they’re supposed to target:&lt;/div&gt;&lt;pre style=&quot;-webkit-transition-delay: initial, initial; -webkit-transition-duration: 0.25s, 0.25s; -webkit-transition-property: background, -webkit-box-shadow; -webkit-transition-timing-function: linear, linear; background-attachment: initial; background-clip: initial; background-color: #e3e3e3; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px; white-space: pre-wrap; word-wrap: break-word;&quot;&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 0px; border-color: initial; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 0px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 0px; border-style: initial; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 0px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;foo &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&amp;nbsp; color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; black&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&amp;nbsp; color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; green&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: #006666;&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;/* IE8 and older, but there’s more… */&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; blue&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;/* IE7 and older */&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&amp;nbsp; _color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; red&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;/* IE6 and older */&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Note the use of the&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: #006666;&quot;&gt;9&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;CSS hack. Web developers noticed it could be used to easily target IE8 and older versions, so that’s what they did. But then there was IE9, and as it turned out,&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;the final IE9 release was still affected by this hack&lt;/b&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;(despite&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://connect.microsoft.com/IE/feedback/details/597287/css-parser-bug-foo-property-value-9-is-parsed-as-foo-property-value&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot; title=&quot;CSS parser bug: &amp;lt;code&amp;gt;.foo { property: value\9; }&amp;lt;/code&amp;gt; is parsed as &amp;lt;code&amp;gt;.foo { property: value; }&amp;lt;/code&amp;gt;&quot;&gt;my bug report on the matter&lt;/a&gt;). All those CSS declarations that were meant to be for IE8 and earlier versions only, now got interpreted by IE9 as well. Needless to say, stuff broke, since IE9 doesn’t need most of the IE8-specific CSS fixes.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;This is the perfect example of an&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;unsafe CSS hack&lt;/b&gt;.&lt;/div&gt;&lt;h3 id=&quot;safe-css-hacks&quot; style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 16px; font-weight: bold; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Safe CSS hacks&lt;/h3&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;So what constitutes a “safe” CSS hack? What makes me even think there is such a thing?&lt;/div&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Let’s face it — CSS hacks are still hacks. There’s no way to accurately predict how future browser versions will parse these rules. But we can make an educated guess — some hacks are less hacky than others. A&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;i&gt;safe&lt;/i&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;CSS hack is a CSS hack that:&lt;/div&gt;&lt;ul style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;works in specific versions of a given web browser;&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;is unlikely to be parsed by all other browsers, including future versions.&lt;/li&gt;
&lt;/ul&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Take the&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;_property&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;value&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;hack, for example. The&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.w3.org/TR/CSS21/syndata.html#vendor-keywords&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;CSS 2.1 spec&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;says the following:&lt;/div&gt;&lt;blockquote cite=&quot;http://www.w3.org/TR/CSS21/syndata.html#vendor-keywords&quot; style=&quot;border-bottom-width: 0px; border-color: initial; border-left-color: rgb(227, 227, 227); border-left-style: solid; border-left-width: 5px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 10px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Keywords and&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.w3.org/TR/CSS21/syndata.html#properties&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;property names&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;beginning with&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;or&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;_&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;are reserved for vendor-specific extensions.&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote cite=&quot;http://www.w3.org/TR/CSS21/syndata.html#properties&quot; style=&quot;border-bottom-width: 0px; border-color: initial; border-left-color: rgb(227, 227, 227); border-left-style: solid; border-left-width: 5px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 10px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;A property name is an&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;identifier&lt;/a&gt;.&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote cite=&quot;http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier&quot; style=&quot;border-bottom-width: 0px; border-color: initial; border-left-color: rgb(227, 227, 227); border-left-style: solid; border-left-width: 5px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 10px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;zA&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;Z0&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: #006666;&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;and ISO 10646 characters&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;U&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: #006666;&quot;&gt;00A0&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;and higher, plus the hyphen (&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;/code&gt;) and the underscore (&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;_&lt;/span&gt;&lt;/code&gt;); they cannot start with a digit, two hyphens, or a hyphen followed by a digit.&lt;/div&gt;&lt;/blockquote&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;So who’s to say there will never be a property name starting with an underscore character? To quote&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://www.w3.org/TR/css3-syntax/#vendor-specific&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;the CSS3 spec&lt;/a&gt;:&lt;/div&gt;&lt;blockquote cite=&quot;http://www.w3.org/TR/css3-syntax/#vendor-specific&quot; style=&quot;border-bottom-width: 0px; border-color: initial; border-left-color: rgb(227, 227, 227); border-left-style: solid; border-left-width: 5px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 10px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Although [the underscore] is a valid start character, the CSS Working Group believes it will never define any identifiers that start with that character.&lt;/div&gt;&lt;/blockquote&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Both the&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;_property&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;value&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;and&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;value&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;hacks (as seen in the above code block) are examples of safe CSS hacks. They were discovered, identified as bugs, and patched in a browser update. Since then, it’s very likely that Microsoft and other browser vendors added checks for these CSS hacks to their layout tests, to make sure no new browser version is shipped with a regression this significant.&lt;/div&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;If you discover a CSS hack in the latest version of a certain browser, it won’t be a safe hack until an updated version of that browser is released where the parser bug is fixed. For example, some people (myself included) have been looking for an IE9-specific CSS hack. Recently,&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://blog.vervestudios.co/blog/post/2011/05/13/IE9-Only-CSS-Hack.aspx&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot; title=&quot;CSS hack for IE9&quot;&gt;one was found&lt;/a&gt;, but we’ll have to wait at least until the final IE10 release to use it, because IE10 may or may not be shipped with the same CSS parser bug. We can’t risk repeating the history of the&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;lit&quot; style=&quot;color: #006666;&quot;&gt;9&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;hack.&lt;/div&gt;&lt;h3 style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 16px; font-weight: bold; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Pros&lt;/h3&gt;&lt;ul style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;You don’t have to add conditional comments to every single HTML page.&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;No additional HTTP requests are being issued to get the IE-specific styles.&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;The specificity of your CSS selectors is preserved.&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;There’s no need to repeat CSS rules — you can just add extra declarations (with the hacks) to the declaration block.&lt;/li&gt;
&lt;/ul&gt;&lt;h3 style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 16px; font-weight: bold; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Cons&lt;/h3&gt;&lt;ul style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;They’re called CSS hacks for a reason — only use&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://mathiasbynens.be/notes/safe-css-hacks#safe-css-hacks&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;safe CSS hacks&lt;/a&gt;.&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;There’s no safe CSS hack for IE8 (yet?).&lt;/li&gt;
&lt;li style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0px; margin-left: 30px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; position: relative;&quot;&gt;Contrary to conditional comments, most CSS hacks don’t validate. But then again, CSS3 properties and vendor-prefixed properties don’t validate either.&lt;/li&gt;
&lt;/ul&gt;&lt;h2 style=&quot;border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-size: 21px; font-weight: normal; list-style-image: initial; list-style-position: initial; list-style-type: none; margin-bottom: 0.5em; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;Combining conditional classnames with safe CSS hacks&lt;/h2&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Safe CSS hacks are preferable to conditional stylesheets or classnames, but what if you have to write IE9-specific styles?&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;http://mathiasbynens.be/notes/safe-css-hacks#safe-css-hacks&quot; style=&quot;-webkit-transition-delay: initial; -webkit-transition-duration: 0.25s; -webkit-transition-property: background; -webkit-transition-timing-function: linear; background-attachment: initial; background-clip: initial; background-color: rgba(255, 255, 255, 0); background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; color: #007cd6; padding-bottom: 2px; padding-left: 1px; padding-right: 1px; padding-top: 2px; text-decoration: underline;&quot;&gt;By definition&lt;/a&gt;, there won’t be a safe CSS hack for IE9 at least until IE10 is released. Also, what about IE8? There is no safe CSS hack (that I know of) that targets IE8 but not IE9. What to do?&lt;/div&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;In the HTML, we can use a minimal version of the conditional classnames technique, like so:&lt;/div&gt;&lt;pre style=&quot;-webkit-transition-delay: initial, initial; -webkit-transition-duration: 0.25s, 0.25s; -webkit-transition-property: background, -webkit-box-shadow; -webkit-transition-timing-function: linear, linear; background-attachment: initial; background-clip: initial; background-color: #e3e3e3; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px; white-space: pre-wrap; word-wrap: break-word;&quot;&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 0px; border-color: initial; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 0px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 0px; border-style: initial; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 0px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;&amp;lt;!--[if lt IE 9]&amp;gt;&amp;lt;html class=&quot;lte-ie8&quot;&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;&amp;lt;!--[if gt IE 8]&amp;gt;&amp;lt;!--&amp;gt;&lt;/span&gt;&lt;span class=&quot;tag&quot; style=&quot;color: #000088;&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;&amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;We can then use&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 1px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 1px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 13px; padding-bottom: 1px; padding-left: 2px; padding-right: 2px; padding-top: 1px;&quot;&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;lte&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;ie8&lt;/span&gt;&lt;/code&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;as a styling hook in CSS selectors to target IE8 and older versions. Combined with safe CSS hacks, we can finally target IE8 and older versions without also affecting IE9:&lt;/div&gt;&lt;pre style=&quot;-webkit-transition-delay: initial, initial; -webkit-transition-duration: 0.25s, 0.25s; -webkit-transition-property: background, -webkit-box-shadow; -webkit-transition-timing-function: linear, linear; background-attachment: initial; background-clip: initial; background-color: #e3e3e3; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px; white-space: pre-wrap; word-wrap: break-word;&quot;&gt;&lt;code class=&quot;prettyprint&quot; style=&quot;border-bottom-color: rgb(222, 222, 222); border-bottom-style: solid; border-bottom-width: 0px; border-color: initial; border-left-color: rgb(222, 222, 222); border-left-style: solid; border-left-width: 0px; border-right-color: rgb(222, 222, 222); border-right-style: solid; border-right-width: 0px; border-style: initial; border-top-color: rgb(222, 222, 222); border-top-style: solid; border-top-width: 0px; font-family: Monaco, &#39;Lucida Console&#39;, monospace; font-size: 12px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot;&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;foo &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&amp;nbsp; color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; black&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;lte&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;ie8 &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;foo &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&amp;nbsp; color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; green&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;/* IE8 and older */&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&amp;nbsp; &lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; blue&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;/* IE7 and older */&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&amp;nbsp; _color&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; red&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt; &lt;/span&gt;&lt;span class=&quot;com&quot; style=&quot;color: #880000;&quot;&gt;/* IE6 and older */&lt;/span&gt;&lt;span class=&quot;pln&quot; style=&quot;color: black;&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;pun&quot; style=&quot;color: #666600;&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style=&quot;margin-bottom: 1em; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;This technique combines all the advantages of safe CSS hacks and conditional classnames, while minimizing the drawbacks.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/2951614031114281121/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/07/in-defense-of-css-hacks-introducing.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/2951614031114281121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/2951614031114281121'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/07/in-defense-of-css-hacks-introducing.html' title='In defense of CSS hacks — introducing “safe CSS hacks”'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-4151189932420065372</id><published>2011-06-30T14:31:00.002+02:00</published><updated>2011-07-02T21:06:40.492+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CSS"/><category scheme="http://www.blogger.com/atom/ns#" term="CSS3"/><title type='text'>Pasos de wizard</title><content type='html'>Hoy toca una entrada original 100% hecha por mí.&lt;br /&gt;
&lt;br /&gt;
Se me ha encaprichado el usar un wizard en cierto proyecto y además quería que los pasos a seguir en éste se vieran gráficamente de la mejor manera posible, además de que fuera configurable y lo que me ha salido es ésto.&lt;br /&gt;
&lt;br /&gt;
&lt;img alt=&quot;&quot; height=&quot;153&quot; src=&quot;data:image/png;base64,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&quot; width=&quot;640&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
Para el código completo, podéis pasaros por mi JSFiffle&lt;br /&gt;
&lt;iframe src=&quot;http://jsfiddle.net/jrdiaz/CFhZG/embedded/result,css,html/&quot; style=&quot;height: 450px; width: 100%;&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
Os pongo el CSS completo, que está autocomentado para que os lo podáis llevar a la cama como lectura de dormitorio.&lt;br /&gt;
&lt;pre class=&quot;brush:css&quot;&gt;/**
 *  Steps UL/LI styles.
 *  ================================================
 *  (C) 2011 José Ramón Díaz - jrdiazweb@gmail.com
 *
 *  Useful wizard step indications
 *
 *  Sample:
 *   &lt;div class=&quot;steps&quot;&gt;*    
&lt;ul class=&quot;blue&quot;&gt;*
&lt;li class=&quot;completed&quot;&gt;&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=3390721125845655478&amp;amp;postID=4151189932420065372#&quot;&gt;&lt;em&gt;Step 1&lt;/em&gt;Description of step 1&lt;/a&gt;&lt;/li&gt;
*
&lt;li class=&quot;last completed&quot;&gt;&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=3390721125845655478&amp;amp;postID=4151189932420065372#&quot;&gt;&lt;em&gt;Step 2&lt;/em&gt;Description of step 2&lt;/a&gt;&lt;/li&gt;
*
&lt;li class=&quot;current&quot;&gt;&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=3390721125845655478&amp;amp;postID=4151189932420065372#&quot;&gt;&lt;em&gt;Step 3&lt;/em&gt;Description of step 3&lt;/a&gt;&lt;/li&gt;
*
&lt;li class=&quot;&quot;&gt;&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=3390721125845655478&amp;amp;postID=4151189932420065372#&quot;&gt;&lt;em&gt;Step 4&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
*
&lt;li class=&quot;&quot;&gt;&lt;a href=&quot;http://www.blogger.com/post-edit.g?blogID=3390721125845655478&amp;amp;postID=4151189932420065372#&quot;&gt;&lt;em&gt;Step 5&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
*    &lt;/ul&gt;*   &lt;/div&gt;*
 *  Classes
 *   N/A              - Uncompleted step. Greyed by default
 *   end              - Last uncompleted step. Greyed and no &quot;arrow&quot;. Modern browsers just need &quot;last&quot; class instead of end.
 *   last             - Boundary class. Marks last completed step and last step. Used only by modern browsers (the ones with the ability of interpret multiple classes for one element)
 *   current          - Current step
 *   completed        - Completed step. Lighter color
 *   completedLast    - Last completed step. Older browsers compatibility. Modern browsers just need &quot;last completed&quot; classes
 *   completedLastEnd - Last step when all steps are completed. Older browsers compatibility. Modern browsers just need &quot;last completed&quot; classes
 *
 *  If you plan to use only actual browsers just need the classes &quot;&quot;, &quot;current&quot; and &quot;completedLast OR &quot;last completed&quot;
 *  If you need full browsers compatibiliy, you need &quot;&quot;, &quot;end&quot;, &quot;current&quot;, &quot;completed&quot;, &quot;completedLast&quot; and &quot;completedLastEnd&quot;
 *
 * Extending steps with jQuery
 *     You can also use the steps jQuey plugin. You can find it at
 *     http://3nibbles.blogspot.com/2011/06/pasos-de-wizard.html
 *     
 *  Legal stuff
 *      You are free to use this CSS, but you must give credit or keep header intact.
 *      Please, tell me if you find it useful. An email will be enough.
 *      If you enhance this code or correct a bug, please, tell me.
 */
/* Display styles */
.steps { clear: both; font-family: Arial; font-size: 12px; text-align: left; }
  .steps ul { display: table; table-layout: fixed; width: 100%; }
    .steps ul li { display: table-cell; list-style:none; vertical-align: middle;
                   _display: inline; *width: 120px; /* IE6/7 Hacks */ }

    /* CSS2.x browsers and IE fill width hacks - To fill 100% width they need to set the number the steps in the UL */
    .steps ul.1step li,  .steps ul.2steps li, .steps ul.3steps li, .steps ul.4steps li, .steps ul.5steps li,
    .steps ul.6steps li, .steps ul.7steps li, .steps ul.8steps li, .steps ul.9steps li, .steps ul.10steps li { display: inline; float:left; }
    .steps ul.1step  li  { width: 100%; }
    .steps ul.2steps li  { width: 50%;  }
    .steps ul.3steps li  { width: 33%;  }
    .steps ul.4steps li  { width: 25%;  }
    .steps ul.5steps li  { width: 20%;  }
    .steps ul.6steps li  { width: 16%;  }
    .steps ul.7steps li  { width: 14%;  }
    .steps ul.8steps li  { width: 12%;  }
    .steps ul.9steps li  { width: 11%;  }
    .steps ul.10steps li { width: 10%;  }

      .steps ul li.current {}
      .steps ul li.last a { }
      .steps ul li.completed {}
        .steps ul li.completed.last, .steps ul li.completedLast {}

      .steps ul li a { display:block; text-decoration:none; font-weight: normal; }
        .steps ul li.completed a:hover, .steps ul li.completed.last a:hover, .steps ul li.completedLast a:hover { cursor:pointer; }

        .steps ul li a em, .steps ul li a strong, .steps ul li a span, .steps ul li em, .steps ul li strong, .steps ul li span { display:block; font-style:normal; }
        .steps ul li a em, .steps ul li a strong, .steps ul li em, .steps ul li strong { font-weight:bold; }
        .steps ul li a span, .steps ul li a div, .steps ul li span, .steps ul li div  { height: 45px; /* For even heights */ }

/* Default colors */
.steps { text-shadow: 1px 1px #777; color:#CCCCCC; }
        .steps ul li a:link, .steps ul li a:visited, .steps ul li a:hover, .steps ul li a:active { color:#CCCCCC; }
        .steps ul li.completed.last a, .steps ul li.completed.last a:link, .steps ul li.completed.last a:visited, .steps ul li.completed.last a:hover, .steps ul li.completed.last a:active, .steps ul li.current a,
        .steps ul li.completedLast a, .steps ul li.completedLast a:link, .steps ul li.completedLast a:visited, .steps ul li.completedLast a:hover, .steps ul li.completedLast a:active,
        .steps ul li.completedLastEnd a, .steps ul li.completedLastEnd a:link, .steps ul li.completedLastEnd a:visited, .steps ul li.completedLastEnd a:hover, .steps ul li.completedLastEnd a:active,
        .steps ul li.current a, .steps ul li.current a:link, .steps ul li.current a:visited, .steps ul li.current a:hover,  .steps ul li.current a:active,
        .steps ul li.completed a, .steps ul li.completed a:link, .steps ul li.completed a:visited, .steps ul li.completed a:hover, .steps ul li.completed a:active
         { color:#FFFFFF; }
        .steps ul li.completed a:hover, .steps ul li.completed.last a:hover, .steps ul li.completedLast a:hover { color:#FFFF99; }

/* Color themes - No images */
      .steps ul li { padding: 0 5px 0 5px; background-color: #EBEBEB; }
        .steps ul li.current { background-color:#6699CC; }
        .steps ul li.last {  }
        .steps ul li.completed { background-color:#3366CC; }
        .steps ul li.completed.last, .steps ul li.completedLast { }

/* Color themes - Blue images theme. Sprites size: 23px x 71px */
     .steps ul.blue li { height:71px; padding: 0 20px 0 5px;
                          background: #EBEBEB url(&quot;data:image/gif;base64, R0lGODlhFwBjAcQfAP39/Yuv29fh7PLy8mWRxqDB5eXl5Xij0zdytVaJw8vc8Pr6+uDp8/j4+O7u7vX19Ud+vfb29rzN4Ojo6PH0+Wuc0erw9vj6/PX4+77R5/v7+3adxmaZzDNmzOvr6wAAACH5BAEAAB8ALAAAAAAXAGMBAAX/4CeOZGmeaKqubOu+cCzPdG3feK7vfO//wKBwSCwaj8ikcslsOp/QqHRKrVqv2OIAAPB4v+Bw2MHtis/hCdmMbnvWbPd5LW/D6+j1BC+elB18Y2WBgnGEd4RfeoleflyMXmsDkI4AgIyImI+QmYmLjJWQb4Ocm5qmnqiHpKd7oH+lqoF0sYazsnyhsa6Juqe2eGXAcmsPr1yTqcNyvquWkKzOvLe4ddHUyYll2djHy25rl4TN1NN8nYFl5niS0NXEXMa926figeTn73LXfOqn3Om4rKtTzB0AgOyQeYtlL+A3N8gG1hGwAIC8RBUKLGgAiUOAig8MJOKQscECRhw8/4KUiCYlhwIRFiB04/KAAossxbh8+cBioJ0VFGz8uTNAz5B4dpKE+ayOUg4HtjzI6eUpT5lOn9rcSNWqx6Mi23gteZKmV6M4xY6FibWlV6g3p7p9W+CBhpke3qbMyPWM3pRokYb5u7SBBr+Eo6YFQzglW4CN4fb9EvnrXcaRyfKq/NWigc+cM0boApqz4qkGODt+IDO1aps4VTu2OEB2UIsOZAd2XdmmBo68I9fVEDJ4YqmuODPN1hs55cYlNdiLHHga9AImGzauPvhv0N+I9db1rFMvbLnl6ca82N3raYlvRTcN/5T7XKVkG7ZXav++y4zgyWHVbgIqdUABARa40/9w7KlVk3NZucSUfve9x8d/2ElHVGfoJVXYAhSqReBPAHI00niCBXLgYoQ8BgmE2hyUQAc01mjjjTZKwIUAOPaIIwIBAIDBBj4WSeMBAFAgAAJG+ghBAA0AcECTPlaggZIQUPljABpoIIGWOCbAAAMWzAimjVwqeaaNT2Iw5Jo1HnDlknB2AKQGAHxZZwIRUGBBlnDemWedHSSQgQUUEEConEoyCeeTXOgJZwV9/lmnoJKuaaifZsIZQAQX8FhnmxgoWucBoNL5KJSD1klApYCuCWSUmZ5pqAAXdLomqqES+iQDXhJKqZ+EAjlarWDySeuln1pEqKEVIavlRweNmgH/AA1I2ySqzsJpKAALaFuksa1qmqqpZ5IrbpGvhqqrlpjWSWmosYIJwbXlnsmtBPVqeS+4RHp6rKO2ZhAqumDeGay3qb5LZbyTNvwovuv6uG+/VP4LQMC74ikBwckOQAEFHCfMZb7JnhtoBh67eqzDTSLAMgAByOsxxk1CsAXNp3oMsr87lwzmyR97K7IFCA/dcp0ONNAAzFSCW4BsKVnAxdSyISAAAAJQ3YGcAGDNWQcQCNClbDRaiYECqtEoaNs0JiDA2mPXyOUFYhPGpsEWVHYjt3nrdaPMeEYWZgR06z04lxgcoPiNhl7Q918Wjxb4U07OTHmVoDIguI93Nv6W/5GGauC5V002e3lKOfON+radW5XxybJT2e7pO8H7qQaO565l5JO7pO9obAtvbwYMhG08mPPiLmuzxXvbUwNTB9rsAxzsmUFFBRAaJLijJh92zxZlr+lNC1Sfbpqna7qA5Ms/fLLYZxJwJe7mP6zA2b5TaSUF+MufkSCwPw1gjkqMCqAAnYS+2hkpSIlTSpPEBAAFsm5c+xOdA3uUAA1cwIIX7BEC9geAz/XISh804Y0gACwDqtBGSFLeC2nEQnA9zkYso8DqJAi5BfipMYMDlgw3V6MEJGmHB3SbEP1WIwIckYl2amHdOiCBKyGxdhBYAP+YKMQryg4C8UBbF2VjRA4MeNErY5RNA3RINQ6EAAA7&quot;) no-repeat right -71px;
                          _background: #EBEBEB url(&quot;../images/steps/blue_step_sprite.gif&quot;) no-repeat right -71px; /* IE6 needs phisical images */ }
        .steps ul.blue li.current { background-color:#6699CC; }
        .steps ul.blue li.completed, .steps ul.blue li.completedLast, .steps ul.blue li.completedLastEnd { background-color:#3366CC; }

/* Color themes - Green images theme. Sprites size: 23px x 71px */
      .steps ul.green li { height:71px; padding: 0 20px 0 5px;
                           background: #EBEBEB url(&quot;data:image/gif;base64,R0lGODlhFwBjAcQfAJ3MktXk0eTk5Pb29vDw8K/0kJnrdnSxZWepVsPZvu3t7Yf2U8Hyrfj5+O7y7enp6Yu/fl2iS/Pz87z1oeHs3ujv5+/07vT2873atvf391SdQoP+R////zajAObm5gAAACH5BAEAAB8ALAAAAAAXAGMBAAX/4CeOZGmeaKqubOu+cCzPdG3feK7vfO//wKBwSCwaj8ikcslsOp/QqHRKrVqv2OKAwxkovuCwWLztjs/jshfN/qrb7DccLZ+TuWv73azf5/sKdYCBeINuhYaEfIOCgI19j3aRkoiMlZaLmH+Ql46depNzoW2jpJ+gp6KpqpmcZgKGarCaiYqbfVwciaVnvL2rccDBrZTExbesyMmxwnTGy7TMz6bT1MrWu81p2tvX2Mzew+HO47/Vzufo5X7Z6+zg2em/7mAPvt3x9GDcYwX8YRsY/PuyYcFABRsCDkxoUB7AhAIdEky4gQI/igolYsy4bmPDjhsjltuYkEAzkhzn/6CsKGzlhJYrRbZZWdDkNJop0eBk+WynzDM7c4oJ+tJYUKFgjk5Q0OkoUoROLWZyuqHoH6pCsU6wuQZrTq9LC3lNOXZDADxlBXope3bAg7EvBxCASnVC24lU1SatyzQPVr17lfZ9eBRw4J1bWzk1fJhm4ltHLSIL+nPoTsk6cVa2TNPkNc2raC7wPDMmMJekS5PcDJTkY5WrT4ZMDYckVzshuW28jZsia9WjL0L8x5C3nuESCRowfvz3nOUHmSYH06CBggMdsmvfzn07huoBuovvrgFAAwkQxqvPDqGBgwAR1o9HAEBCg/TyxUMY8B5BfvIADJBBAv91dwAFFFSAXf+B2wX4HoPb0WcBehBqt9978VUYQYANEFhhBwcQ4EAF/lVYnoAeVnhAAhU4sGCFF8L3IX0ZdPhhBxCISOKHG6J444oWKHgjAARcEN6MAEz4IoQ5GpkhhPTZlyKEIY5YIoTlSfljAgFcsCSDTR5ZIX0UDHhjjiPeuCEBNn4YopYmEtkAAVv6+CGHCsyYwHlTFpjjnG7uKUGf+ZXHJqH5hWjkl4XKiah8igbAqHw9tslkkQFcWSACCdT46Hp/JqDpf5yehx+Ejj5Z4IqLxmknlZhOul6ln6oXpqzqcerph6GOmp+uGZwKJoqq/neAAg44IOx/J1rKYKS4jqdBAgM4u+r/odGKFwG1DQDAK4q+yoeAAjV6C2O1CRT7K7nB3omuupAqEGS24nFYq3oPSCABveI1MIABZW1QQQMZADxWBAE0UEBZOFZrMFYdIBDAABOMxd4AFywMcQfNeqXdAV1q7FSDGD8cVIQJZEwVdzkWPPJ221b78naKiowTgCWfbGDKNq80XssmozQftzvZWmTPG6nX4wVBY7TeigNQQJN8RLos9HqcXlCBz/I1ifQGv3J4NaRFSp10owT8e3aiKW/ttJ9s2swgp2U+fOkFZoPN4JoKJ6QimxIAHCebFQcqoAFDEizBjBQQjPi5DRROZQAZBK53gSdaoDGVGLt9eaMOU/TsmgAW5P35rBMPsHbXpPdMauok/bef5rGLS7kEY6tnnsq1q3dgA6a/Le3EFyzA9XgHYPy13+MhLODNPysPfXcIUDCA6tOz7HjR1JeJO/fcUetA071/LAHtOmungfVWg5/dAQ1YQH7u6z8/M4juzT92BNZjPzMG/NHf1RAgAYp5rAPsE6DQEFCjinksgWM5QAbkVxYIjkUC4wtYCAAAOw==&quot;) no-repeat right -71px;
                           _background: #EBEBEB url(&quot;../images/steps/green_step_sprite.gif&quot;) no-repeat right -71px; /* IE6 needs phisical images */ }
        .steps ul.green li.current { background-color:#83FE47; }
        .steps ul.green li.completed, .steps ul.green li.completedLast, .steps ul.green li.completedLastEnd { background-color:#36A300; }

/* Color themes - Sprite positions &amp;amp; default colors - MUST BE AT THE END! */
      .steps ul li { background-position: right -71px; }
        .steps ul li.current { background-position: right -142px; }
        .steps ul li.end, .steps ul li.last, .steps ul li.completedLastEnd { background-position: right top; }
        .steps ul li.completed { background-position: right -213px; }
        .steps ul li.completed:last-child, .steps ul li.completedLast, .steps ul li.completed.last { background-position: right -284px; } /* class &quot;last completed&quot; only supported by modern browsers */
        .steps ul li:last-child { background-position: right top; } /* CSS3 browsers */
&lt;/pre&gt;&lt;br /&gt;
La versión comprimida para los que quieran exprimir el máximo del ancho de banda y que se queda en unos míseros 7kb incluyendo las imágenes de los temas azul y verde, listo para cachear y reduciendo el número de peticiones de 13 a solamente 1 por usar sprites y convertir las imágenes a base64... no se puede pedir más.&lt;br /&gt;
&lt;pre class=&quot;brush:css&quot;&gt;/** Steps UL/LI styles. (C) 2011 José Ramón Díaz - jrdiazweb@gmail.com */
.steps{clear:both;font-family:Arial;font-size:12px;text-align:left;text-shadow:1px 1px #777;color:#CCC}
.steps ul{display:table;table-layout:fixed;width:100%}
.steps ul li{display:table-cell;list-style:none;vertical-align:middle;_display:inline;width:120px;background-color:#EBEBEB;background-position:right -71px;padding:0 5px}
.steps ul.1step li,.steps ul.2steps li,.steps ul.3steps li,.steps ul.4steps li,.steps ul.5steps li,.steps ul.6steps li,.steps ul.7steps li,.steps ul.8steps li,.steps ul.9steps li,.steps ul.10steps li{display:inline;float:left}
.steps ul.1step li{width:100%}
.steps ul.2steps li{width:50%}
.steps ul.3steps li{width:33%}
.steps ul.4steps li{width:25%}
.steps ul.5steps li{width:20%}
.steps ul.6steps li{width:16%}
.steps ul.7steps li{width:14%}
.steps ul.8steps li{width:12%}
.steps ul.9steps li{width:11%}
.steps ul.10steps li{width:10%}
.steps ul li a{display:block;text-decoration:none;font-weight:400}
.steps ul li.completed a:hover,.steps ul li.completed.last a:hover,.steps ul li.completedLast a:hover{cursor:pointer;color:#FF9}
.steps ul li a em,.steps ul li a strong,.steps ul li a span,.steps ul li em,.steps ul li strong,.steps ul li span{display:block;font-style:normal}
.steps ul li a em,.steps ul li a strong,.steps ul li em,.steps ul li strong{font-weight:700}
.steps ul li a span,.steps ul li a div,.steps ul li span,.steps ul li div{height:45px}
.steps ul li a:link,.steps ul li a:visited,.steps ul li a:hover,.steps ul li a:active{color:#CCC}
.steps ul li.completed.last a,.steps ul li.completed.last a:link,.steps ul li.completed.last a:visited,.steps ul li.completed.last a:hover,.steps ul li.completed.last a:active,.steps ul li.current a,.steps ul li.completedLast a,.steps ul li.completedLast a:link,.steps ul li.completedLast a:visited,.steps ul li.completedLast a:hover,.steps ul li.completedLast a:active,.steps ul li.completedLastEnd a,.steps ul li.completedLastEnd a:link,.steps ul li.completedLastEnd a:visited,.steps ul li.completedLastEnd a:hover,.steps ul li.completedLastEnd a:active,.steps ul li.current a,.steps ul li.current a:link,.steps ul li.current a:visited,.steps ul li.current a:hover,.steps ul li.current a:active,.steps ul li.completed a,.steps ul li.completed a:link,.steps ul li.completed a:visited,.steps ul li.completed a:hover,.steps ul li.completed a:active{color:#FFF}
.steps ul li.current{background-color:#69C;background-position:right -142px}
.steps ul li.completed{background-color:#36C;background-position:right -213px}
.steps ul.blue li{height:71px;background:#EBEBEB url(&quot;data:image/gif;base64, R0lGODlhFwBjAcQfAP39/Yuv29fh7PLy8mWRxqDB5eXl5Xij0zdytVaJw8vc8Pr6+uDp8/j4+O7u7vX19Ud+vfb29rzN4Ojo6PH0+Wuc0erw9vj6/PX4+77R5/v7+3adxmaZzDNmzOvr6wAAACH5BAEAAB8ALAAAAAAXAGMBAAX/4CeOZGmeaKqubOu+cCzPdG3feK7vfO//wKBwSCwaj8ikcslsOp/QqHRKrVqv2OIAAPB4v+Bw2MHtis/hCdmMbnvWbPd5LW/D6+j1BC+elB18Y2WBgnGEd4RfeoleflyMXmsDkI4AgIyImI+QmYmLjJWQb4Ocm5qmnqiHpKd7oH+lqoF0sYazsnyhsa6Juqe2eGXAcmsPr1yTqcNyvquWkKzOvLe4ddHUyYll2djHy25rl4TN1NN8nYFl5niS0NXEXMa926figeTn73LXfOqn3Om4rKtTzB0AgOyQeYtlL+A3N8gG1hGwAIC8RBUKLGgAiUOAig8MJOKQscECRhw8/4KUiCYlhwIRFiB04/KAAossxbh8+cBioJ0VFGz8uTNAz5B4dpKE+ayOUg4HtjzI6eUpT5lOn9rcSNWqx6Mi23gteZKmV6M4xY6FibWlV6g3p7p9W+CBhpke3qbMyPWM3pRokYb5u7SBBr+Eo6YFQzglW4CN4fb9EvnrXcaRyfKq/NWigc+cM0boApqz4qkGODt+IDO1aps4VTu2OEB2UIsOZAd2XdmmBo68I9fVEDJ4YqmuODPN1hs55cYlNdiLHHga9AImGzauPvhv0N+I9db1rFMvbLnl6ca82N3raYlvRTcN/5T7XKVkG7ZXav++y4zgyWHVbgIqdUABARa40/9w7KlVk3NZucSUfve9x8d/2ElHVGfoJVXYAhSqReBPAHI00niCBXLgYoQ8BgmE2hyUQAc01mjjjTZKwIUAOPaIIwIBAIDBBj4WSeMBAFAgAAJG+ghBAA0AcECTPlaggZIQUPljABpoIIGWOCbAAAMWzAimjVwqeaaNT2Iw5Jo1HnDlknB2AKQGAHxZZwIRUGBBlnDemWedHSSQgQUUEEConEoyCeeTXOgJZwV9/lmnoJKuaaifZsIZQAQX8FhnmxgoWucBoNL5KJSD1klApYCuCWSUmZ5pqAAXdLomqqES+iQDXhJKqZ+EAjlarWDySeuln1pEqKEVIavlRweNmgH/AA1I2ySqzsJpKAALaFuksa1qmqqpZ5IrbpGvhqqrlpjWSWmosYIJwbXlnsmtBPVqeS+4RHp6rKO2ZhAqumDeGay3qb5LZbyTNvwovuv6uG+/VP4LQMC74ikBwckOQAEFHCfMZb7JnhtoBh67eqzDTSLAMgAByOsxxk1CsAXNp3oMsr87lwzmyR97K7IFCA/dcp0ONNAAzFSCW4BsKVnAxdSyISAAAAJQ3YGcAGDNWQcQCNClbDRaiYECqtEoaNs0JiDA2mPXyOUFYhPGpsEWVHYjt3nrdaPMeEYWZgR06z04lxgcoPiNhl7Q918Wjxb4U07OTHmVoDIguI93Nv6W/5GGauC5V002e3lKOfON+radW5XxybJT2e7pO8H7qQaO565l5JO7pO9obAtvbwYMhG08mPPiLmuzxXvbUwNTB9rsAxzsmUFFBRAaJLijJh92zxZlr+lNC1Sfbpqna7qA5Ms/fLLYZxJwJe7mP6zA2b5TaSUF+MufkSCwPw1gjkqMCqAAnYS+2hkpSIlTSpPEBAAFsm5c+xOdA3uUAA1cwIIX7BEC9geAz/XISh804Y0gACwDqtBGSFLeC2nEQnA9zkYso8DqJAi5BfipMYMDlgw3V6MEJGmHB3SbEP1WIwIckYl2amHdOiCBKyGxdhBYAP+YKMQryg4C8UBbF2VjRA4MeNErY5RNA3RINQ6EAAA7&quot;) no-repeat right -71px;_background:#EBEBEB url(../images/steps/blue_step_sprite.gif) no-repeat right -71px;padding:0 20px 0 5px}
.steps ul.blue li.current{background-color:#69C}
.steps ul.blue li.completed,.steps ul.blue li.completedLast,.steps ul.blue li.completedLastEnd{background-color:#36C}
.steps ul.green li{height:71px;background:#EBEBEB url(data:image/gif;base64,R0lGODlhFwBjAcQfAJ3MktXk0eTk5Pb29vDw8K/0kJnrdnSxZWepVsPZvu3t7Yf2U8Hyrfj5+O7y7enp6Yu/fl2iS/Pz87z1oeHs3ujv5+/07vT2873atvf391SdQoP+R////zajAObm5gAAACH5BAEAAB8ALAAAAAAXAGMBAAX/4CeOZGmeaKqubOu+cCzPdG3feK7vfO//wKBwSCwaj8ikcslsOp/QqHRKrVqv2OKAwxkovuCwWLztjs/jshfN/qrb7DccLZ+TuWv73azf5/sKdYCBeINuhYaEfIOCgI19j3aRkoiMlZaLmH+Ql46depNzoW2jpJ+gp6KpqpmcZgKGarCaiYqbfVwciaVnvL2rccDBrZTExbesyMmxwnTGy7TMz6bT1MrWu81p2tvX2Mzew+HO47/Vzufo5X7Z6+zg2em/7mAPvt3x9GDcYwX8YRsY/PuyYcFABRsCDkxoUB7AhAIdEky4gQI/igolYsy4bmPDjhsjltuYkEAzkhzn/6CsKGzlhJYrRbZZWdDkNJop0eBk+WynzDM7c4oJ+tJYUKFgjk5Q0OkoUoROLWZyuqHoH6pCsU6wuQZrTq9LC3lNOXZDADxlBXope3bAg7EvBxCASnVC24lU1SatyzQPVr17lfZ9eBRw4J1bWzk1fJhm4ltHLSIL+nPoTsk6cVa2TNPkNc2raC7wPDMmMJekS5PcDJTkY5WrT4ZMDYckVzshuW28jZsia9WjL0L8x5C3nuESCRowfvz3nOUHmSYH06CBggMdsmvfzn07huoBuovvrgFAAwkQxqvPDqGBgwAR1o9HAEBCg/TyxUMY8B5BfvIADJBBAv91dwAFFFSAXf+B2wX4HoPb0WcBehBqt9978VUYQYANEFhhBwcQ4EAF/lVYnoAeVnhAAhU4sGCFF8L3IX0ZdPhhBxCISOKHG6J444oWKHgjAARcEN6MAEz4IoQ5GpkhhPTZlyKEIY5YIoTlSfljAgFcsCSDTR5ZIX0UDHhjjiPeuCEBNn4YopYmEtkAAVv6+CGHCsyYwHlTFpjjnG7uKUGf+ZXHJqH5hWjkl4XKiah8igbAqHw9tslkkQFcWSACCdT46Hp/JqDpf5yehx+Ejj5Z4IqLxmknlZhOul6ln6oXpqzqcerph6GOmp+uGZwKJoqq/neAAg44IOx/J1rKYKS4jqdBAgM4u+r/odGKFwG1DQDAK4q+yoeAAjV6C2O1CRT7K7nB3omuupAqEGS24nFYq3oPSCABveI1MIABZW1QQQMZADxWBAE0UEBZOFZrMFYdIBDAABOMxd4AFywMcQfNeqXdAV1q7FSDGD8cVIQJZEwVdzkWPPJ221b78naKiowTgCWfbGDKNq80XssmozQftzvZWmTPG6nX4wVBY7TeigNQQJN8RLos9HqcXlCBz/I1ifQGv3J4NaRFSp10owT8e3aiKW/ttJ9s2swgp2U+fOkFZoPN4JoKJ6QimxIAHCebFQcqoAFDEizBjBQQjPi5DRROZQAZBK53gSdaoDGVGLt9eaMOU/TsmgAW5P35rBMPsHbXpPdMauok/bef5rGLS7kEY6tnnsq1q3dgA6a/Le3EFyzA9XgHYPy13+MhLODNPysPfXcIUDCA6tOz7HjR1JeJO/fcUetA071/LAHtOmungfVWg5/dAQ1YQH7u6z8/M4juzT92BNZjPzMG/NHf1RAgAYp5rAPsE6DQEFCjinksgWM5QAbkVxYIjkUC4wtYCAAAOw==) no-repeat right -71px;_background:#EBEBEB url(../images/steps/green_step_sprite.gif) no-repeat right -71px;padding:0 20px 0 5px}
.steps ul.green li.current{background-color:#83FE47}
.steps ul.green li.completed,.steps ul.green li.completedLast,.steps ul.green li.completedLastEnd{background-color:#36A300}
.steps ul li.completed:last-child,.steps ul li.completedLast,.steps ul li.completed.last{background-position:right -284px}
.steps ul li.end,.steps ul li.last,.steps ul li.completedLastEnd,.steps ul li:last-child{background-position:right top}
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/4151189932420065372/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/06/pasos-de-wizard.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/4151189932420065372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/4151189932420065372'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/06/pasos-de-wizard.html' title='Pasos de wizard'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-9021694613688348837</id><published>2011-06-28T09:59:00.000+02:00</published><updated>2011-06-28T09:59:08.453+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="jQuery"/><category scheme="http://www.blogger.com/atom/ns#" term="js"/><title type='text'>Lazy load de vídeos</title><content type='html'>Seguimos exprimiendo milisegundos a la carga de páginas. Si nuestra página tiene vídeos, veremos como la instanciación del objeto del vídeo puede matar nuestro rendimiento, sobre todo si se tienen varios vídeos en una misma página. Para agilizarlo, la mejor manera es realizar la carga del objeto de reproducción bajo demanda de la misma manera que se hace por ejemplo en el navegador de Android. Vamos a ver dos aproximaciones, una con jQuery y otra con javascript, pero ambas se basan en &quot;ocultar&quot; el código real del objeto del reproductor con un comentario HTML poniendo delante una fachada de cartón piedra para ocupar el espacio del vídeo. Una vez se hace ckick en el hueco del vídeo, se elimina el comentario y se carga el objeto real de modo que comience la reproducción de forma automática. &lt;br /&gt;
&lt;br /&gt;
Para el usuario el proceso es transparente, pero la velocidad de la página y su uso de memoria nos lo agradecerán. Esta técnica se usa en Facebook por ejemplo.&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;Utilizando jQuery&lt;/span&gt;&lt;br /&gt;
La imagen que se usará como fachada, se coloca de fondo de un hipervínculo que apunta a la dirección real del vídeo (por accesibilidad) y a éste, se le asocia un evento de click que se dispare una única vez. Una vez se hace click, se elimina el href y el comentario del objeto del vídeo. &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:html&quot;&gt;&lt;a class=&quot;video-in-link&quot; href=&quot;http://www.youtube.com/watch?v=UmN5JJkXPiE&quot; style=&quot;background: url(video1.jpg); display: block; height: 344px; width: 425px;&quot;&gt;
&lt;/a&gt;&lt;/pre&gt;&lt;br /&gt;
En el evento de document ready, se procesarán los hipervínculos de la clase &quot;video-in-link&quot; para asignar el evento de click que se ejecutará una única vez mediante el método &quot;one&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
$(document).ready(function(){
   $(&quot;a.video-in-link&quot;).one(&#39;click&#39;,function(){
      var anchor = $(this);
      anchor.html(anchor.html().replace(&#39;&lt;!--&#39;,&#39;&#39;).replace(&#39;--&gt;&#39;,&#39;&#39;));
      anchor.removeAttr(&#39;href&#39;);
      return false;
   })
})
//]]&gt;
&lt;/script&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;Usando javascript a pelo&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
En esta versión, se usará el evento onClick para llamar a una función que recibirá el hipervínculo pulsado mediante &quot;this&quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:html&quot;&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=THdJZ2VXUm0&quot; onclick=&quot;videoInLink(this)&quot; style=&quot;background: url(video2.jpg); display: block; height: 344px; width: 425px;&quot;&gt;
&lt;/a&gt;&lt;/pre&gt;&lt;br /&gt;
Una vez se pulsa el hipervínculo y se llama a la función, se elemina el manejador de evento de click del hipervínculo que hemos pulsado para evitar que se llame de nuevo. También se elimina el comentario y el href para obtener el mismo funcionamiento que antes.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;&lt;script type=&quot;text/javascript&quot;&gt;
//&lt;![CDATA[
function videoInLink(anchor){
   anchor.innerHTML = anchor.innerHTML.replace(&#39;&lt;!--&#39;,&#39;&#39;).replace(&#39;--&gt;&#39;,&#39;&#39;);
   anchor.removeAttribute(&#39;href&#39;);
   anchor.onclick= null;
   return false;
};
//]]&gt;
&lt;/script&gt;&lt;/pre&gt;&lt;br /&gt;
Notas&lt;br /&gt;
&lt;br /&gt;
El vídeo debe estar en modo de &quot;autoplay&quot; porque si no, el usuario tendrá que hacer click 2 veces. En youtube habrá que poner el parámetro &quot;autoplay=1&quot; al final.&lt;br /&gt;
&lt;br /&gt;
Para evitar los flashes blancos al instanciar el objeto flash del vídeo, hay que poner el parámetro &quot;wmode&quot; con valor &quot;transparent&quot;.</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/9021694613688348837/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/06/lazy-load-de-videos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/9021694613688348837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/9021694613688348837'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/06/lazy-load-de-videos.html' title='Lazy load de vídeos'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-4829406315515831307</id><published>2011-06-07T15:46:00.000+02:00</published><updated>2011-06-07T15:46:52.201+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="js"/><title type='text'>Raphaël - Haciendo más sencillo el uso de SVG y VML</title><content type='html'>Si alguno ha estado en este mundillo en los últimos 9-10 años, sabrá que uno de los grandes desconocidos del desarrollo web son los gráficos vectoriales. Siempre ha sido muy sencillo añadir un gif a una página, pero a la hora de por ejemplo, dibujar líneas arbitrariamente, por ejemplo encima de la imagen o generación de gráficas dinámicamente, las elecciones tecnológicas eran pocas y además no estándar en general.&lt;br /&gt;
&lt;br /&gt;
A la hora de hacer estas virguerías, siempre le he tenido un ojo echado primero al VML y luego al SVG, pero quien haya tocado el tema aunque minimamente sabrá que es muy potente, pero muy engorroso.&lt;br /&gt;
&lt;br /&gt;
En este aspecto nos echa una mano &lt;a href=&quot;http://raphaeljs.com/&quot;&gt;Raphäel&lt;/a&gt;, una librería javascript que permite el uso de SVG y VML de forma (muy) sencilla y además es multiplataforma soportando incluso IE6 (quizás hasta IE5.5 SP2 que es donde yo empecé a hacer pinitos con VML).&lt;br /&gt;
&lt;br /&gt;
Un ejemplo sencillo de Raphaël para dibujar un círculo sacado directamente de su web&lt;br /&gt;
&lt;pre class=&quot;brush:js&quot;&gt;// Creates canvas 320 × 200 at 10, 50
var paper = Raphael(10, 50, 320, 200);

// Creates circle at x = 50, y = 40, with radius 10
var circle = paper.circle(50, 40, 10);
// Sets the fill attribute of the circle to red (#f00)
circle.attr(&quot;fill&quot;, &quot;#f00&quot;);

// Sets the stroke attribute of the circle to white
circle.attr(&quot;stroke&quot;, &quot;#fff&quot;);&lt;/pre&gt;&lt;br /&gt;
Ahora un ejemplo más complejo&lt;br /&gt;
&lt;input type=&quot;button&quot; id=&quot;tigreton&quot; value=&quot;No me pulses!&quot; onclick=&quot;Raphael(tiger).translate(200, 200);&quot;/&gt;&lt;br /&gt;
&lt;script src=&quot;http://github.com/DmitryBaranovskiy/raphael/raw/master/raphael-min.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;script src=&quot;http://dl.dropbox.com/u/2164813/tiger.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
Bastante sorprendente verdad? pues os invito a pasaros por la web de Raphaël para ver éste y otros ejemplos interactivos.</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/4829406315515831307/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/06/raphael-haciendo-mas-sencillo-el-uso-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/4829406315515831307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/4829406315515831307'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/06/raphael-haciendo-mas-sencillo-el-uso-de.html' title='Raphaël - Haciendo más sencillo el uso de SVG y VML'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3390721125845655478.post-9049386419680544486</id><published>2011-06-06T12:44:00.000+02:00</published><updated>2011-06-06T12:44:24.692+02:00</updated><title type='text'>Clase para realizar captchas en PHP</title><content type='html'>En algún momento siempre tendremos que realizar la verificación de que el sujeto al otro lado de la pantalla es un humano y no un robot. Por esa razón aparecieron los temido captchas que nos obligan a realizar un proceso de validación de usuario que las máquinas no son capaces de resolver.&lt;br /&gt;
&lt;br /&gt;
La base de funcionamiento es muy sencilla. Se crea una sesión y en ella se guarda el valor que se corresponde con el captcha gráfico de modo que en el proceso de validación de la información se compara el valor de captcha introducido con el almacenado en la sesión. Si no son iguales, no es un humano (o es uno muy torpe).&lt;br /&gt;
&lt;br /&gt;
En este caso, para dibujar el captcha se usa un TTF almacenado en una ruta del servidor especificada en la variable $font_path.&lt;br /&gt;
&lt;br /&gt;
Por supuesto, que esta versión es una muy simplificada y se puede mejorar en todos los aspectos, pero sirve como plantilla para entender cómo funciona todo el proceso.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:php&quot;&gt;interface CaptchaInterface{ 
    function setString($string); 
    function getString(); 
    function getImage(); 
    function auth($input); 
} 

// Clase usando Imagick 
class Captcha implements CaptchaInterface{ 
    private $captchaString; 

    public function setString($string){ 
        $this-&gt;captchaString = $string; 
    } 

    public function getString(){ 
        return $this-&gt;captchaString; 
    } 

    public function getImage(){ 
        $image = new Imagick(); 
        $image-&gt;newImage(80,40,&#39;none&#39;); 
        $image-&gt;setImageBackgroundColor(&#39;#ffffff&#39;); 

        $string = new ImagickDraw(); 
        $string-&gt;setFont(&quot;fontPath&quot;); 
        $string-&gt;setFontSize(14); 
        $string-&gt;annotation(0,20,$this-&gt;captchaString); 

        $image-&gt;drawImage($string); 
        return $image; 

    } 

    public function renderImage($image){ 
        header(&quot;Content-type: image/png&quot;); 
        header(&quot;Cache-control: no-cache&quot;); 
        $image-&gt;setImageFormat(&quot;png&quot;); 
        echo $image; 
        exit; 
    } 

    public function auth($input){ 
        return ($this-&gt;captchaString == $input)?true:false; 
    } 
} 

//For GD 
class CaptchaGd implements CaptchaInterface{ 
    private $captchaString; 

    public function setString($string){ 
        $this-&gt;captchaString = $string; 
    } 

    public function getString(){ 
        return $this-&gt;captchaString; 
    } 

    public function getImage(){ 
        $image = imagecreate(80,40); 
        $bcolor = ImageColorAllocate($image, 255, 255, 255); 
        $textcolor = ImageColorAllocate($image, 0,0,0); 
        $font_path=&quot;fontPath&quot;; 
        ImageTTFText ($image, 14, 0, 0, 20, $textcolor, 
                $font_path,$this-&gt;captchaString); 
        return $image; 

    } 

    public function renderImage($image){ 
        header(&quot;Content-type: image/png&quot;); 
        header(&quot;Cache-control: no-cache&quot;); 
        $textcolor = ImageColorAllocate($image, 255, 255, 255); 
        ImagePNG($image); 
        ImageColorAllocate($image,$textcolor); 
        imagedestroy($image); 
        exit; 
    } 

    public function auth($input){ 
        return ($this-&gt;captchaString == $input)?true:false; 
    } 
}&lt;/pre&gt;Para usarlo, lo primero es usar como si fuera una imagen un PHP que usa esta clase dentro del formulario donde se quiera usar el captcha. El PHP de la &quot;imagen&quot; sería:&lt;br /&gt;
&lt;pre class=&quot;brush:php&quot;&gt;//CreateCaptchaImage 
session_start(); 
$obj = new Captcha(); 
$_SESSION[&#39;captcha&#39;]=substr((md5(date(&quot;YmdD His&quot;))), 0, 5); 
$obj-&gt;setString($_SESSION[&#39;captcha&#39;]); 
$obj-&gt;renderImage($obj-&gt;getImage());&lt;/pre&gt;Una vez enviados los datos del formulario, el chequeo de la validación del captcha se haría con el siguiente trozo de PHP&lt;br /&gt;
&lt;pre class=&quot;brush:php&quot;&gt;//AuthExample(POST Object) 
session_start(); 
$obj = new Captcha(); 
$obj-&gt;setString($_SESSION[&#39;captcha&#39;]); 
if($obj-&gt;auth($_POST[&#39;captcha&#39;]){ 
//True Action 

}else{ 
//False Action 

}&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://3nibbles.blogspot.com/feeds/9049386419680544486/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://3nibbles.blogspot.com/2011/06/clase-para-realizar-captchas-en-php.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/9049386419680544486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3390721125845655478/posts/default/9049386419680544486'/><link rel='alternate' type='text/html' href='http://3nibbles.blogspot.com/2011/06/clase-para-realizar-captchas-en-php.html' title='Clase para realizar captchas en PHP'/><author><name>JR.</name><uri>http://www.blogger.com/profile/12233380294290731295</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuHKUoiSfXayUWvGiPpt4dq8olr3K6kyjGGVYt3CfLlkz-9hfu31oQRbhOn3jUU-p-_oUepA8GuYRQwXaYYmgPFnDSMH0epDG2zws7_ahM98Wbdzv-ojSCBfl8imwBA/s220/jrdiaz%40gmail.com_83a8f1b9.jpg'/></author><thr:total>0</thr:total></entry></feed>