css-infinite-scroll

ui

src

tailwind.css

css
@import "tailwindcss";

@layer base {
    :root {
        --scroll-t: 30s;
        --scroll-c: 6;
        --scroll-w: 300px;
    }
}

@theme {
    @keyframes scroll-to-left {
        to {
            left: calc(var(--scroll-w) * -1);
        }
    }
    --animate-scroll: scroll-to-left var(--scroll-t) linear infinite;
}

@utility scroll-delay-* {
    animation-delay: calc(var(--scroll-t) / var(--scroll-c) * (var(--scroll-c) - --value(integer)) * -1);
}

@utility animate-paused {
    animation-play-state: paused;
}

@utility left-scroll {
    left: max(calc(var(--scroll-w) * var(--scroll-c)), 100%);
}

page.tsx

tsx
export default function Page() {
    return (
        <div className="bg-slate-100 py-32">
            <div className="max-w-7xl mx-auto h-30 relative bg-slate-200 overflow-hidden mask-x-from-85% group *:cursor-pointer">
                <div className="w-(--scroll-w) bg-cyan-500 h-full absolute left-scroll animate-scroll scroll-delay-0 group-hover:animate-paused"/>
                <div className="w-(--scroll-w) bg-cyan-500 h-full absolute left-scroll animate-scroll scroll-delay-1 group-hover:animate-paused"/>
                <div className="w-(--scroll-w) bg-cyan-500 h-full absolute left-scroll animate-scroll scroll-delay-2 group-hover:animate-paused"/>
                <div className="w-(--scroll-w) bg-cyan-500 h-full absolute left-scroll animate-scroll scroll-delay-3 group-hover:animate-paused"/>
                <div className="w-(--scroll-w) bg-cyan-500 h-full absolute left-scroll animate-scroll scroll-delay-4 group-hover:animate-paused"/>
                <div className="w-(--scroll-w) bg-cyan-500 h-full absolute left-scroll animate-scroll scroll-delay-5 group-hover:animate-paused"/>
            </div>
        </div>
    )
}

video