crear galeria html5

Creado a las // 2 commentarios

Una presentación de HTML5 con lienzo y jQuery



Probablemente haya escuchado mucho sobre el nuevo elemento canvas de HTML5. Como su nombre indica, se trata de un elemento especial que nos permite crear y modificar gráficos. Además, podemos también utilizar como cualquier otro elemento en la página: aplicar animaciones jQuery, escuchas de eventos y integrar profundamente en nuestros diseños.

Actualización: Por demanda popular, ahora puede descargar una versión de avance automático de esta presentación. Leer más en este breve tutorial.

La Idea de

Con JavaScript, vamos a aplicar un filtro especial para cada imagen en la presentación de diapositivas. Crear una nueva versión de las imágenes con mayor contraste y colores más intensos y almacenarla en un elementos de lienzo.

How the Slideshow Works

Cómo funciona la presentación de diapositivas

Cuando el usuario elige pasar a otra diapositiva, se muestra el lienzo con una animación de fadeIn , creando un efecto de iluminación suave.

El código HTML

El primer paso en la creación de la presentación de diapositivas, se establecen en el código HTML de la página.

HTML5-slideshow.html


01
02 <html>
03 <head>
04 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
05 <title>An HTML5 Slideshow w/ Canvas & jQuery | Tutorialzine Demotitle>
06
07 <link rel="stylesheet" type="text/css" href="styles.css" />
08
09 head>
10
11 <body>
12
13 <div id="slideshow">
14
15 <ul class="slides">
16 <li><img src="img/photos/1.jpg" width="620" height="320" alt="Marsa Alam" />li>
17 <li><img src="img/photos/2.jpg" width="620" height="320" alt="Turrimetta Beach" />li>
18 <li><img src="img/photos/3.jpg" width="620" height="320" alt="Power Station" />li>
19 <li><img src="img/photos/4.jpg" width="620" height="320" alt="Colors of Nature" />li>
20 ul>
21
22 <span class="arrow previous">span>
23 <span class="arrow next">span>
24 div>
25
27 <script src="script.js">script>
28 body>
29 html>

En primer lugar tenemos el doctype de HTML5, seguido de la sección head del documento. Después de la etiqueta de título y la hoja de estilos que pasemos con el cuerpo.

Puede ver que el formato para la presentación de diapositivas es realmente sencillo. El div contenedor principal, #slideshow, tiene un desordenadas lista y las flechas anteriores y siguientes. La lista desordenada contiene las diapositivas, con cada uno definido como un elemento LI . Como se muestra en la ilustración anterior, esto es donde se insertan los elementos de lienzo con las versiones modificadas de las imágenes.

Por último incluimos jQuery y nuestros script.js, a la que vamos a retomar en el último paso de este tutorial.

La CSS

Todos los estilos para la presentación de diapositivas residen en styles.css. He usado el #slideshow id del elemento de contención principal como un espacio de nombres, por lo que fácilmente puede anexar estos estilos a la hoja de estilos sin tener que preocuparse acerca de los conflictos.

Styles.CSS


01 #slideshow{
02 background-color:#F5F5F5;
03 border:1px solid #FFFFFF;
04 height:340px;
05 margin:150px auto 0;
06 position:relative;
07 width:640px;
08
09 -moz-box-shadow:0 0 22px #111;
10 -webkit-box-shadow:0 0 22px #111;
11 box-shadow:0 0 22px #111;
12 }
13
14 #slideshow ul{
15 height:320px;
16 left:10px;
17 list-style:none outside none;
18 overflow:hidden;
19 position:absolute;
20 top:10px;
21 width:620px;
22 }
23
24 #slideshow li{
25 position:absolute;
26 display:none;
27 z-index:10;
28 }
29
30 #slideshow li:first-child{
31 display:block;
32 z-index:1000;
33 }
34
35 #slideshow .slideActive{
36 z-index:1000;
37 }
38
39 #slideshow canvas{
40 display:none;
41 position:absolute;
42 z-index:100;
43 }
44
45 #slideshow .arrow{
46 height:86px;
47 width:60px;
48 position:absolute;
49 background:url('img/arrows.png') no-repeat;
50 top:50%;
51 margin-top:-43px;
52 cursor:pointer;
53 z-index:5000;
54 }
55
56 #slideshow .previous{ background-position:left top;left:0;}
57 #slideshow .previous:hover{ background-position:left bottom;}
58
59 #slideshow .next{ background-position:right top;right:0;}
60 #slideshow .next:hover{ background-position:right bottom;}

Nos podemos dividir a nuestros visitantes, que interactuarán con la presentación de diapositivas, en tres grupos principales:

  • Personas con JavaScript desactivado. Estos usuarios sólo podrán ver la primera diapositiva y serán incapaces de cambiar a otra;
  • Personas con JavaScript cambiaron, pero sin soporte de lienzo. Para los visitantes de este grupo, las diapositivas cambiará instantáneamente, sin transición de efectos;
  • Personas con JavaScript habilitado y soporte de lienzo. Estas son personas que utilizan las últimas versiones de Firefox, Safari, Chrome, Opera y el pronto a ser lanzado agilizarán. Disfrutarán de la presentación de diapositivas en su esplendor;

Para tener en cuenta los dos primeros grupos, un número de reglas se aplica a la hoja de estilos. Con la ayuda del selector de primera infancia , sólo la primera diapositiva se muestra por defecto. También un número de desbordamiento: ocultos reglas se aplican en un número de plazas por si acaso.

An HTML5 Slideshow With Canvas & jQuery

Un Slideshow con lienzo de HTML5 y jQuery

El código JavaScript

Pasemos a la última parte del tutorial: el código JavaScript y jQuery. Como ya hemos explicado los principios básicos detrás del efecto, permite pasar directamente a la ejecución.

script.js: parte 1


01 $(window).load(function(){
02
03 // We are listening to the window.load event, so we can be sure
04 // that the images in the slideshow are loaded properly.
05
06 // Testing wether the current browser supports the canvas element:
07 var supportCanvas = 'getContext' in document.createElement('canvas');
08
09 // The canvas manipulations of the images are CPU intensive,
10 // this is why we are using setTimeout to make them asynchronous
11 // and improve the responsiveness of the page.
12
13 var slides = $('#slideshow li'),
14 current = 0,
15 slideshow = {width:0,height:0};
16
17 setTimeout(function(){
18
19 if(supportCanvas){
20 $('#slideshow img').each(function(){
21
22 if(!slideshow.width){
23 // Saving the dimensions of the first image:
24 slideshow.width = this.width;
25 slideshow.height = this.height;
26 }
27
28 // Rendering the modified versions of the images:
29 createCanvasOverlay(this);
30 });
31 }
32
33 $('#slideshow .arrow').click(function(){
34 var li = slides.eq(current),
35 canvas = li.find('canvas'),
36 nextIndex = 0;
37
38 // Depending on whether this is the next or previous
39 // arrow, calculate the index of the next slide accordingly.
40
41 if($(this).hasClass('next')){
42 nextIndex = current >= slides.length-1 ? 0 : current+1;
43 }
44 else {
45 nextIndex = current <= 0 ? slides.length-1 : current-1;
46 }
47
48 var next = slides.eq(nextIndex);
49
50 if(supportCanvas){
51
52 // This browser supports canvas, fade it into view:
53
54 canvas.fadeIn(function(){
55
56 // Show the next slide below the current one:
57 next.show();
58 current = nextIndex;
59
60 // Fade the current slide out of view:
61 li.fadeOut(function(){
62 li.removeClass('slideActive');
63 canvas.hide();
64 next.addClass('slideActive');
65 });
66 });
67 }
68 else {
69
70 // This browser does not support canvas.
71 // Use the plain version of the slideshow.
72
73 current=nextIndex;
74 next.addClass('slideActive').show();
75 li.removeClass('slideActive').hide();
76 }
77 });
78
79 },100);

Con document.createElement(), usted puede crear cualquier elemento DOM que te guste. Así que para probar si el explorador admite realmente lienzo (y no sólo crea un elemento genérico), utilizamos el operador in para comprobar si el método getContext() , que es parte integrante de la norma. El resultado de esta comprobación se utiliza en todo el código para tener en cuenta para los usuarios con navegadores que no admiten aún lienzo.

Observe que las llamadas a la función createCanvasOverlay (que analizaremos en la segunda parte del código) son encerradas en una declaración de setTimeout. Esto se hace porque la función es procesador intensivo y podría causar la ventana del navegador a estancar. setTimeout rompe fuera de la ruta de ejecución principal y ejecuta el código de forma asíncrona, maximizar la capacidad de respuesta de la página.

script.js – parte 2


01 // This function takes an image and renders
02 // a version of it similar to the Overlay blending
03 // mode in Photoshop.
04
05 function createCanvasOverlay(image){
06
07 var canvas = document.createElement('canvas'),
08 canvasContext = canvas.getContext("2d");
09
10 // Make it the same size as the image
11 canvas.width = slideshow.width;
12 canvas.height = slideshow.height;
13
14 // Drawing the default version of the image on the canvas:
15 canvasContext.drawImage(image,0,0);
16
17 // Taking the image data and storing it in the imageData array:
18 var imageData = canvasContext.getImageData(0,0,canvas.width,canvas.height),
19 data = imageData.data;
20
21 // Loop through all the pixels in the imageData array, and modify
22 // the red, green, and blue color values.
23
24 for(var i = 0,z=data.length;i
25
26 // The values for red, green and blue are consecutive elements
27 // in the imageData array. We modify the three of them at once:
28
29 data[i] = ((data[i] < 128) ? (2*data[i]*data[i] / 255) :
30 (255 - 2 * (255 - data[i]) * (255 - data[i]) / 255));
31 data[++i] = ((data[i] < 128) ? (2*data[i]*data[i] / 255) :
32 (255 - 2 * (255 - data[i]) * (255 - data[i]) / 255));
33 data[++i] = ((data[i] < 128) ? (2*data[i]*data[i] / 255) :
34 (255 - 2 * (255 - data[i]) * (255 - data[i]) / 255));
35
36 // After the RGB channels comes the alpha value, which we leave the same.
37 ++i;
38 }
39
40 // Putting the modified imageData back on the canvas.
41 canvasContext.putImageData(imageData,0,0,0,0,imageData.width,imageData.height);
42
43 // Inserting the canvas in the DOM, before the image:
44 image.parentNode.insertBefore(canvas,image);
45 }
46
47 });

Es donde ocurre la magia. El elemento canvas es básicamente un buen pedazo de papel en el que puede dibujar con JavaScript. El código anterior crea un elemento de lienzo en blanco e importa la imagen, que se pasa como parámetro, el método drawImage() . Después de esto, utilizamos el método getImageData() para exportar el contenido de todos los píxeles del lienzo en la matriz de imageData .

Lo que es más, para cada píxel de la imagen que tenemos cuatro entradas de la matriz: uno de los colores rojos, verdes y azules y el canal alfa (transparencia). Estos son todos los números de 0 a 255. El bucle principal de tiene que pasar por todos los píxeles y aplicar una ecuación de filtro especial que aclara los colores más claros y oscurece los oscuros. Es el mismo efecto que se obtiene mediante el uso de la superposición de fusión modo en photoshop.

El bucle principal de tiene que hacer una cantidad increíble de trabajo – para una imagen de 600 × 400 píxeles hace 240 000 iteraciones! Esto significa que el código debe ser tan óptimo como sea posible. Esto es por qué, en el bucle, lo de copiar la fórmula tres veces en lugar de llamar a una función. Quitando las llamadas de función, el bucle se convirtió en casi tres veces más rápido.

Tenga en cuenta que el tiempo de procesamiento aumentará proporcionalmente, si decide incluir diapositivas más o utilizar imágenes más grandes.

Con esto nuestro HTML5 Canvas Slideshow es completa!

Palabras finales

El elemento canvas abre una nueva manera de construir aplicaciones de internet enriquecidas. Para aquellos de ustedes que son curiosos, en un PC relativamente nuevo, tarda Firefox 1.2 segundos para generar imágenes de lienzo cuatro, mientras que Chrome es más rápido en 0.67s. Teniendo en cuenta la cantidad de trabajo que se realiza, esto es un logro realmente impresionante.

2 comentarios: