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
Ver todos: BotonesDó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.