CSSLab » javascript http://www.csslab.cl Un laboratorio de ideas para la web en español Thu, 12 Jan 2012 02:32:35 +0000 en hourly 1 http://wordpress.org/?v= Outlinr: a bookmarklet http://www.csslab.cl/2011/12/06/outlinr-a-bookmarklet/ http://www.csslab.cl/2011/12/06/outlinr-a-bookmarklet/#comments Tue, 06 Dec 2011 15:43:21 +0000 Jorge Epuñan http://www.csslab.cl/?p=899 Outlinr: web inspector para los pobres / web inspector for the poors

Selecciona tu idioma / Select your language:

EN

Frequently on my debugging stage (when I need to solve something within the HTML/CSS markup that is causing some conflict) I use the CSS outline property to contour the HTML elements so as I can visually locate where the elements are positioned, if they’re collapsing, which elements are involving, etc. I use outline because it’s a property that does not modify the box model and won’t going to break more elements that are already working fine. If I use border instead, it will add 1 or 2 px to the box and can add more unnecessary problems. In addition, I use the red color not only because it’s strongly visible, but it’s fastest writing on the keyboard (lazy huh?).

Anyway, that was the introduction. I made this bookmarklet that does the job for me directly on the browser, so I don’t add dirt to my stylesheet or to the HTML file. I could use the web inspector from the browser (or Firebug) but this method is quicker. The bookmarklet asks you for which selector to draw (div is by default but it could be any selector from jQuery sentences) and the color (red is the default but it can be blue, green, #f60, etc).

I hope it can be useful for somebody else than me.

Requirement: you have to be connected to the Internet, it calls jQuery from Google API’s.

ES

Frecuentemente en mi etapa de debugging (cuando necesito solucionar algo dentro del marcado HTML/CSS que estuviera provocando algún conflicto) utilizo la propiedad CSS outline para contornar los elementos HTML y ver dónde están ubicados, si están colapsando, qué elementos envuelve, etc. Utilizo outline porque es una propiedad que no influye en el modelo de caja y no va a hacer que se quiebren los elementos que ya sé que están correctamente posicionados. Si utilizara border le agregaría mínimo 1 ó 2 pixeles a la caja y seguro provocaría un problema más del que estoy tratando de resolver. Además, utilizo el color rojo no porque es uno de los colores más fuertes y menos comunes dentro de un layout, sino que es el más rápido de escribir (en inglés) dentro del CSS. Me acostumbré.

Enfin, esa fue la introducción. Hice un bookmarklet que hace ese trabajo por mí directo en el browser, sin tener que ensuciar mi hoja de estilos y menos el HTML. Podría utilizar el web inspector del browserFirebug) pero este método es más rápido. El bookmarklet te pregunta qué selectores dibujar (por defecto es div pero puedes utilizar cualquier selector mediante las sentencias de jQuery) y además del color (por defecto es red pero puedes utilizar blue, green, #f60, etc).

Espero pueda ser útil a alguien más que a mí.

Requisito: tienes que estar conectado a Internet ya que llama a jQuery desde Google API’s.

 

Outlinr ← click&drag

 

How to install a bookmarklet / Cómo instalar un bookmarklet

Uso de Bookmarklets

]]>
http://www.csslab.cl/2011/12/06/outlinr-a-bookmarklet/feed/ 4
Columnas Múltiples con CSS3 http://www.csslab.cl/2011/11/16/columnas-multiples-con-css3/ http://www.csslab.cl/2011/11/16/columnas-multiples-con-css3/#comments Wed, 16 Nov 2011 14:06:21 +0000 Jorge Epuñan http://www.csslab.cl/?p=888 La idea de diagramar contenido con columnas múltiples es un método heredado del diseño editorial, donde se utilizan retículas para diagramar tanto texto como imágenes (y publicidad, claro). Su uso se justifica en la capacidad del lector de seguir la misma línea de texto sin perderse en su continuidad. El texto de divide en varias columnas de menos ancho facilitando la comprensión del tema que se está tratando.


Columnas Múltiples con CSS3

La implementación de columnas múltiples en CSS no es algo nuevo, fue propuesto a la W3C en el 2001 y ya estaba implementado en Webkit desde sus inicios, en Firefox desde la versión 1.5 y se podía utilizar fácilmente desde 2006. Pero con el advenimiento de CSS3 como un estándar cada vez más fuerte, y con una presión bastante notoria por parte de los desarrolladores para implementar sus beneficios en sus proyectos web se ha hecho cada vez más viable su uso. Además, existen fallbacks que permiten que se pueda utilizar en navegadores más antiguos o que no tengan esta capacidad sin mayores problemas.

Por suerte su implementación es bastante simple. Dado el siguiente HTML con un bloque de texto:

<div id="columna">
   <p>International Bitterness Units (IBU), Caramel malt, Pitching Bottom-fermenting Yeast. Double bock/dopplebock; Reboboam Mash Tart Lagering Grist Caramel malt Bittering Hops...</p>
</div>

Para separarlo en 2 columnas basta con utilizar la propiedad column-count: 2;

#columna {
   -webkit-column-count: 2;
   -moz-column-count: 2;
   column-count: 2;
}

Ver Ejemplo 1

La lista completa de propiedades:

column-count:
la cantidad de columnas.
column-width:
define el ancho de las columnas, caso no quieras que el browser calcule de acuerdo al modelo de caja.
column-gap:
el espacio entre cada columna, en la unidad de medida que estimes.
column-rule:
borde (separación) entre cada colina, por ejemplo una línea recta.

Ver Ejemplo 2

Ahora, qué hacemos con los browsers que no tienen la capacidad de interpretar esta úil propiedad? Según caniuse.com, ningún IE lo soporta en la actualidad, quizás IE10 lo haga. Afortunadamente JavaScript viene al rescate con un pequeño script que incluiremos luego del estilo, el que agregará el soporte de column-count y demases.

Ver Ejemplo 3

Como ven, no hay razón para no comenzar a utilizar las columnas múltiples.

Links:

]]>
http://www.csslab.cl/2011/11/16/columnas-multiples-con-css3/feed/ 1
Háptica en iOS http://www.csslab.cl/2010/07/28/haptica-en-ios/ http://www.csslab.cl/2010/07/28/haptica-en-ios/#comments Wed, 28 Jul 2010 21:27:46 +0000 Jorge Epuñan http://www.csslab.cl/?p=616 CSSLab: iPad

iPad, iPad, iPad… otro nuevo dispositivo para cautivar a los ávidos consumidores, pero que por lo menos trae interesantes nuevas tecnologías. Aparte de que crean que es un iPhone gigante, tiene varias innovaciones que permiten darle mucha rienda a la imaginación de los creadores de contenido específico para esta plataforma. Una de las que más me han interesados, corresponde a los eventos gestuales.

Este artículo abordará todos los eventos disponibles para iPad y que ocurren cuando el usuario interactúa con una página web en iOS. Aunque puedes visualizar los ejemplos con Safari 5 para escritorio o el mismo iPhone, la mejor interacción la puedes lograr desde un iPad mismo por la dimensión y calidad de su superficie táctil (o en su defecto con su simulador).

Eventos Multitouch

CSSLab - Eventos Multitouch

Puedes usar classes de eventos touch de tipo DOM en Javascript que ya están disponibles en iOS. Si quieres registrar estos eventos, el sistema envía objetos TouchEvent a aquellos elementos DOM mientras los dedos se mueven por sobre la superficie. Una secuencia multitouch comienza cuando un dedo toca por primera vez la superficie. La secuencia termina cuando el último de esos dedos se levanta de la misma superficie. Éstos eventos son similares a los usuales eventos de mouse, excepto que puedes tener toques simultáneos en la superficie en diferentes lugares de la misma. Un objeto de evento touch es utilizado para encapsular todos los toques que existen en un mismo momento en la pantalla. Cada dedo es representado por un objeto touch y las típicas propiedades que encuentras en un evento de mouse están en un evento touch, pero no el objeto mismo.

Cuatro son los principales eventos touch:

ontouchstart
ocurre cada vez que un dedo se posa sobre la pantalla.
ontouchmove
ocurre cuando un dedo que ya está en la pantalla se mueve sobre ella.
ontouchend
ocurre cada vez que un dedo sale de la pantalla.
ontouchcancel
el sistema puede cancelar los eventos en ciertas ocasiones, como por ej. cuando recibes un SMS mientras estás arrastrando un elemento.

Para registrarlos con Javascript:

element.addEventListener("touchstart", touchStart, false);
element.addEventListener("touchmove", touchMove, false);
element.addEventListener("touchend", touchEnd, false);
element.addEventListener("touchcancel", touchCancel, false);

Y si lo quieres implementar como una función:

function touchStart(event) {
   // tomemos las coordenadas del dedo cuando toca la pantalla
   var x = event.touches[0].pageX;
   var y = event.touches[0].pageY;
   alert('X = '+x+',Y = '+y);
}

Ver ejemplo 1

Un simple evento: arrastra un elemento cuando mueves el dedo:

function touchMove(event) {
   event.preventDefault();
   var touch = event.touches[0];
   var node = touch.target;
   node.style.position = "absolute";
   node.style.left = touch.pageX + "px";
   node.style.top = touch.pageY + "px";
}

Ver ejemplo 2


Detalle: por defecto, si arrastras un dedo sobre la pantalla es probable que la página comience a moverse (peor si ésta tiene scroll). Por suerte agregaron la función preventDefault() que hace que la página se quede quieta si lo necesitamos.

Las listas de eventos agrupan estos objetos, y contiene información para cada dedo que está tocando la pantalla. Además, contiene 2 otras listas: una que tiene información para los dedos que se originan del mismo elemento y otro que contiene sólo información para los dedos asociados al mismo evento. Estas listas están disponibles para cada evento touch, y son:

touches
una lista para cada dedo que está posado actualmente sobre la pantalla.
targetTouches
tal como touches, pero filtra sólo la información para los dedos que comienzan del mismo elemento.
changedTouches
lista la información para cada dedo involucrado en el mismo evento.

Las propiedades que contienen estas listas son:

clientX
coordenada X del toque relativa al viewport (pantalla visible).
clientY
coordenada Y del toque relativa al viewport.
screenX
coordenada X relativa a la pantalla.
screenY
coordenada Y relativa a la pantalla.
pageX
coordenada X relativa a la página completa (incluye offset del scroll).
pageY
coordenada Y relativa a la página completa.
target
elemento donde el evento touch fue originado.
indentifier
número identificados, único para cada evento touch.

Para entender mejor, veamos el siguiente caso:

  1. Cuando pongo un dedo en la pantalla, las 3 listas tendrán la misma información en sus propiedades, pero changedTouches fue el que originó el evento.

  2. Cuando pongo el segundo dedo, touches tendrá 2 items (uno para cada dedo); targetTouches tendrá 2 items sólo si el segundo dedo es posado en el mismo elemento del primero; changedTouches tendrá información relacionada al segundo dedo, porque fue lo que causó el evento.

  3. Si pongo 2 dedos exactamente al mismo tiempo, tendré 2 items en changedTouches: uno para cada dedo.

  4. Si muevo mis dedos, la única lista que cambiará es changedTouches y va a tener información relacionada a cada dedo que se vaya moviendo (al menos uno).

  5. Cuando levanto un dedo, será eliminado de touches y targetTouches y aparecerá en changedTouches ya que fue el que originó el evento.

  6. Si quito el último dedo se vaciarán touches y targetTouches, y changedTouches tendrá la información para ese ultimo dedo.

Eventos Gestuales

Eventos multitouch pueden ser combinados para crear eventos de gestos. Los objetos GestureEvent son enviados durante una secuencia multitouch y contienen información de dimensiones y rotaciones.

Para registrarlos en HTML:

<div
   ongesturestart="gestureStart(event);"
   ongesturechange="gestureChange(event);"
   ongestureend="gestureEnd(event);"
>

Y mediante Javascript:

element.addEventListener("gesturestart", gestureStart, false);
element.addEventListener("gesturechange", gestureChange, false);
element.addEventListener("gestureend", gestureEnd, false);

Comencemos con un ejemplo simple:

function gestureStart(event) {
   // tomamos el angulo y tamaño del elemento
   var angle = event.rotation;
   var scale = event.scale;
   alert('angulo: '+angle+', dimension: '+scale);
}

Ver Ejemplo 3

Ahora escalamos y rotamos un elemento:

function gestureChange(event) {
   event.preventDefault(); 
   event.target.style.width = (200 * event.scale) + "px";
   event.target.style.height = (200 * event.scale) + "px";
   event.target.style.webkitTransform = 'rotate(' + event.rotation + 'deg)';
}

Ver Ejemplo 4

Creo que esto es un buen comienzo para que te interese esta plataforma, la que implementa un tipo de interacción háptica poco usual y con un gran potencial comercial.

Links:

]]>
http://www.csslab.cl/2010/07/28/haptica-en-ios/feed/ 5
jQuery Tabs y registro en el historial http://www.csslab.cl/2010/05/10/jquery-tabs-y-registro-en-el-historial/ http://www.csslab.cl/2010/05/10/jquery-tabs-y-registro-en-el-historial/#comments Mon, 10 May 2010 16:14:53 +0000 Jorge Epuñan http://www.csslab.cl/?p=545 Es muy común el uso de navegación de tipo tabs para contenidos dentro de una misma página y funcionan bastante bien; el usuario ya está acostumbrado a este tipo de elementos y los utiliza sin problemas, además que resulta liviano y relativamente fácil implementarlos.

Pero recientemente un cliente pidió que los tabs se pudieran navegar con el historial del browser, o sea que si vas seleccionado diferentes tabs e incluso saliendo a otras páginas, puedas volver a ellas con el botón ‘Back’ o ‘Volver’ del navegador, y volver a pasar por ellos. Esto me resultó en un problema no menor que me costó solucionar, ya que los tabs suelen reaccionar ante eventos del click del mouse (como por ejemplo para mostrar tal <div> al clickear tal enlace <a> y que a éste se le agregue una class="selected" que indique su estado de seleccionado). Y esto suelo no quedar registrado en el caché del browser para que pueda ser navegado como se pidió. Pero bueno, pude solucionarlo y aquí lo comparto por si lo necesitan; implica 2 pasos diferentes los cuales deben funcionar en conjunto:

Primero, crearemos una simple función en jQuery para que funcionen los tabs. Esta es una de las maneras más simples de crear este tipo de menúes. Para el HTML:

<div class="tabs"><!-- .tabs -->
   <ul id="menu_tabs">
      <li><a href="#item1">Item 1</a></li>
      ...
   </ul> 
   <div id="item1" class="caja"><!-- #item1 -->
      <h2>Item 1</h2>
      <p>Donec gravida posuere arcu.</p>
   </div><!-- /#item1 -->
   ...</div><!-- /.tabs -->

Le aplicamos la siguiente instrucción en jQuery:

$(function(){
   // definimos variables para el contenedor y los<div>'s de los tabs
   var tabContainers = $('.tabs > div');
   // creamos el evento click para cada uno de los items del menu de tabs
   $('div.tabs ul a').each(function() {
      $(this).click(function(){
         // guardamos el ancla (#item1 por ej.) en una variable del link clickeado
         var hash = $(this).attr('href');
         // escondemos todos los tabs
         tabContainers.hide();
         // mostramos el <div> que sea igual al ancla guardado
         $(hash).show();
         // jugamos agregando y quitando classes del menu
         $('div.tabs ul a').removeClass('selected');
         $('a[href='+hash+']').addClass('selected');
      });
   });
   // para comenzar, hacemos que el primer elemento sea el clickeado
   $('div.tabs ul a:first').click();
});

Ver demo tabs

CSSLab: btn back

Bien, con esto tienes tu menú de tabs funcionando de manera básica pero práctica. Ahora como notarás, al ir por los tabs y volver con el botón del navegador éstos no seguirán el mismo recorrido devuelta, aunque en la URL sí se vea que van cambiando. Para que esto ocurra, debemos comparar no el hash del enlace (<a href="#item1"> por ej.), sino comparar con la URL que va cambiando. Además se debe incluir el plugin jQuery BBQ, el que realiza el ingreso de la URL con tabs al caché del browser. Con el mismo HTML, miren la nueva función:

$(function(){
   var tabContainers = $('.tabs > div');
   // creamos un nuevo evento y lo incluimos al browser
   $(window).bind('hashchange', function () {
      // nuestra variable no la sacamos del <a> sino de la URL y dejamos el primero seleccionado
      var hash = window.location.hash || '#item1';
      // el resto es prácticamente lo mismo
      tabContainers.hide();
      $(hash).show();
      $('div.tabs ul a').removeClass('selected');
      $('a[href='+hash+']').addClass('selected');
   });
   // ejecutamos este nuevo evento 'hashchange' mediante un trigger
   $(window).trigger('hashchange');
});

Ver demo Tabs + History

En este ejemplo, incluso podemos abrir mediante la URL en el tab que queramos, por ejemplo con el siguiente link abriremos el demo en el tab 3:

Ver demo Tabs + History en el tercer tab

]]>
http://www.csslab.cl/2010/05/10/jquery-tabs-y-registro-en-el-historial/feed/ 5
jQuery browserSizr http://www.csslab.cl/2009/07/22/jquery-browsersizr/ http://www.csslab.cl/2009/07/22/jquery-browsersizr/#comments Wed, 22 Jul 2009 15:16:50 +0000 Jorge Epuñan http://www.csslab.cl/?p=452 jQuery browserSizr

Your flexible fixed layout / Tu estructura fija, flexible

Selecciona tu idioma / Select your language:

EN

Coding liquid layouts for your website can become a major problem due to many factors to be taken into when the user resizes the browser: images that doesn’t fit the width, texts wrapping as not expected, columns breaking… not to mention that working with percentages in CSS is problematic among different browsers. With a fixed layout this should not happen, because you have more control over the structure itself and the box model behaves as you expect if you use a good CSS reseter.

With jQuery browserSizr you’ll have more control over CSS styles when there is a significant change in browser size. It has 4 of the most common screens width:

browserSizr: 4kb

  • smartphones (310px or less)
  • less than 1024px (from 311px to 1023px)
  • greater than 1024px (from 1024px to 1279px – including 1024px)
  • greater than 1280px (from 1280px and higher – including 1280px)

Specifically, browserSizr detects the current width of your browser or it’s resize and injects a specific class when it is in the range you’ve activated. Through CSS and a bit of specificity, you can define what happens when the browser is in each resolution:

#container {
   width: 960px; /* normal width */
   font-size: 14px;
}
   #container.lower1024 {
      width: 740px; /* width for less than 1024px */
      font-size: 12px; /* smaller font-size */
   }
   #container.over1280 {
      width: 1200px; /* width for over 1280px */
      font-size: 16px; /* bigger font-size */
   }

See example

Configuration:

  • Include the jQuery library and this humble plugin:
    <script src="jquery.js" type="text/javascript"></script>
    <script src="jquery.browserSizr.js" type="text/javascript"></script>
  • Inicialize-it with the default parameters:
    <script type="text/javascript">
       $(function(){
          $().browserSizr();
       })
    </script>
  • Or configure it as preferred
    $().browserSizr({
       containerDiv: '#container',
       //containerDiv - value: any HTML tag or #id, default to #container
       debug: 'off', 
       //debug-  value: on | off, default to 'off'
       smartphones: 'off',
       //smartphones - value: on | off, default to 'off'
       lower1024: 'on',
       //lower1024 - value: on | off, default to 'on'
       over1024: 'on',
       //over1024 - value: on | off, default to 'on'
       over1280: 'off'
       //over1280 - value: on | off, default to 'off'
    });

ES

Crear estructuras líquidas para tu sitio web puede llegar a ser un gran problema debido a los muchos factores que se deben tomar en cuenta cuando el usuario escala el browser: imágenes que se pueden pasar del ancho, textos que no se cortarán como esperabas, columnas que pueden llegar a quebrarse… sin hablar de que trabajar con porcentajes es problemático entre los diferentes navegadores. Con un layout fijo esto no debería ocurrir ya que tienes más control sobra la estructura misma y el modelo de caja se comporta como esperas si haces uso de un buen reseter de estilos CSS.

Con jQuery browserSizr podrás tener más control sobre los estilos CSS cuando existe una variación significativa la dimensión del browser: en cuántos pixeles quedaría el tamaño de la tipografía del menú a 1280x1024px, o que las imágenes queden a 80% de su tamaño en resoluciones de 800x600px por ejemplo. Tienes los 4 anchos de pantallas más comunes:

browserSizr: 4kb

  • smartphones (310px o menos)
  • menor que 1024px (de 311px a 1023px)
  • mayor que 1024px (de 1024px a 1279px – incluye 1024px)
  • mayor que 1280px (de 1280px o más – incluye 1280px)

En específico, browserSizr detecta el actual ancho del navegador ó su redimensionado e inyecta una class específica cuando se encuentra en el rango que hayas activado. A través de CSS y un poco de especificidad, puedes definir qué quieres que ocurra cuando el browser se encuentre en cada resolución:

#container {
   width: 960px; /* ancho normal del sitio web */
   font-size: 14px;
}
   #container.lower1024 {
      width: 740px; /* ancho para resoluciones menores que 1024px */
      font-size: 12px; /* menor tamaño de fuente */
   }
   #container.over1280 {
      width: 1200px; /* ancho para resoluciones mayores que 1280px */
      font-size: 16px; /* mayor tamaño de fuente */
   }

Ver ejemplo

Configuración:

  • Incluye la librería jQuery y luego, este humilde plugin:
    <script src="jquery.js" type="text/javascript"></script>
    <script src="jquery.browserSizr.js" type="text/javascript"></script>
  • Inicialízalo con los parámetros por defecto:
    <script type="text/javascript">
       $(function(){
          $().browserSizr();
       })
    </script>
  • O configúralo como más prefieras:
    $().browserSizr({
       containerDiv: '#container',
       //containerDiv - id o etiqueta donde se inyectará la class
       debug: 'off',
       //debug - ventana debug on | off, por defecto off
       smartphones: 'off',
        //smartphones - valores: on | off, por defecto 'off'
       lower1024: 'on',
        // valores: on | off, por defecto 'on'
       over1024: 'on',
        //over1024 - valores: on | off, por defecto 'on'
       over1280: 'off'
        //over1280 - valores: on | off, por defecto 'off'
    });

Bajar/Download plugin (.zip 1kb)

Bajar/Download plugin+demos (.zip 22kb)

browserSizr logo by toledopasarin

Little extension as Jorge Sousa required, now it detects just the height of the browser window within 2 values: less than 600px and over 600px.

Pequeña extensión como solicitada por Jorge Sousa, donde ahora detecta sólo el alto de la ventana dentro de 2 rangos: menor que 600px y mayor a 600px.

Ver Ejemplo Alto Ventana

Bajar/Download plugin + demo (.zip 24kb)

]]>
http://www.csslab.cl/2009/07/22/jquery-browsersizr/feed/ 14
jQuery Blox http://www.csslab.cl/2009/05/25/jquery-blox/ http://www.csslab.cl/2009/05/25/jquery-blox/#comments Mon, 25 May 2009 22:14:15 +0000 Jorge Epuñan http://www.csslab.cl/?p=432 jQuery Blox in CSSLab.cl

Una nueva manera de mostrar más información / A new way to show more info

Selecciona tu idioma / Select your language:

ES

Con jQuery Blox puedes desplegar información de una manera diferente, y con una fácil y rápida configuración. Basta con que armes tu HTML siguiendo un simple patrón de bloques, y definirle al plugin los nombres de los elementos que estás construyendo (o mantener los pre-configurados); Blox se encarga de crear una mayor interacción de tu información hacia el usuario.

Ver Demo 1

Blox ofrece 3 estados:

  1. Normal: cuando el usuario no interviene con la caja HTML que contiene los bloques.
  2. Hover: cuando el mouse está sobre alguna de las cajas, por defecto Blox hace las otras semi-transparentes.
  3. Click: cuando se hace click a alguna caja, ésta se amplía animándose hasta cubrir el total de la caja contenedora por sobre las demás y muestra la información anexa a esa caja.

jQuery Blox: 3 states of interaction

El uso de Blox no debería limitar la creatividad de quien la vaya a usar, pero es necesario conocer y mantener ciertas reglas para su correcto y total funcionamiento, principalmente de estructura HTML y de estilos CSS:

Estructura HTML

Primero necesitas una caja que contenga las demás cajas; por defecto Blox la define con el id blox. Esta caja contenedora #blox es la que soportará a las demás cajas, las que Blox denomina por defecto con una class blox_content. Esta caja .blox_content es la que tiene 2 importantes funciones: soporta al contenido que estará oculto en el primer estado, y a una tercera caja llamada .blox_box que es la gatillante de toda la interacción de Blox.

El HTML básicamente debe ser como la siguiente estructura:

<div id="blox"> /* un contenedor */
   <div class="blox_content" id="box_1"> /* varias cajas de contenido */
       <div class="blox_box"> /* caja que soporta el click */
          Box 1
       </div>
       Contenido desplegado cuando Box 1 es clickeado.<a href="#" class="blox_close">Cerrar Bloque</a> /* contenido oculto pero que se muestra al click en la caja anterior */
   </div>
   /* otras cajas con el mismo patron */
</div>

Estilo CSS

La magia está en el uso de posición absoluta para que las cajas se muevan con libertad y fluidez. Para que las cajas se comporten así, deben tener un estilo específico. La que contiene a todas las cajas, #blox, debe tener un alto fijo, un ancho fijo y posición relativa ya que será quien soporte a las cajas menores .blox_content, las que tienen posición absoluta, alto fijo y ancho fijo. Cada una de las cajas .blox_content, deberían tener ubicaciones diferentes mediante id único, respecto a #blox utilizando las propiedades left y top.

La tercera caja .blox_box también debería tener un ancho y alto fijo, seguramente el mismo que su caja padre .blox_content, y para el resto de los elementos tienes libertad total de hacer lo que quieras con su estilo.

Finalmente, el CSS básico es el siguiente:

#blox {
   width: 400px;
   height: 400px; 
   position: relative;
}
   .blox_content {
      width: 200px;
      height: 400px; 
      position: absolute;
   }
      #box_1 {
         top: 0; 
         left: 0;
      }
      #box_2 {
         top: 0; 
         left: 200px;
      }
      /* asi con cada una de las otras cajas */
   .blox_box {
      width: 200px; 
      height: 400px; 
   }

jQuery Blox: box structure

Configuración

Por defecto Blox viene pre-configurado de fábrica, y su programación permite que alteres los siguientes parámetros:

  • container: id de la caja contenedora, por defecto #blox
  • content: class de las cajas con contenido, por defecto .blox_content
  • box: class de la caja que inicia la secuencia para mostrar el contenido, por defecto .blox_box
  • close: class del link o botón que cierra caja caja desplegada, por defecto .blox_close
  • transparency: [yes/no]¿requieres transparencia? por defecto yes
  • fadein: nivel de transparencia (de 0 a1) de las cajas al mouseover, por defecto 0.2
  • fadeout: nivel de transparencia (de 0 a1) de las cajas al mouseout, por defecto 1
  • animation: [yes/no]¿requieres animación? por defecto yes
  • timein: tiempo en ms en que cada caja se demora en abrir, por defecto 100
  • timeout: tiempo en ms en que cada caja se demora en cerrar, por defecto 200
  • direction: [lefty/righty] hacia donde se abrirá cada caja, por defecto a la izquierda lefty

Para utilizarlo con estos valores por defecto, sólo debes seguir 2 pasos básicos:

  1. Agregar tu librería de jQuery favorita y este humilde plugin:
    <script src="jquery-1.3.1.min.js" type="text/javascript"></script>
    <script src="jqueryblox-v0.9.js" type="text/javascript"></script>
  2. Activarlo:
    <script type="text/javascript">
        $(function(){
            $().blox();
        });
    </script>

Si quieres configurarlo según tus necesidades, basta ir modificando los parámetros como te sean necesarios:

 <script type="text/javascript">
     $(function(){
         $().blox({
             container: '#contenedor_blox',
             close: '.boton_cierra',
             direction: 'righty',
             fadein: 0.6
         });
     });
</script>

Ver Demo 2

Ver Demo 3

EN

With jQuery Blox you can display information on a whole new way with a quick and easy setup. Just write yout HTML in a simple block pattern, and tell the plugin your element names (or maintain the pre-configured ones); Blox will display your information with a new interaction for your user.

See Demo 1

Blox offers 3 states:

  1. Normal: when the user does not interfere with the box containing the HTML blocks.
  2. Hover: when the mouse is over one of the boxes, by default Blox makes the others semi-transparent.
  3. Click: when you click on any box, it will animate its expansion to cover the total of the container above all other blocks, to show the information attached to that block.

jQuery Blox: 3 states of interaction

Using Blox should not limit the creativity of who will use it, but it needs to maintain certain rules for their correct and full operation, mainly HTML strucuture and CSS styles:

HTML Structure

First you’ll need a box containing all other boxes, by default Blox calls it with the id blox. This container #blox will support all the blocks which Blox names with the class box_content. This block .box_content have 2 major functions: support the content hidden in the first state, and contains a third block called with the class .blox_box which is the one that fires the Blox interaction, expanding and moving the boxes to display the hidden information.

The HTML should be basically as follows:

<div id="blox"> /* a container */
   <div class="blox_content" id="box_1"> /* many content blocks */
      <div class="blox_box"> /* box that fires the interaction */
         Box 1
      </div>
      Content displayed when Box 1 is clicked, above Box 2.<a href="#" class="blox_close">Close Box</a> /* hidden content displayed at .blox_box click */
   </div>
   /* other boxes with the same pattern */
</div>

CSS Style

The magic is in the use of absolutely positioned blocks to move them freely and smoothly For the blocks to behave like we want, they must have a specific style. The box that contains all other blocks #blox must have fixed height and width and relative position to support the smaller boxes named .blox_content which must have fixed height and width as well but absolute positioned. Each one of this boxes .blox_content should have different placements, givven through an unique #id using the properties left and top.

The third box .blox_box should also have a fixed width and height, probably the same as its parent .blox_content. For the rest of the elements you have total freedom to do whatever you want with their style.

Finally, the basic CSS is as follows:

#blox {
   width: 400px;
   height: 400px; 
   position: relative;
}
   .blox_content {
      width: 200px;
      height: 400px; 
      position: absolute;
    }
       #box_1 {
          top: 0; 
          left: 0;
       }
       #box_2 {
          top: 0; 
          left: 200px;
       }
      /* like this for each of other boxes */
      .blox_box {
         width: 200px; 
         height: 400px; 
      }

jQuery Blox: box structure

Configuration

By default, Blox comes preconfigured from the factory, and its programming allows you to alter the following parameters:

  • container: container box id, default to #blox
  • content: class of each content box, default to .blox_content
  • box: class of the box that fires the content display, default to .blox_box
  • close: class for the link (button) that closes the content box, default to .blox_close
  • transparency: [yes/no] do you want transparency on hover? default to yes
  • fadein: transparency level (from 0 to 1) when you mouseover a box, default to 0.2
  • fadeout: transparency level (from 0 to 1) when you mouseout a box, default to 1
  • animation: [yes/no] do you want the boxes to animate? default to yes
  • timein: time in ms that each box takes to display the content, default to 100
  • timeout: time in ms that each box takes to hide the content, default to 200
  • direction: [lefty/righty] which direction each box is opened, default to left lefty

To use it with the default values, just follow this 2 simple steps:

  1. Add your favorite jQuery library and this humble plugin:
    <script src="jquery-1.3.1.min.js" type="text/javascript"></script>
    <script src="jqueryblox-v0.9.js" type="text/javascript"></script>
  2. Activate it:
    <script type="text/javascript">
        $(function(){
            $().blox();
        });
    </script>

If you want to customize it to suit your needs, just change the necessary parameters:

 <script type="text/javascript">
     $(function(){
         $().blox({
             container: '#my_boxes,
             close: '.closeboxes,
             direction: 'righty',
             fadein: 0.6
         });
     });
</script>

See Demo 2

See Demo 3

Baja el plugin / Get the plugin

Bajar/Download plugin (.zip 1kb)

Bajar/Download plugin+demos (.zip 220kb)

Blox logo by youfeelme.biz

]]>
http://www.csslab.cl/2009/05/25/jquery-blox/feed/ 22
Mis bookmarklets http://www.csslab.cl/2009/02/20/mis-bookmarklets/ http://www.csslab.cl/2009/02/20/mis-bookmarklets/#comments Fri, 20 Feb 2009 16:12:40 +0000 Jorge Epuñan http://www.csslab.cl/?p=398 Los bookmarklets son pequeñas aplicaciones Javascript contenidas dentro de una URL en una página web, de la siguiente forma:

<a href="javascript:function(laQueSea){};">Bookmarklet La Que Sea</a>

La idea es que sean ejecutada mediante el click del enlace, y lo que usualmente se usa es guardarlos mediante bookmarks en tu browser; así puedes tenerlos a mano siempre que los necesites.

Como están escritas en Javascript, puedes hacer modificaciones a cualquier elemento de DOM dentro de la página: cambiar tamaño de fuentes, colores, extraer datos de la página (links, imágenes, texto), enviar datos para validación o traducción entre muchas otras cosas.

Personalmente me son bastante útiles al momento de desarrollas mis proyectos web; tengo algunos de frecuente uso y quisiera compartirlos por si ayudan a más de alguno en los excelentes trabajos que seguro hacen. Para utilizarlos, lo mejor es hacer click en el enlace y arrastrarlo a tu barra de Bookmarks como se ejemplifica en la siguiente imagen:

Uso de Bookmarklets

XRay click y arrastra

Permite visualizar las propiedades DOM del elemento al seleccionarlos: selector, ID, CLASS, herencia y estilos CSS asociados.

XRay bookmarklet

Design click y arrastra

Permite visualizar la grilla utilizada en la construcción de la página, medidas y alineamiento entre otras cualidades.

Design bookmarklet

800×600 1024×768 1280×1024 1600×1200 click y arrastra cada uno

Modifica el tamaño de la ventana de tu browser a alguna de esas medidas estándar.

MRI click y arrastra

Muestra y enmarca cualquier selector que queramos ver de una página web.

MRI bookmarklet

WTFramework click y arrastra

Muestra qué framework de Javascript se está utilizando en el sitio.

bookmarkletWTFramework bookmarklet

Microformats click y arrastra

Muestra cuáles microformatos están siendo utilizados en determinada página.

Y por último, mi favorito:

ReCSS click y arrastra

Recarga sólo las hojas de estilos llamadas desde la página, sin tener que volver a cargar todo el HTML para visualizar cambios.

]]>
http://www.csslab.cl/2009/02/20/mis-bookmarklets/feed/ 9
jQuery sin conflictos http://www.csslab.cl/2009/01/26/jquery-sin-conflictos/ http://www.csslab.cl/2009/01/26/jquery-sin-conflictos/#comments Mon, 26 Jan 2009 21:02:47 +0000 Jorge Epuñan http://www.csslab.cl/?p=382 Existen muchos beneficios al usar alguna de las librerías de javascript disponibles hoy en día (cómo han proliferado.. increíble). Facilitan escribir código y uno se concentra en mejores funcionalidades que en tratar de reinterpretar código. Y qúe decir de los efectos que cada vez vienen mejores… una delicia de utilizarlos.

Cuando uno comienza un proyecto, se suele elegir el mejor lenguaje para su desarrollo y una de las desiciones es elegir el framework JS con que se trabajará, y casarse con éste. Ahora vengo a conocer que ésta desición no tiene que ser tan drástica, ya que jQuery incluye una funcionalidad que permite que se utilice junto con otras librerías, evitando el conflicto de interpretación entre diferentes formas de escribir javascript que conforma cada framework; en esta ocasión mostraré los diferentes usos de noConflict();

Supongamos que tenemos un simple efecto de mostrar/esconder el contenido al activar un link, lo que se llama SlideToggle. El HTML sería el siguiente:

<a href="#" class="boton">Muestra/Esconde</a>
<div class="caja">
     <p>Vivamus auctor leo vel dui...</p>
</div>

En Mootools el código para hacerlo funcionar se compone de la siguiente manera:

window.addEvent('domready', function() {
     new Fx.Slide('mooMuestra').hide()
     $('mooEsconde').addEvent('click', function(e){
          e.stop();
          new Fx.Slide('mooMuestra').toggle();
     });
});

Ver ejemplo con Mootools

Ya con jQuery, lo mismo se realiza de la siguiente manera:

$().ready(function(){
     $('#jMuestra').hide();
     $('#jEsconde').click(function(){
          $('#jMuestra').slideToggle();
     });
});

Ver ejemplo con jQuery

Ahora combinaremos ambos métodos en un mismo archivo, el cual estará linkeando las librerías de Mootools 1.2.0 y jQuery 1.3.1, y se realizará SlideToggle cada una con su método. Para eso, se cambiará la manera con el cual jQuery llama a sus selectores (que es una de las principales razones de conflicto; el uso resumido con $). Primero, se linkea el framework de jQuery y luego el de Mootools. Se escriben los eventos con los cuales se realizan los SlideToggle, pero con un leve cambio en jQuery. En vez de utilizar:

$('selector').slideToggle();

se cambiará a:

jQuery.noConflict();
jQuery('selector').slideToggle();

Esto se repetirá con cada selector en que antes utilizábamos $. Finalmente reciclando el mismo código mostrado anteriormente, quedaría:

jQuery.noConflict();
jQuery().ready(function(){
     jQuery('#jMuestra').hide();
     jQuery('#jEsconde').click(function(){
          jQuery('#jMuestra').slideToggle();
     });
});

Ver ejemplo integrando jQuery+Mootools

Otra manera es creando una variable con una nueva manera de escribir $, por ejemplo, $jQ:

var $jQ = jQuery.noConflict();
$jQ().ready(function(){
     $jQ('#jMuestra').hide();
     $jQ('#jEsconde').click(function(){
          $jQ('#jMuestra').slideToggle();
     });
});

Ver ejemplo 2 integrando jQuery+Mootools

]]>
http://www.csslab.cl/2009/01/26/jquery-sin-conflictos/feed/ 19
<option disabled="disabled"> en IE6+ http://www.csslab.cl/2008/12/31/option-disabled-en-ie6/ http://www.csslab.cl/2008/12/31/option-disabled-en-ie6/#comments Wed, 31 Dec 2008 14:09:05 +0000 Jorge Epuñan http://www.csslab.cl/?p=372 Nuevamente vengo con un error de nuestro querido amigo IE6 que también es compartido por IE7 y el beta1 de IE8 (estos de Micro$oft no aprenden nunca…). Gracias a Rodrigo, me hizo notar que estos browsers no interpretan correctamente a <option> de un <select> que contenga el atributo disabled="disabled". Todos los otros navegadores buenos lo hacen perfectamente, pero lamentablemente la gran mayoría de usuarios no saben que lo que usan para navegar apesta (y no tienen culpa tampoco) y lamentablemente tenemos que encontrar soluciones a este y muchos otros problemas del desarrollo web.

Me puse a indagar por la web y encontré varias discusiones sobre qué solución es mejor que otra, y ninguna fue conclusiva. No hay solución aparente que funcione de igual manera para todos los browsers y que sea utilizada, por ejemplo, con comentarios condicionales. Básicamente me encontré con 2: una que involucra HTML pero la mejor manera de implementarlo es mediante Javascript y la segunda sencillamente con Javascript. Explicaré ambas a continuación, pero antes el HTML común que sería del tipo:

<select>
     <option>Primero</option>
     <option disabled="disabled">Segundo</option>
     <option>Tercero</option>
</select>

Ver ejemplo (en IE notarán)

<option disabled="disabled"> entre browsers

Solución 1

Para que IE interprete la opción <option disabled="disabled">Segundo</option> como deshabilitado, debes cambiar la etiqueta <option> por <optgroup>; el problema es que <optgroup> se compone ligeramente diferente de <option> por lo que el HTML quedaría así:

<select>
     <option>Primero</option>
     <optgroup label="Segundo">Segundo</optgroup>
     <option>Tercero</option>
</select>

Esta solución funciona perfecto en todos los browsers, por lo que puede ser hecho automáticamente mediante jQuery:

$('option:disabled').each(function(){
     var texto = $(this).text();
     $(this).replaceWith("<optgroup label='"+texto+"'>"+texto+"</optgroup>")
});

optgroup funcionando en IE6

Como el problema es sólo de IE, prefiero encerraro en un if() que detecte el browser como podrán apreciar en el ejemplo. Además, notarán que <optgroup> tiene una leve diferencia de estilo que <option disabled="disabled"> pero que se puede subsanar fácilmente mediante CSS.

Ver solución 1 (en IE notarán)

Solución 2

Esta solución no es una solución en sí sino un parche para el problema: ya que IE no considera el atributo disabled, entonces cada vez que el <option disabled="disabled"> sea seleccionado por el usuario (tomando en cuenta que todos los otros browsers no dejarán que sea seleccionado) la selección será automáticamente trasladada al primer <option> del <select>, vale decir del ejemplo HTML si hago click a <optgroup label="Segundo">Segundo</optgroup>, automáticamente seré redireccionado a <option>Primero</option>. El JS:

$('option:disabled').css('color','gray'); 
$('select').change(function(){
     checkDisabledOptions(this);
});
function checkDisabledOptions(el){
     if(el.options[el.options.selectedIndex].disabled){
          el.selectedIndex = 0;
     }
}

Esta solución es una mezcla entre jQuery y Javascript puro, tomada de la mejor implementación encontrada de entre 20 otras vistas; es la más simple y con menos líneas de código. Además, para esta solución es bueno siempre en el primero item del <select> la opción <option>Seleccione</option> o cualquiera que sea que no tenga un value válido (value=""), así aportamos a la accesibilidad y podremos validar ese ítem de formulario.

Ver solución 2 (en IE notarán)

Espero Rodrigo te haya servido, y gracias por hacer me ver este tema; me entretuve bastante resolviéndolo.

Links:

]]>
http://www.csslab.cl/2008/12/31/option-disabled-en-ie6/feed/ 5
Menú con tabs con CSS, jQuery y Mootools http://www.csslab.cl/2008/10/23/menu-con-tabs-con-css-jquery-y-mootools/ http://www.csslab.cl/2008/10/23/menu-con-tabs-con-css-jquery-y-mootools/#comments Thu, 23 Oct 2008 20:27:16 +0000 Jorge Epuñan http://www.csslab.cl/2008/10/23/menu-con-tabs-con-css-jquery-y-mootools/ Esos menúes tipo tabs ó con subniveles tanto horizontales como verticales, son muy útiles al momento de desplegar grandes cantidades de navegación sin ser invasivos con el espacio. Puedes arquitecturar toda la estructura de tu sitio de manera tal que el usuario pueda encontrar fácilmente la información que desee, sólo con ir descubriendo con el mouse las subsecciones que están contenidas dentro del árbol general de navegación.

SafariFirefoxOperaInternet Explorer 6Internet Explorer 7

Por suerte hacer estos tipos de menúes es bastante fácil: basta con tener claro cómo funcionan los menúes con listas e ir anidando unas dentro de otras; incluso sólo con CSS es suficiente para hacerla funcionar, pero lamentablemente el peor browser de la historia universal (IE6) no soporta pseudo-classes en selectores que no sean links (<a>). Así que lo mejor y que más soporte cross-browser nos entrega es utilizar Javascript en este proceso. Y qué mejor que utilizar jQuery ó Mootools, 2 de los frameworks con los que me gusta jugar.

En este artículo veremos el proceso para crear un menú con tabs y cómo hacerlo funcionar mediante CSS y con la ayuda de Javascript.

Como mencionaba, un menú con tabs se compone básicamente de listas anidadas sobre otras listas. El HTML sería el siguiente:

<ul id="menu">
  <li><a href="#">Uno</a></li>
  <li class="cabeza"><a href="#">Dos</a>
     <ul>
        <li><a href="#">Dos.Uno</a></li>
        <li><a href="#">Dos.Dos</a></li>
        <li><a href="#">Dos.Tres</a></li>
     </ul>
  </li>
  <li><a href="#">Tres</a></li>
  <li class="cabeza"><a href="#">Cuatro</a>
     <ul>
        <li><a href="#">Cuatro.Uno</a></li>
        <li><a href="#">Cuatro.Dos</a></li>
     </ul>
  </li>
</ul>

Ver ejemplo del HTML

Si el mundo fuera hermoso y no existiera IE6, nos bastaría con un poco de CSS y selectores avanzados de atributos para hacerlo funcionar:

ul {
  list-style: none;
}
  ul li {
    float: left;
    width: 100px;
    text-align: center;
  }
    li.cabeza>ul {
      display: none;
    }
      li.cabeza:hover>ul {
        display: block;
      }

Ver ejemplo con CSS

Para mejorar el manejo del despliegue de los subniveles, le coloqué una class="cabeza" a cada elemento de lista (<li>) que contenga cada nuevo subnivel. Ahora es más fácil diferenciarlas con CSS ó Javascript, como mostraré a continuación. Primero, con jQuery:

$(document).ready(function(){
  // primero escondemos todos los subniveles
  $('li.cabeza > ul').hide();
  // luego le agregamos el evento de mouseover y mouseout mediante hover de jQuery
  $('li.cabeza').hover(
    function() {
      $('ul', this).show();
    },
    function() {
      $('ul', this).hide();
  }); });

Ver ejemplo jQuery

Muy simple. Ahora, con Mootools (1.11):

window.addEvent('domready', function() { 
  // creamos una variable 'list' que será el selector <li> con class="cabeza", ya que la usaremos más de una vez.
  var list = $$('li.cabeza'); 
  // luego escondemos cada <ul> que esté contenido dentro de li.cabeza mediante display: none
  list.getElement('ul').setStyle('display', 'none');
  // ahora agregamos los eventos de mouseenter y mouseout respectivos
  list.each(function(el) {
    el.addEvent('mouseenter', function(){
      $(this).getElement('ul').setStyle('display', 'block');
    });
    el.addEvent('mouseleave', function(){
      $(this).getElement('ul').setStyle('display', 'none');
    });
  }); 
});

Ver ejemplo Mootools

Finalmente si usas un browser bueno, cualquier de los 3 métodos funcionará igual; viene de ti implementarlo de la mejor forma para que tus usuarios que aún usen IE6 para visitar tu sitio puedan disfrutar de una buena navegación y del contenido que ofrece.

]]>
http://www.csslab.cl/2008/10/23/menu-con-tabs-con-css-jquery-y-mootools/feed/ 13
1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221| viagrea onling viagra tablets name and cost levitra and dapoxetine youtube/viagra cialis extra generic viagra accepting american express buy generic viagra online with no prescription with mastercard generic levitra 20 mg levitra pro buy viagra online in ireland is it illegal to order viagra from outside the united states cheapest generic cialis buy cheap levitra overnight delivery cialis wears off airport security generic viagra generic finasteride viagra for sale using paypal ukAccutane Online Doxycycline online Buy Cheap Lexapro Online No Prescription Prednisone Online Buy Accutane No Prescription