How to create infinite scrolling cards in react & next.js?
It's easy and you can do it in less than 2 minutes.
Recently, at my agency UNIOdessy, we decided to add a new element to showcase our work. We tried various components, but none of them matched our aesthetic. So, we created and re-designed a scroller, a component that does the job for us.
Step 1: Install MagicUI and add the Marquee element.
npx magicui-cli add marquee
Step 2: Create a file named Marquee.tsx/jsx in the components folder.
Step 3: Copy the provided code into your Marquee.tsx/jsx file.
import { cn } from "@/lib/utils";
import Marquee from "@/components/magicui/marquee";
const reviews = [
{
img: "./works/work1.png",
},
{
img: "./works/work2.png",
},
];
const firstRow = reviews;
const ReviewCard = ({ img }: { img: string }) => {
return (
<figure
className={cn(
"relative cursor-pointer overflow-hidden rounded-xl border p-4",
"border-gray-950/[.1] bg-gray-950/[.01] hover:bg-gray-950/[.05]",
"dark:border-gray-50/[.1] dark:bg-gray-50/[.10] dark:hover:bg-gray-50/[.15]"
)}
>
<img className="w-auto h-[500px] rounded md:h-[500px] object-top lg:border lg:border-white/5 " alt="" src={img} />
</figure>
);
};
export function Marquee() {
return (
<div className="relative flex h-[500px] w-full flex-col items-center justify-center overflow-hidden rounded-lg bg- md:shadow-xl">
<Marquee pauseOnHover className="[--duration:20s]">
{firstRow.map((review) => (
<ReviewCard key={review.img} {...review} />
))}
</Marquee>
</div>
);
}
Step 4: Import and use the Marquee component in your App.js file.
import React from 'react';
import Marquee from './components/Marquee';
function App() {
return (
<div className="App">
<header className="App-header">
<h1>Welcome to UNIOdessy</h1>
<Marquee />
</header>
</div>
);
}
export default App;
And voila! Add your own images, and you're done.
Follow me for more tips and tricks. Also you can connect with me at my portfolio.