1. Web Design
  2. HTML/CSS
  3. Animation

Construir un efecto hover con eventos del mouse en Java y GSAP

En este tutorial de JavaScript y GSAP, veremos dos efectos hover del cursor. Un cursor JavaScript que cambia su aspecto según el elemento sobre el que se sitúe.
Scroll to top

Spanish (Español) translation by Eva Collados Pascual (you can also view the original English article)

En este tutorial de JavaScript, trabajaremos con dos eventos de cursor en JavaScript y GSAP para construir un creativo efecto que probablemente hayas visto ya en algún sitio web: un cursor personalizado que sigue el nativo y que adapta su apariencia dependiendo del elemento sobre el que esté situado. 

Este tutorial de JavaScript asume que ya estás algo familiarizado con GSAP. Si todavía no conoces esta biblioteca, te animo a que consultes algunos de los recursos disponibles aquí en Tuts+.

Nuestro efecto hover del cursor con JavaScript

Esto es lo que vamos a conseguir al crear estos efectos para el puntero del mouse:

Please accept marketing cookies to load this content.

Presta especial atención a las siguientes cosas de estos eventos del mouse en Java:

  • Conforme el mouse se mueva sobre la página, un cursor JavaScript personalizado seguirá al nativo:
El primer cursor personalizado
  • Conforme el mouse se mueva sobre las imágenes, otro cursor personalizado sustituirá al inicial:
El segundo cursor personalizado
  • A medida que el mouse se mueva sobre los enlaces del copyright, el primer cursor JavaScript personalizado aparecerá a mayor tamaño:
El primer cursor a mayor escala

1. Incluye los recursos requeridos para los eventos del mouse

Como ya hemos debatido, para crear los efectos para el cursor, vamos a usar GSAP.

Recuerda que GSAP no es la única opción para crear estos efectos para el puntero del mouse. Puedes conseguirlo también con JavaScript puro o utilizando otra librería JavaScript para animaciones, por ejemplo, Anime.js.

Para este tutorial de JavaScript he elegido esta librería en lugar de Java puro debido a sus dos potentes herramientas: las funciones para temporizar y una línea de tiempo. Conforme un sitio web evoluciona, mantener todas las animaciones a través de sus líneas de tiempo te ayudará a tener un mayor control sobre tu código.

Opcionalmente, para hacer la página más atractiva y agilizar el proceso de desarrollo, también añadiremos una fuente de Google y Bootstrap 5.

Con esto en mente, si miras bajo la pestaña Ajustes en nuestro pen de demostración, verás que existen dos archivos externos CSS y uno de JavaScript para lograr nuestros eventos del mouse en Java.

Los archivos CSS opcionalesLos archivos CSS opcionalesLos archivos CSS opcionales
El plugin GSAP requeridoEl plugin GSAP requeridoEl plugin GSAP requerido

2. Define la estructura HTML

La estructura de nuestra página consistirá en tres secciones y dos elementos div.

Más concretamente, tendremos las siguientes secciones:

  • La sección de introducción
  • La sección con una retícula de imágenes
  • La sección con las licencias de copyright

Cada div contendrá un icono que será el responsable de mostrar un cursor personalizado dependiendo del elemento sobre el que este se sitúe. Para mayor flexibilidad, puedes insertar estos iconos en tus proyectos usando una etiqueta svg en lugar de una etiqueta img

Aquí tienes la estructura de la página:

1
<section class="intro">...</section>
2
<section class="image-grid">
3
  <div class="container-fluid">
4
    <div class="row">
5
      <div class="col-12 col-sm-6 col-md-4">
6
        <a class="d-block" href="" target="_blank">
7
          <img width="640" height="426" src="bee1.jpg" class="shadow img-fluid" alt="">
8
        </a>
9
      </div>
10
      <div class="col-12 col-sm-6 col-md-4">
11
        <a class="d-block" href="" target="_blank">
12
          <img width="640" height="426" src="/bee2.jpg" class="shadow img-fluid" alt="">
13
        </a>
14
      </div>
15
      <div class="col-12 col-sm-6 col-md-4">
16
        <a class="d-block" href="" target="_blank">
17
          <img width="640" height="426" src="bee3.jpg" class="shadow img-fluid" alt="">
18
        </a>
19
      </div>
20
    </div>
21
  </div>
22
</section>
23
<section class="copyright">
24
  <div class="container">
25
    <div class="row justify-content-center">
26
      <div class="col-auto">
27
        <p class="mb-0">Images from <a class="line-animation" href="https://pixabay.com/" target="_blank">Pixabay.com</a></p>
28
      </div>
29
      <div class="col-auto">
30
        <p class="mb-0">SVG icon from <a class="line-animation" href="https://svgsilh.com/" target="_blank">SVG Silh</a></p>
31
      </div>
32
      <div class="col-auto">
33
        <p class="mb-0">Text from <a class="line-animation" href="https://en.wikipedia.org/wiki/Cinque_Terre" target="_blank">Wikipedia</a></p>
34
      </div>
35
    </div>
36
  </div>
37
</section>
38
39
<div class="cursor cursor-bee">
40
  <img width="30" height="26" src="cursor-bee.svg" alt="">
41
</div>
42
<div class="cursor cursor-eye">
43
  <img width="60" height="60" src="cursor-eye.svg" alt="">
44
</div>

3. Especifica los principales estilos para los eventos del mouse en Java

En este tutorial JavaScript nos vamos a concentrar ahora en los estilos de los efectos para el cursor en CSS, ya que son los que importan.

Aquí tienes algunas cosas importantes para crear nuestros eventos del mouse en Java:

  • Los cursores estarán posicionados de forma fija.
  • Estableceremos en concordancia los valores de sus propiedades top y left de manera que el cursor nativo o estándar aparezca en el centro de los personalizados.
  • Les asignaremos la propiedad pointer-events: none para deshabilitar las interacciones de los mismos.
  • El cursor en forma de abeja siempre estará bajo los elementos de la página, mientras que el cursor en forma de ojo estará situado sobre ellos. 
  • Ambos cursores estarán inicialmente ocultos.

Aquí tienes los estilos asociados:

1
/*CUSTOM VARIABLES HERE*/
2
3
.cursor {
4
  position: fixed;
5
  pointer-events: none;
6
  opacity: 0;
7
}
8
9
.cursor-bee {
10
  top: -15px;
11
  left: -13px;
12
  z-index: -1;
13
}
14
15
.cursor-eye {
16
  top: -50px;
17
  left: -50px;
18
  padding: 20px;
19
  z-index: 1;
20
  border-radius: 50%;
21
  background-color: var(--darkblue);
22
}

4. Añade el JavaScript para los efectos del puntero del mouse

Añadamos ahora GSAP al juego. Conforme movemos el cursor dentro de la página, se disparará la devolución de llamada mousemoveHandler():

1
document.addEventListener("mousemove", mousemoveHandler);

Dentro de esta función, iniciaremos una línea del tiempo y después ejecutaremos las siguientes acciones:

  1. Detectaremos el elemento sobre el que está el cursor.
  2. Definiremos algunas propiedades predeterminadas que todos los cursores personalizados heredarán. Más concretamente, cogeremos las coordenadas X e Y del cursor del mouse relativas a la ventana de visualización y pasaremos sus valores a los elementos de destino correspondientes. Además, usaremos la misma función de temporizador para todas las animaciones.
  3. Si el elemento sobre el que está el cursor es una imagen dentro de la retícula de imágenes, el efecto hover ocultará el cursor JavaScript en forma de abeja y mostraremos el cursor ojo.
  4. En cualquier otro caso, el efecto hover ocultará el cursor en forma de ojo y al mismo tiempo mostrará la abeja. En este punto, también comprobaremos si el elemento sobre el que está el cursor es alguno de los enlaces dentro de la sección del copyright. Si ocurre esto, cuadruplicaremos el tamaño del cursor.

Aquí tienes el correspondiente código JavaScript para los efectos del puntero del mouse

1
const cursorBee = document.querySelector(".cursor-bee");
2
const cursorEye = document.querySelector(".cursor-eye");
3
let scale = 1;
4
5
function mousemoveHandler(e) {
6
  // 1

7
  const target = e.target;
8
  // 2

9
  const tl = gsap.timeline({
10
    defaults: {
11
      x: e.clientX,
12
      y: e.clientY,
13
      ease: "power2.out"
14
    }
15
  });
16
17
  // 3

18
  if (
19
    target.tagName.toLowerCase() === "img" &&
20
    target.closest(".image-grid")
21
  ) {
22
    tl.to(cursorBee, {
23
      opacity: 0
24
    }).to(
25
      cursorEye,
26
      {
27
        opacity: 1
28
      },
29
      "-=0.5"
30
    );
31
  } else {
32
    // 4

33
    if (target.classList.contains("line-animation")) {
34
      scale = 4;
35
    } else {
36
      scale = 1;
37
    }
38
39
    tl.to(cursorBee, {
40
      opacity: 1,
41
      scale: scale
42
    }).to(
43
      cursorEye,
44
      {
45
        opacity: 0
46
      },
47
      "-=0.5"
48
    );
49
  }
50
}

Nota: dependiendo del tipo de posicionamiento del cursor (por ej. absoluto), podemos coger las coordenadas del puntero del mouse utilizando las propiedades pageX y pageY en lugar de clientX and clientY.

De la misma forma, conforme el cursor deja de moverse alrededor de la página, se disparará la devolución de llamada mouseLeaveHandler():

1
document.addEventListener("mouseleave", mouseleaveHandler);

Dentro de esta función, crearemos un elemento que será el responsable de ocultar el efecto hover del cursor JavaScript en forma de abeja: 

1
...
2
3
function mouseleaveHandler() {
4
  gsap.to(cursorBee, {
5
    opacity: 0
6
  });
7
}

Conclusión

En este tutorial de JavaScript, hemos logrado construir un efecto hover de cursor con JavaScript y GSAP. 

Veamos de nuevo los efectos para el puntero del mouse que hemos construido:

Please accept marketing cookies to load this content.

Esperamos que puedas aplicar los efectos para el puntero del mouse que has aprendido aquí en alguno de tus proyectos. Basándote en lo que acabamos de crear, avanza y construye algo incluso más creativo añadiendo interesantes efectos CSS como la propiedad he mix-blend-mode. O mejora este código para limitar el efecto  solo a los dispositivos que no admitan gestos táctiles o/y a pantallas con una anchura mayor a una determinada. 

Como siempre, ¡Muchas gracias por leernos!

Más efectos hover y tutoriales de JavaScript