¿La perfecta galería de imágenes? Usando PhotoSwipe con jQuery
Spanish (Español) translation by Javier Salesi (you can also view the original English article)
Recientemente descubrí una librería Javascript llamada PhotoSwipe y estoy realmente impresionado. Es una brillante librería que superpone una imagen o un grupo de imágenes en tu página, un efecto popularmente conocido como lightbox. PhotoSwipe es actualmente desarrollada por Dmitry Semenov-él la reconstruyó el año pasado cuando tomó las riendas del proyecto. Las mejoras incluyen:
- Modular: PhotoSwipe es construida en varios módulos, permitiéndote omitir características particulares que no necesitas. Ésto mantiene la librería muy ligera.
- Responsiva o Adaptable: una característica indispensable desde todos los puntos de vista. Photoswipe muestra el tamaño de imagen apropiado basándose en la actual ventana gráfica.
- Gestos táctiles: PhotoSwipe soporta algunos gestos táctiles que permiten a los usuarios interactuar a través de Pulsar o Pinchar, dándole funcionalidades de ventana emergente, zoom, y cerrar.
La única desventaja es que PhotoSwipe no se ejecuta inmediatamente. Como el desarrollador señala:
"PhotoSwipe es hecha simple y rápida para los usuarios finales, no para los desarrolladores. No es un simple plugin de jQuery, al menos se requiere un conocimiento básico de JavaScript para instalarla.
Pero puede ser usada conjuntamente con otras librerías. En éste tutorial, vamos a ver como utilizar PhotoSwipe con jQuery. Haremos todo el proceso fácilmente comprensible, aún si no eres experto en JavaScript.
Iniciemos.
1. Comenzando
Comenzaremos con:
- Creando los directorios del proyecto.
- Creando un documento HTML.
- Enlazando a jQuery. En éste tutorial voy a usar jQuery 2.0, por lo tanto sólamente funciona con navegadores modernos.
- Incluir las copias de la librería PhtoSwipe que comprenden los archivos:
photswipe.min.js
,photoswipe-ui-default.min.js
(el código que construye el PhotoSwipe UI),default-skin.css
,default-skin.png
,default-skin.svg
, ypreloader.gif
. - Arreglar en orden los archivos en tu directorio preferido y enlazarlos dentro del archivo HTML.
2. Estructurando el HTML
La estructura HTML es la parte más esencial ya que eventualmente indicará como escribimos JavaScript. Aquí asumiré que tenemos un par de imágenes, como sigue:
1 |
<div class="picture" itemscope itemtype="http://schema.org/ImageGallery"> |
2 |
<figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject"> |
3 |
<a href="img/city-1.jpg" itemprop="contentUrl" data-size="1000x667" data-index="0"> |
4 |
<img src="img/city-1-thumb.jpg" height="400" width="600" itemprop="thumbnail" alt="Beach"> |
5 |
</a>
|
6 |
</figure>
|
7 |
<figure itemprop="associatedMedia" itemscope itemtype="http://schema.org/ImageObject"> |
8 |
<a href="img/city-2.jpg" itemprop="contentUrl" data-size="1000x667" data-index="1"> |
9 |
<img src="img/city-2-thumb.jpg" height="400" width="600" itemprop="thumbnail" alt=""> |
10 |
</a>
|
11 |
</figure>
|
12 |
</div>
|
Atributos Data (Personalizados)
Además de la clase y los atributos de Schema (que ayudarán con SEO), también hemos añadido un atributo data-*
en la etiqueta anchor (enlace) que incluye la imagen. Éste guardará el tamaño completo (anchura x altura) de la imagen.
Más código HTML
Ahora agregamos el código que PhotoSwipe usará para superponer las imágenes completas. Agrega ésto justo antes de la etiqueta de cierre body </body>
1 |
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true"> |
2 |
<div class="pswp__bg"></div> |
3 |
<div class="pswp__scroll-wrap"> |
4 |
|
5 |
<div class="pswp__container"> |
6 |
<div class="pswp__item"></div> |
7 |
<div class="pswp__item"></div> |
8 |
<div class="pswp__item"></div> |
9 |
</div>
|
10 |
|
11 |
<div class="pswp__ui pswp__ui--hidden"> |
12 |
<div class="pswp__top-bar"> |
13 |
<div class="pswp__counter"></div> |
14 |
<button class="pswp__button pswp__button--close" title="Close (Esc)"></button> |
15 |
<button class="pswp__button pswp__button--share" title="Share"></button> |
16 |
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button> |
17 |
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button> |
18 |
<div class="pswp__preloader"> |
19 |
<div class="pswp__preloader__icn"> |
20 |
<div class="pswp__preloader__cut"> |
21 |
<div class="pswp__preloader__donut"></div> |
22 |
</div>
|
23 |
</div>
|
24 |
</div>
|
25 |
</div>
|
26 |
<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"> |
27 |
<div class="pswp__share-tooltip"></div> |
28 |
</div>
|
29 |
<button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)"> |
30 |
</button>
|
31 |
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)"> |
32 |
</button>
|
33 |
<div class="pswp__caption"> |
34 |
<div class="pswp__caption__center"></div> |
35 |
</div>
|
36 |
</div>
|
37 |
</div>
|
38 |
</div>
|
Establecimos el HTML, ahora podemos proceder con JavaScript. Como lo mencioné usaremos jQuery.
3. jQuery
Nuestras imágenes están agrupadas dentro de un div
con una clase picture
. Puede haber más grupos de imágenes dentro de la página, por lo tanto iteramos a través de cada elemento .picture
.
1 |
$('.picture').each( function() { |
2 |
|
3 |
});
|
Detalles
PhotoSwipe nos pide que proporcionemos la fuente de la imagen junto con su tamaño. Para ésto creamos una función que iterará a través de la etiqueta anchor (enlace) para tomar éstos detalles, de ésta forma:
1 |
$('.picture').each( function() { |
2 |
var $pic = $(this), |
3 |
getItems = function() { |
4 |
var items = []; |
5 |
$pic.find('a').each(function() { |
6 |
var $href = $(this).attr('href'), |
7 |
$size = $(this).data('size').split('x'), |
8 |
$width = $size[0], |
9 |
$height = $size[1]; |
10 |
|
11 |
var item = { |
12 |
src : $href, |
13 |
w : $width, |
14 |
h : $height |
15 |
}
|
16 |
|
17 |
items.push(item); |
18 |
});
|
19 |
return items; |
20 |
}
|
21 |
|
22 |
var items = getItems(); |
23 |
});
|
Dividamos éste código en varias piezas:
- Primero iniciamos con un arreglo vacío
items)[]
. - Luego iteramos a través de cada etiqueta anchor con el método
.each()
. -
$href=$(this).attr('href')
obtiene el valor en el atributohref
, guardando la ruta de la imagen. -
$size=$(this).data('size').split('x')
obtendrá el valor del atributodata-size
a través del método jQuery.data()
. Entonces usamos el métodosplit()
para separar el valor. - Podemos obtener el valor de la anchura y la altura por separado con:
$width=$size[0]
y$height=$size[1]
. - Usando el método
push()
recogemos toda ésta información en un arreglo.
Probar en la Consola
Ahora tenemos la fuente de la imagen y el tamaño de la imagen almacenada en la variable items
. Para verificar, puedes ejecutar la variable a través de console.log()
y deberías encontrar la siguiente estructura de datos en DevTools (herramientas para desarrolladores).



Click
Posteriormente, unimos el elemento figure
con el evento click
, construimos una instancia PhotoSwipe, pasamos el items
junto con las opciones de configuración, y finalmente inicializamos PhotoSwipe.
1 |
var $pswp = $('.pswp')[0]; |
2 |
$pic.on('click', 'figure', function(event) { |
3 |
event.preventDefault(); |
4 |
|
5 |
var $index = $(this).index(); |
6 |
var options = { |
7 |
index: $index, |
8 |
bgOpacity: 0.7, |
9 |
showHideOpacity: true |
10 |
}
|
11 |
|
12 |
// Initialize PhotoSwipe
|
13 |
var lightBox = new PhotoSwipe($pswp, PhotoSwipeUI_Default, items, options); |
14 |
lightBox.init(); |
15 |
});
|
La razón por la que usamos el elemento figure
para hacer click, en lugar de la etiqueta anchor, es para que podamos obtener fácilmente el índice (o el orden subsecuente). Ésto nos permite informar a PhotoSwipe del índice correcto para superponer la imagen correspondiente.
Conclusión
Acabamos de implementar PhotoSwipe utilizando jQuery. El código es comparablemente más corto y más fácilmente entendible que cuando es escrito en puro JavaScript.
Ahora que ya iniciaste, puedes también ajustar PhotoSwipe con varias opciones proporcionadas e incluso precargar la imagen así que verás la imagen completa instantáneamente al hacer click. Dejaré los estilos a tu imaginación ya que no hay reglas estrictas para éstos.
Espero que hayas aprendido algo en éste tutorial, y encontrarlo útil a veces. No olvides checar el demo y externar cualquier pregunta o idea en la sección de comentarios.
Más Recursos
- Empezando con PhotoSwipe
- Imágenes Adaptables con PhotoSwipe
- 30 Days para Aprender jQuery
- Todo Lo Que Necesitas Saber Sobre El Atributo Data de HTML 5
- Mejora la identidad de tu sitio web con Lenguaje de Marcado Semántico.
¡Sé el primero en conocer las nuevas traducciones–sigue @tutsplus_es en Twitter!