React + MotionBotones

Botón con efecto ripple

Cada clic lanza una onda suave desde el punto exacto donde pulsas, como una gota cayendo en el agua.

Ajustes

24px
1

Código

import { useState } from "react";
import { motion } from "framer-motion";

interface Ripple {
  id: number;
  x: number;
  y: number;
}

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

export default function RippleButton({
  color = "#0071e3",
  radius = 24,
  text = "Haz clic",
  intensity = 1,
}: RippleButtonProps) {
  const [ripples, setRipples] = useState<Ripple[]>([]);

  return (
    <button
      type="button"
      className="relative overflow-hidden px-6 py-3 text-sm font-semibold text-white shadow-lg"
      style={{ backgroundColor: color, borderRadius: radius }}
      onClick={(e) => {
        const r = e.currentTarget.getBoundingClientRect();
        const id = Date.now();
        setRipples((p) => [...p, { id, x: e.clientX - r.left, y: e.clientY - r.top }]);
        setTimeout(() => setRipples((p) => p.filter((rp) => rp.id !== id)), 700);
      }}
    >
      <span className="relative z-10">{text}</span>
      {ripples.map((r) => (
        <motion.span
          key={r.id}
          className="absolute rounded-full bg-white/40"
          style={{ left: r.x, top: r.y, width: 10, height: 10, x: "-50%", y: "-50%" }}
          initial={{ scale: 0, opacity: 0.8 }}
          animate={{ scale: 20 * intensity, opacity: 0 }}
          transition={{ duration: 0.7, ease: "easeOut" }}
        />
      ))}
    </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

La onda es una respuesta pequeña que dice «sí, lo he recibido». Queda natural en paneles de control, zonas de administración y formularios donde se hace clic a menudo: «Guardar», «Añadir a la lista», «Enviar». Quien haya usado un móvil Android reconocerá este botón con efecto ripple a la primera, así que no hay que explicar nada.

Dale al botón un color con cuerpo para que la onda blanca se vea. En botones pequeños baja la intensidad, o la onda lo tapa todo de golpe. Para una web muy minimalista quizá te encaje más un botón que simplemente se hunde al pulsar.