Scroll Text Marquee Bidirectional
Scroll Text Marquee Bidirectional é um componente de texto para React e Tailwind CSS, da biblioteca UI Layouts, com licença MIT. Copia e cola no teu projeto.
UI Layouts
MIT
text
O que é
Scroll Text Marquee Bidirectional é um componente de texto para React e Tailwind CSS, da biblioteca UI Layouts, com licença MIT. Copia e cola no teu projeto.
Como usar
Abre o componente no catálogo, carrega em copiar, e cola no teu projeto. O prompt copiado leva o código e as regras para o teu agente o reproduzir sem alterar nada.
Cinco cópias grátis por mês. Sem cartão.
Precisa de
npm i motion @motionone/utils
Licença
Este componente vem de UI Layouts e é redistribuído sob a licença MIT, que permite uso comercial. O aviso de copyright viaja com o código.
Scroll Text Marquee Bidirectional
'use client';
import ScrollBaseAnimation from '@/components/ui/scroll-text-marque';
import React from 'react';
function Animationtwo() {
return (
<>
<div className='h-[500px] grid place-content-center'>
<ScrollBaseAnimation
// delay={500}
baseVelocity={3}
scrollDependent={true}
clasname='font-bold tracking-[-0.07em] leading-[90%]'
>
Best Component library For Developer
</ScrollBaseAnimation>
</div>
</>
);
}
export default Animationtwo;
'use client';
import { cn } from '@/lib/utils';
import { wrap } from '@motionone/utils';
import {
motion,
useAnimationFrame,
useMotionValue,
useScroll,
useSpring,
useTransform,
useVelocity,
} from 'motion/react';
import { useEffect, useRef } from 'react';
interface ParallaxProps {
children: string;
baseVelocity: number;
clasname?: string;
scrollDependent?: boolean; // Toggle scroll-dependent behavior
delay?: number; // Delay before animation starts
}
export default function ScrollBaseAnimation({
children,
baseVelocity = -5,
clasname,
scrollDependent = false, // Default to false
delay = 0, // Default delay is 0 (no delay)
}: ParallaxProps) {
const baseX = useMotionValue(0);
const { scrollY } = useScroll();
const scrollVelocity = useVelocity(scrollY);
const smoothVelocity = useSpring(scrollVelocity, {
damping: 50,
stiffness: 400,
});
const velocityFactor = useTransform(smoothVelocity, [0, 1000], [0, 2], {
clamp: false,
});
const x = useTransform(baseX, (v) => `${wrap(-20, -45, v)}%`);
const directionFactor = useRef<number>(1);
const hasStarted = useRef(false); // Track animation start status
useEffect(() => {
const timer = setTimeout(() => {
hasStarted.current = true; // Start animation after the delay
}, delay);
return () => clearTimeout(timer); // Cleanup on unmount
}, [delay]);
useAnimationFrame((t, delta) => {
if (!hasStarted.current) return; // Skip if delay hasn't passed
let moveBy = directionFactor.current * baseVelocity * (delta / 1000);
// Reverse direction if scrollDependent is true
if (scrollDependent) {
if (velocityFactor.get() < 0) {
directionFactor.current = -1;
} else if (velocityFactor.get() > 0) {
directionFactor.current = 1;
}
}
moveBy += directionFactor.current * moveBy * velocityFactor.get();
baseX.set(baseX.get() + moveBy);
});
return (
<div className='overflow-hidden whitespace-nowrap flex flex-nowrap'>
<motion.div className='flex whitespace-nowrap gap-10 flex-nowrap' style={{ x }}>
<span className={cn(`block sm:text-[8vw] text-[11vw]`, clasname)}>{children}</span>
<span className={cn(`block sm:text-[8vw] text-[11vw]`, clasname)}>{children}</span>
<span className={cn(`block sm:text-[8vw] text-[11vw]`, clasname)}>{children}</span>
<span className={cn(`block sm:text-[8vw] text-[11vw]`, clasname)}>{children}</span>
</motion.div>
</div>
);
}