DEV Community

Cover image for Cómo crear un Blob que sigue tu cursor con JavaScript 🚀✨
Carmen Ansio
Carmen Ansio

Posted on

Cómo crear un Blob que sigue tu cursor con JavaScript 🚀✨

Si alguna vez has querido darle vida a tu cursor, este tutorial es para ti. Vamos a crear un Blob interactivo que reacciona al movimiento del mouse. ¡Es más fácil de lo que parece y súper divertido! 🌌

Al final, tendrás algo como esto:


🛠 Paso 1: Estructura básica

Primero necesitamos un archivo HTML que contenga un <canvas> (donde dibujaremos los blobs) y un texto que le dé un toque galáctico.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Cosmic Blob</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <canvas id="canvas"></canvas>
  <div class="cosmic-text">Cosmic</div>
  <script src="script.js"></script>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

El texto "Cosmic" es puramente estético, pero le da ese vibe espacial que buscamos.

Ahora vamos con el CSS para darle estilo:

/* styles.css */
body {
  margin: 0;
  overflow: hidden;
  background: #000; /* Fondo negro */
  cursor: none; /* Ocultamos el cursor */
}

canvas {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

.cosmic-text {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  color: white;
  font-family: "Space Mono", serif;
  font-size: 15vw;
  font-weight: 700;
  text-shadow: 0 0 40px #444857, -1px 1px 60px rgba(255, 255, 255, 0.2);
  pointer-events: none; /* Evitamos que el texto interfiera con el mouse */
  z-index: 10; /* Aseguramos que esté por encima del canvas */
}
Enter fullscreen mode Exit fullscreen mode

Esto nos da un canvas que ocupa toda la pantalla y un texto centrado que parece flotar en el espacio.


🎨 Paso 2: Configurar el canvas y detectar el mouse

Ahora pasamos a script.js. Lo primero es configurar el canvas para que cubra la pantalla y ajustar su tamaño automáticamente si la ventana cambia.

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

// Almacenamos la posición del mouse
let mouse = { x: 0, y: 0 };

// Ajustamos el tamaño del canvas al tamaño de la ventana
function resizeCanvas() {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
}

// Eventos para redimensionar el canvas y detectar el movimiento del mouse
window.addEventListener("resize", resizeCanvas);
window.addEventListener("mousemove", (e) => {
  mouse.x = e.clientX;
  mouse.y = e.clientY;
});

// Inicializamos el canvas
resizeCanvas();
Enter fullscreen mode Exit fullscreen mode

Esto es la base para que podamos dibujar en el canvas y hacer que el blob siga al cursor.


🚀 Paso 3: Movimiento suave con lerp

No queremos que el blob siga al mouse de manera brusca. En su lugar, usaremos interpolación lineal (o lerp) para suavizar el movimiento.

let currentX = 0;
let currentY = 0;

function lerp(start, end, t) {
  return start * (1 - t) + end * t;
}
Enter fullscreen mode Exit fullscreen mode

En cada frame, actualizamos las coordenadas del blob de forma gradual:

currentX = lerp(currentX, mouse.x, 0.1);
currentY = lerp(currentY, mouse.y, 0.1);
Enter fullscreen mode Exit fullscreen mode

Esto hace que el blob parezca más vivo, como si tuviera inercia.


🌌 Paso 4: Dibujar el Blob

Ahora, lo interesante. Vamos a dibujar un gradiente radial que seguirá al cursor y formará nuestro Cosmic Blob.

let time = 0;

function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height); // Limpiamos el canvas
  time += 0.03; // Incrementamos el tiempo para animar

  // Gradiente que sigue al cursor
  const gradient = ctx.createRadialGradient(
    currentX, currentY, 0,
    currentX, currentY, 600
  );
  gradient.addColorStop(0, "#5B21B6");
  gradient.addColorStop(0.4, "#EC4899");
  gradient.addColorStop(0.8, "#3B82F6");
  gradient.addColorStop(1, "#5B21B6");

  ctx.save();
  ctx.filter = "blur(120px)";

  // Dibujamos varios blobs alrededor del cursor
  for (let i = 0; i < 6; i++) {
    const angle = time * 0.5 + (i * Math.PI * 2) / 6;
    const radius = 80 + Math.sin(time * 2 + i) * 40;
    const offsetX = Math.cos(angle) * radius;
    const offsetY = Math.sin(angle) * radius;

    ctx.beginPath();
    ctx.arc(currentX + offsetX, currentY + offsetY, 150, 0, Math.PI * 2);
    ctx.fillStyle = gradient;
    ctx.fill();
  }
  ctx.restore();

  requestAnimationFrame(animate); // Llamamos a la animación en el siguiente frame
}
animate();
Enter fullscreen mode Exit fullscreen mode

🌟 Paso 5: Añadir ruido para un toque orgánico

Queremos que el blob parezca más dinámico, casi como si estuviera vivo. Para eso, añadimos una función de "ruido".

function noise(x, y) {
  const noiseScale = 0.05;
  const amplitude = 50;
  return (
    Math.sin(x * noiseScale + time) *
    Math.cos(y * noiseScale + time * 0.8) *
    amplitude
  );
}
Enter fullscreen mode Exit fullscreen mode

Integramos este ruido en las coordenadas de los blobs para que se deformen de forma natural:

ctx.arc(
  currentX + offsetX + noise(currentX, currentY),
  currentY + offsetY + noise(currentY, currentX),
  150,
  0,
  Math.PI * 2
);
Enter fullscreen mode Exit fullscreen mode

¡Eso es todo! 🎉

Ahora tienes un Blob que sigue al cursor con un movimiento fluido.

Puedes ver el código completo y probarlo en mi CodePen:

Top comments (0)