Programación en castellano
Inicio > Taller ASP > Lenguajes de script > Javascript > Un ratón con estela
-Artículos

Un ratón con estela

1 . ¿Qué necesitamos?
2 . Objeto Estela
    2.1 . Inicialización
3 . Funciones auxiliares
4 . Inicialización

Ultimamente parece haberse puesto de moda en muchas páginas web el hecho de que el ratón vaya dejando una estela. Te enseñamos a hacerlo de modo que funcione en todos los navegadores de versión mayor a la 4.

¿Qué necesitamos?

Lo primero que vamos a necesitar para poder realizar esta técnica, son los gráficos que compondrán la estela. En el código en el que basamos este ejemplo, vamos a tener sólo uno llamado circulo.gif.

circulo.gif

De todos modos, el código permite que tanto el número de gráficos que componen la estela, como los nombres de los mismos sean fácilmente sustituibles. Lo normal sería tener un gráfico por cada elemento que compone la estela, pero como nosotros lo vamos a hacer con círculos, solamente utilizaremos uno cuyo tamaño cambiaremos adecuadamente.

Por otro lado, en el código utilizaremos el objeto DetectorNavegador que ya utilizamos en artículos anteriores.

Objeto Estela

Cada uno de los gráficos que componen la estela será un objeto Javascript distinto al que daremos el nombre de Estela. Para inicializarlo utilizaremos el siguiente constructor:

// Objeto Estela
function Estela(capaID, anchura, altura, nombreImg) {
  this.x = 0;
  this.y = 0;
  this.mover = MoverEstela;
  this.seguirRaton = EstelaSeguirRaton;
  document.write(soporta.NS4 ?
    "<layer id='" + capaID + "' left=" + this.x + " top=" + this.y +
    " width=" + anchura + " height=" + altura + ">" :
    "<div id='" + capaID + "'" + " style='position:absolute;left:" +
    this.x + "; top:" + this.y + "; width:" + anchura + "; height:" +
    altura + ";'>");
  document.write("<img src='" + nombreImg + "' width=" + anchura +
    " height=" + altura + " border=0>");
  document.write(!soporta.NS4  ? "</div>" : "</layer>");
  this.capaRef = (soporta.DOM) ? document.getElementById(capaID) :
    (soporta.IE4) ? document.all[capaID] : document.layers[capaID];
  this.estiloRef = (soporta.NS4) ? this.capaRef : this.capaRef.style;
}

El constructor toma cuatro parámetros: el nombre que tendrá la capa (puede ser cualquiera, siempre que no se repita), la altura y anchura de la imagen y el nombre del fichero que contiene la misma. Lo que hace, primero, es construir las referencias adecuadas para los métodos y propiedades del objeto. Dispondrá de dos propiedades (x e y), que contendrán la posición de la capa, y dos métodos (mover y seguirRaton) que permitirán que la capa se mueva, ya sea a unas coordenadas concretas o las que en ese momento posea el ratón.

Lo siguiente es escribir el código HTML correspondiente a la capa. Esta capa contendrá el gráfico (y sólo eso), tendrá su misma altura y anchura y el nombre que le hayamos pasado como parámetro. Estará colocada en las coordenadas x=0 e y=0, que corresponden a la esquina superior izquierda. Hay que tener en cuenta que la estela estará en estas coordenadas sólo el tiempo que tardemos en mover el ratón, por lo que no resultan muy importantes.

Finalmente, crea un par de referencias: a la capa y al objeto que contiene los atributos de la misma. Esto es necesario porque cada navegador alberga dichas referencias con nombres distintos.

Vamos a ver ahora que hacen los métodos:

function MoverEstela(x,y){
  this.estiloRef.left = x;
  this.x = x;
  this.estiloRef.top = y;
  this.y = y;
}

Este método simplemente mueve la capa a las coordenadas indicadas, actualizando a la vez las propiedades x e y).

function EstelaSeguirRaton(e){
  this.mover(
    soporta.IE4 ?
      event.clientX + (soporta.DOM ? document.body.scrollLeft : 0) :
      e.pageX+2,
    soporta.IE4 ?
      event.clientY + (soporta.DOM ? document.body.scrollTop : 0) :
      e.pageY+2);
}

Este resulta más complicado. También mueve la capa, pero lo hace a las coordenadas a las que actualmente indique el puntero del ratón. Para averiguar éstas, necesitamos de un objeto de tipo Event al que llamamos e. Este objeto sólo está disponible en el momento en que sucede un evento, por lo que no podremos averiguar las coordenadas del ratón hasta que se produzca uno.

Tanto Explorer como Netscape disponen de propiedades que permiten acceder a la posición del puntero del ratón, pero tienen nombres distintos. De hecho incluso pueden tener valores distintos dependiendo de si estamos utilizando Explorer 4 o 5. Pero bueno, en el código tenéis la "solución" universal.

Inicialización

Una vez escrito el código del objeto, necesitaremos inicializar diversas instancias del mismo; una por cada gráfico que forme parte de la estela:

var soporta = new DetectorNavegador();
var numImg = 6;
var ritmo = 50;
var estelas = new Array(numImg);
estelas[0] = new Estela("est1", 30, 30, "graficos/circulo.gif");
estelas[1] = new Estela("est2", 25, 25, "graficos/circulo.gif");
estelas[2] = new Estela("est3", 20, 20, "graficos/circulo.gif");
estelas[3] = new Estela("est4", 15, 15, "graficos/circulo.gif");
estelas[4] = new Estela("est5", 10, 10, "graficos/circulo.gif");
estelas[5] = new Estela("est6", 5, 5, "graficos/circulo.gif");

En la variable numImg indicaremos el número de gráficos que componen la estela. Mejor dicho, el número de capas que contienen gráficos y que forman parte de la estela. Conviene aclararlo porque, en nuestro caso, estrictamente hablando, sólo disponemos de un gráfico. La variable ritmo indica la velocidad a la que la estela seguirá al ratón. Modificándola se puede variar sustancialmente el efecto. Por último, el vector estelas contiene los objetos Estela necesarios. Podéis ver cómo el nombre del gráfico no cambia en cada uno de ellos, pero sí su tamaño.

Funciones auxiliares

Para que todo el tinglado funcione, necesitaremos un par de funciones auxiliares:

function seguirRaton(e){
  estelas[numImg-1].seguirRaton(e);
}

Esta función es un controlador de evento que será llamado cuando el ratón se mueva. En tal caso le comunicará al último de los objetos Estela que componen el vector estelas (en nuestro ejemplo, el círculo más pequeñito) que se coloque en las mismas coordenadas que el puntero del ratón. Pero eso sólo mueve uno, así que necesitamos otra función para mover a los demás:

function ciclo(){
  for (i=0;i<(numImg-1);i++)
    estelas[i].mover(estelas[i+1].x,estelas[i+1].y);
  setTimeout("ciclo()", ritmo);
}

Esta función va recorriendo el vector de estelas del primer al penúltimo elemento, indicandole a cada uno que debe tomar la posición que tenía en el anterior ciclo el círculo inmediatamente anterior. Esta función es la que se encarga, por tanto, del movimiento de todos los demás círculos.

También se encarga de llamarse a sí misma con una espera de "ritmo" milisegundos. Si no lo hicieramos así no se produciría esa especie de inercia que se puede observar cuando se ejecuta esta técnica, pues todos los círculos seguirían al ratón a tal velocidad que no nos enteraríamos de nada.

Inicialización

Por último, debemos realizar un par de tareas de inicialización si queremos que todo este tinglado empiece a funcionar:

if (soporta.DHTML) {
  if(soporta.NS4)
    document.captureEvents(Event.MOUSEMOVE);
  document.onmousemove=seguirRaton;
  setTimeout("ciclo()", ritmo);
}

Básicamente, hacemos dos cosas: capturamos el evento de movimiento de ratón y le decimos que en caso de que ocurra llame a nuestra función seguirRaton y le decimos que ejecute ciclo por primera vez dentro de un ratito.

Y eso es todo, si quereis podeis ver el código fuente de esta página y copiar el código Javascript literalmente en las vuestras y vereis que funciona sin problemas.

 

Últimos comentarios
Últimos 5 comentarios

RAton?? (19/05/2005)

Por
Un rton con estela? eso tengo q verlo , habia visto que el puntero dejara estela pero ... el raton... diablos debe ser algo increible, casi mágico

estoy de acuerdo (14/03/2004)

Por
En mi caso me dedico a la realizacion de software cuando aprendi visual basci que fue mi primer lenguaje de programacion cuando cambie el color de un form por codigo me senti emocionado ahora que domino varios lenguasjes de programacio me siento bien cuando ayudo a otros como yo a ser mejores programadores y si eresun estupido presumido

en Jsp (06/03/2004)

Por
Quien puede ayudarme a hacer una ESTELA DE TEXTO osea el texto en movimiento del lado del cursor del lenguaje html pero lo q deseo es en el lenguaje JSP si alguien pudiera ayudarme le estaria agradecido.......... saludos a la gente chancona y cool......
.....YAES

YO ESTOY CON JUANJO (18/11/2003)

Por
pues tiene toda la razon hacer una pagina web no es como hacer un documento de word.. en el word no hay interactividad.. si es eso todo lo que sabes hacer no intentes hacer mas sin adentrarte. Coño! es muy fuerte el post que hay para que se lo hiciese para su pagina y el de los vinculos: Quieres hacer una pagina web y no saben como van los vinculos???? es como querer conducir y no saber que es un volante y un acelerador..... Gracias a windows nos creemos que la informatica es facil y para todos... y una puta mierda... si quieres hacer cosas buenas tienes que aprenderlo y paso por paso

ni caso (06/06/2003)

Por
No hagais caso a este pobre infeliz.... total, es tonto, que le vamos a hacer?, y el que nace tonto, crece tonto, se desarrolla tonto y muere tonto... no perdais el tiempo en intentar que razone, es simplemente, eso....tonto
 
Tienda
Patrocinados
 

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: musica mp3 | logos y melodias | hospedaje web linux | registro de dominios | servidores dedicados
más internet: comprar | recursos gratis | posicionamiento en buscadores | tienda virtual | gifs animados