A veces queremos mostrar las fotografías que tenemos de una forma espectacular (o casi) y siempre pensamos en realizarlo mediante Flash. ¿Por qué no?, yo no soy muy amante del Flash, pero me parece bien que se use. Si tampoco eres fan del Flash o si prefieres hacerlo mediante DHTML, quizás te interese esta forma de realizarlo.
Se trata de mostrar las imágenes agrupadas de cinco en cinco (no más para que no quede saturada la página, aunque es válido para cualquier número de imágenes), moviéndose circularmente con perspectiva 3D, dando la posibilidad de parar el movimiento y aumentar o disminuir la velocidad de rotación.
Lo primero que necesitamos es un contenedor para colocar las imágenes, se va a usar una capa DIV y tendrá que tener posicionamiento absoluto para poder moverla libremente por la pantalla (position: absolute).
<DIV id="contenedor" style="position: absolute">Cargando datos...</DIV> <!-- El texto se pone para que aparezca algo mientras se cargan los datos -->
Una vez creado el contenedor, tenemos que escribir un control para controlar la velocidad de rotación y para movernos entre las distintas páginas.<table> <tr> <td onclick="paginaAnterior()" style="cursor: hand; cursor:pointer"><< ANTERIOR</td> <td onclick="reduce()" style="cursor: hand; cursor:pointer">-</td> <td id=vel1 onclick="ponVelocidad(1)" style="cursor: hand; cursor:pointer"> </td> <td id=vel4 onclick="ponVelocidad(4)" style="cursor: hand; cursor:pointer"> </td> <td id=vel7 onclick="ponVelocidad(7)" style="cursor: hand; cursor:pointer"> </td> <td id=vel10 onclick="ponVelocidad(10)" style="cursor: hand; cursor:pointer"> </td> <td id=vel13 onclick="ponVelocidad(13)" style="cursor: hand; cursor:pointer"> </td> <td id=vel16 onclick="ponVelocidad(16)" style="cursor: hand; cursor:pointer"> </td> <td id=vel19 onclick="ponVelocidad(19)" style="cursor: hand; cursor:pointer"> </td> <td onclick="aumenta()" style="cursor: hand; cursor:pointer">+</td> <td onclick="paginaSiguiente()" style="cursor: hand; cursor:pointer">SIGUIENTE >></td> </tr> </table>
La primera y la última celda de la tabla son para ir a las páginas anteriores y siguientes. La segunda celda y la penúltima celda son para aumentar la velocidad o disminuirla. Las celdas intermedias para seleccionar directamente una velocidad.Entremos en el código Javascript que se encarga del dinamismo de las fotografías, empezando por la definición de variables.
var evento;
Necesitamos una variable para almacenar el identificador del proceso que ejecutamos repetitivamente para rotar las imágenes.var velocidad=10;
Almacenaremos la velocidad en un variable para que se pueda modificar.var nombreImagenes = new Array('1', '2', '3', '4', '5');
Un array con los nombres de las imágenes, la extensión la tengo predeterminada como ".jpg". En este caso son 5 imágenes, pero puede haber más, el número es este porque más podrían saturar la página. Deben existir dos imágenes, <nombre>.jpg y g<nombre>.jpg, la primera imágen es la miniatura y la segunda es el original que se abrirá cuando se pulse en la imagen. El tamaño de las miniaturas no debe ser grande para evitar así que unas se tapen a otras mientras mientras giran.var imagenes = new Array();
Para almacenar las imagenes.La primera función que vamos a usar es la que crea los objetos Image y las posiciona en el contenedor. Deberá incluirse en el evento onload del BODY.
function carga() { // Obtenemos el objeto DIV que contendrá las imágenes var obj = document.getElementById("contenedor"); /* Inicializamos cada imágen, dándole una posición fija, estilos, eventos: hacer que pare la rotacion cuando se pone encima el ratón, continuar la rotación cuando se deja de poner el ratón en la imagen, abrir la imagen original cuando se pulsa en ella, ... */ for (var i=0; i<nombreImagenes.length; i++) { imagenes[i] = new Image(); imagenes[i].src = nombreImagenes[i]+'.jpg'; imagenes[i].style.top = '100px'; imagenes[i].style.left = '200px'; imagenes[i].style.width = '100px'; imagenes[i].style.height = '100px'; imagenes[i].style.border = '1px solid black'; imagenes[i].style.cursor = (IE)? "hand":"pointer"; imagenes[i].onmouseover = parar; imagenes[i].onmouseout = rotar; imagenes[i].onclick = abre; imagenes[i].angulo=0; imagenes[i].ancho = tamImagenes[i][0]; imagenes[i].alto = tamImagenes[i][1]; imagenes[i].comentario = comentarios[i]; } // Calculamos la separación entre cada imagen var parte = 360/imagenes.length; // Posicionamos cada imagen for (i=0; i<imagenes.length; i++) { posiciona(imagenes[i], i*parte); } // Añadimos las imagenes al contenedor obj.innerHTML = ""; for (var i=0; i<imagenes.length; i++) { obj.appendChild(imagenes[i]); } }
La siguiente función es la que se encarga de posicionar la imagen dentro del contenedor, se calcula la posición izquierda, posición derecha, el ancho y el alto de la imagen y la posicion en la coordenada Z. Para hacer el efecto 3D es necesario cambiar el tamaño de la imagen para simular la profundidad.function posiciona(_obj, _parte) { // Calculamos el ángulo de la circunferencia por la // que gira var parte = (_parte+_obj.angulo)*2*Math.PI/360; _obj.angulo = (parseInt(_obj.angulo) + _parte) % 360; _obj.style.position = "absolute"; // Posición dentro del eje Z (profundidad) _obj.style.zIndex = parseInt((200-40*Math.sin(parte))); // Calculamos el ancho y el alto según la profundidad // (en este caso se trata de un cuadrado) ancho = parseInt((65-35*Math.sin(parte))); _obj.style.width = ancho+"px"; _obj.style.height = ancho+"px"; // Calculamos la posicion vertical según el // ancho y el ángulo _obj.style.top = parseInt( (100-40*Math.sin(parte)) -(ancho/2))+"px"; // Calculamos la posicion horizontal según el // ancho y el ángulo _obj.style.left = parseInt( ((document.body.clientWidth/2) +100*Math.cos(parte))-(ancho/2))+"px"; }
La función para rotar las imágenes se debe llamar en el evento onload del BODY y debe ejecutarse cada cierto tiempo.function rotar() { // Obtenemos todas las imagenes del contenedor y // luego las posicionamos var obj = document.getElementById("contenedor"); var imgs = obj.getElementsByTagName("img"); for (var i=0; i<imgs.length; i++) { posiciona(imgs[i], velocidad); } evento = setTimeout("rotar()", 100); }
Y por último las funciones relativas a la velocidad de rotación.// Para el movimiento de las imagenes cancelando // el proceso de rotación function parar(evt) { clearTimeout(evento); } // Disminuye la velocidad function reduce() { if (velocidad > 1) { velocidad -= 3; } } // Aumenta la velocidad function aumenta() { if (velocidad < 19) { velocidad += 3; } } // Fija la velocidad function ponVelocidad(n) { velocidad = n; }
Un ejemplo se puede ver aquí: ARCHIVO ZIPescrito por Luis a las 1/31/2006 04:24:00 p. m.
8 Comentarios:
Luis, si no te importa, voy adaptar este magnífico js a mi web.
Gracias por tu gran trabajo
Por Anónimo, a las 2/03/2006 12:50:00 p. m.
Hola, gracias por la visita y me alegra que te haya gustado el script. Ponlo en tu web con toda libertad, estaría bien que me pasaras la url de tu web y así ver el script funcionando.
Saludos.
Por Luis, a las 2/03/2006 02:23:00 p. m.
Hola Luís, a mi me ha emocionado!
Lo he retocado aquí en el apartado "monitors".
He modificado el tamaño de las imágenes y la posición vertical, así como eliminado los botones.
No deja de sorprenderme el javascript.
Mil gracias!!!
Guillem
Por Anónimo, a las 3/22/2006 08:46:00 p. m.
Hola Guillem.
Me alegro de que lo hayas usado y sobre todo de que te guste.
Nada, cuando me pase por Cataluña ya me invitarás a algo, jeje
Saludos
Por Anónimo, a las 3/22/2006 08:56:00 p. m.
Estás más que invitado ;-)
Un saludo
Por Anónimo, a las 3/22/2006 09:16:00 p. m.
Hola Luis.. Mi nombre es Ivan y me fascino tu forma de programar presentaciones dinamicas de fotos para html...algo que me gusta hacer en mis tiempos libres (html no mas).
Pero me da mucho gusto que hayan cerebros que rompan con los esquemas tradicionales...te felicito...un abrazo..desde Peru.
enviame tu correo..el mio es ivanescalantecaso@yahoo.es (tambien Barato ) jejejej. Bye.
Por Anónimo, a las 3/27/2006 05:39:00 p. m.
hOLA, MUY BUEN SCRIPT, ALGUIEN ME PUEDE AYUDAR A HACER ALGO SIMILAR PERO MOSTRANDO UN SOLO PRODUCTO QUE ROTE Y DE LA IMPRESION DE SER 3D? USANDO FOTOS DEL PRODUCTO TOMADAS DE DIFERENTES ANGULOS, PLEASE.
lein01@hotmail.com
Por Anónimo, a las 7/13/2006 04:37:00 p. m.
Supongo que lo que necesitas es hacer las distintas fotos desde distintos angulos, y crearte un gif animado o una animación flash, y tan solo usar una imagen en vez de varias.
Aunque si te soy sincero, yo no haría nada de esto, simplemente me creaba el gif o flash (mejor flash) y que a parte de rotar, se trasladara. Más sencillo y más rapido y eficiente.
Si tienes mas dudas, no dudes en escribirme
Por Anónimo, a las 7/13/2006 08:19:00 p. m.
Publicar un comentario
<< Inicio