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.
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
04 | < meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" /> |
05 | < title >An HTML5 Slideshow w/ Canvas & jQuery | Tutorialzine Demotitle > |
07 | < link rel = "stylesheet" type = "text/css" href = "styles.css" /> |
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 > |
22 | < span class = "arrow previous" >span > |
23 | < span class = "arrow next" >span > |
27 | < script src = "script.js" >script > |
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
02 | background-color : #F5F5F5 ; |
03 | border : 1px solid #FFFFFF ; |
09 | -moz-box-shadow: 0 0 22px #111 ; |
10 | -webkit-box-shadow: 0 0 22px #111 ; |
11 | box-shadow: 0 0 22px #111 ; |
17 | list-style : none outside none ; |
30 | #slideshow li:first-child{ |
35 | #slideshow .slideActive{ |
49 | background : url ( 'img/arrows.png' ) no-repeat ; |
56 | #slideshow .previous{ background-position : left top ; left : 0 ;} |
57 | #slideshow .previous:hover{ background-position : left bottom ;} |
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.
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 (){ |
07 | var supportCanvas = 'getContext' in document.createElement( 'canvas' ); |
13 | var slides = $( '#slideshow li' ), |
15 | slideshow = {width:0,height:0}; |
17 | setTimeout( function (){ |
20 | $( '#slideshow img' ).each( function (){ |
24 | slideshow.width = this .width; |
25 | slideshow.height = this .height; |
29 | createCanvasOverlay( this ); |
33 | $( '#slideshow .arrow' ).click( function (){ |
34 | var li = slides.eq(current), |
35 | canvas = li.find( 'canvas' ), |
41 | if ($( this ).hasClass( 'next' )){ |
42 | nextIndex = current >= slides.length-1 ? 0 : current+1; |
45 | nextIndex = current <= 0 ? slides.length-1 : current-1; |
48 | var next = slides.eq(nextIndex); |
54 | canvas.fadeIn( function (){ |
61 | li.fadeOut( function (){ |
62 | li.removeClass( 'slideActive' ); |
64 | next.addClass( 'slideActive' ); |
74 | next.addClass( 'slideActive' ).show(); |
75 | li.removeClass( 'slideActive' ).hide(); |
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
05 | function createCanvasOverlay(image){ |
07 | var canvas = document.createElement( 'canvas' ), |
08 | canvasContext = canvas.getContext( "2d" ); |
11 | canvas.width = slideshow.width; |
12 | canvas.height = slideshow.height; |
15 | canvasContext.drawImage(image,0,0); |
18 | var imageData = canvasContext.getImageData(0,0,canvas.width,canvas.height), |
19 | data = imageData.data; |
24 | for ( var i = 0,z=data.length;i |
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)); |
41 | canvasContext.putImageData(imageData,0,0,0,0,imageData.width,imageData.height); |
44 | image.parentNode.insertBefore(canvas,image); |
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:
buen tutorial. Miriam.
gracias muchas!!
Publicar un comentario