React + MotionBotones

Botón magnético

Un botón que va detrás del cursor con efecto muelle y vuelve a su sitio en cuanto te alejas.

Ajustes

24px
0.5

Código

import { motion, useMotionValue, useSpring } from "framer-motion";

interface MagneticButtonProps {
  color?: string;
  radius?: number;
  text?: string;
  intensity?: number;
}

export default function MagneticButton({
  color = "#0071e3",
  radius = 24,
  text = "Pasa el cursor",
  intensity = 0.5,
}: MagneticButtonProps) {
  const x = useMotionValue(0);
  const y = useMotionValue(0);
  const sx = useSpring(x, { stiffness: 200, damping: 15 });
  const sy = useSpring(y, { stiffness: 200, damping: 15 });

  return (
    <motion.button
      type="button"
      style={{ x: sx, y: sy, backgroundColor: color, borderRadius: radius }}
      className="px-6 py-3 text-sm font-semibold text-white shadow-lg"
      onMouseMove={(e) => {
        const r = e.currentTarget.getBoundingClientRect();
        x.set((e.clientX - r.left - r.width / 2) * intensity);
        y.set((e.clientY - r.top - r.height / 2) * intensity);
      }}
      onMouseLeave={() => {
        x.set(0);
        y.set(0);
      }}
    >
      {text}
    </motion.button>
  );
}

Prompt para IA

Pégalo en ChatGPT, Claude o Cursor y adaptará el bloque a tu proyecto con estos ajustes, aunque no uses React.

Más en Botones

Dónde usarlo

Úsalo en el clic que más te importa: el «Prueba gratis» de la landing de un SaaS, el «Pide presupuesto» de un estudio o el botón de descarga de una app. Como sigue al puntero, atrae la mirada sin parpadeos ni colores chillones. Si buscabas un efecto de botón magnético en React, es este.

Empieza con la intensidad que trae y súbela solo en botones grandes y aislados. Pegado a una fila de enlaces se nota inquieto. En pantallas táctiles no hay hover, así que en el móvil funciona como un botón normal.