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
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.