0

viajeros felices

React + MotionTexto y scroll

Contador animado

Una cifra que cuenta desde cero hasta tu número en cuanto aparece en pantalla al hacer scroll.

Ajustes

2400
1200ms

Código

import { useEffect, useRef, useState } from "react";
import { useInView } from "framer-motion";

interface InViewCounterProps {
  end?: number;
  /** Milisegundos que tarda en llegar a la cifra final. */
  duration?: number;
  label?: string;
}

export default function InViewCounter({
  end = 2400,
  duration = 1200,
  label = "viajeros felices",
}: InViewCounterProps) {
  const ref = useRef<HTMLDivElement>(null);
  // useInView mira el viewport y respeta el recorte de los contenedores con scroll: funciona en ambos casos.
  const seen = useInView(ref, { once: false });
  const [n, setN] = useState(0);

  useEffect(() => {
    if (!seen) {
      setN(0);
      return;
    }
    const start = performance.now();
    let raf = 0;
    const run = (t: number) => {
      const p = Math.min(1, (t - start) / duration);
      setN(Math.round(end * p));
      if (p < 1) raf = requestAnimationFrame(run);
    };
    raf = requestAnimationFrame(run);
    return () => cancelAnimationFrame(raf);
  }, [seen, duration, end]);

  return (
    <div ref={ref} className="text-center text-[#1d1d1f] dark:text-[#f5f5f7]">
      <strong className="text-5xl font-semibold tabular-nums">{n.toLocaleString("es-ES")}</strong>
      <p className="text-sm text-[#86868b]">{label}</p>
    </div>
  );
}

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 Texto y scroll

Dónde usarlo

Las cifras que cuentan hacia arriba se leen; las quietas se saltan. Úsalo en la parte de pruebas de una landing: «2.400 viajeros felices», proyectos entregados por un estudio, comidas servidas por una ONG o descargas de una app. Este contador animado en React empieza al hacerse visible, no al cargar la página.

Usa solo cifras que puedas respaldar, porque la animación les da todavía más protagonismo. Deja la duración en torno a un segundo; si tarda más, la gente sigue bajando antes de que acabe. Vuelve a contar cada vez que reaparece.