Zenn
🙆

【GSAP】GSAP Practice【#28 GSAP Nextjs ScrollTrigger1】

2025/03/05に公開

【#28 GSAP Nextjs ScrollTrigger1】

YouTube: https://youtu.be/F-XwZnbCe-U
https://youtu.be/F-XwZnbCe-U

今回は、Nextjsで「ScrollTrigger」を
設定する方法について解説します。

app/page.tsx
'use client'

import { useRef, useState } from 'react'
import gsap from 'gsap'
import { useGSAP } from '@gsap/react'
import { ScrollTrigger } from 'gsap/ScrollTrigger'

gsap.registerPlugin(useGSAP)

interface BoxProps {
  tl: gsap.core.Timeline | undefined
  children: React.ReactNode
}

const Box = ({ tl, children }: BoxProps) => {
  const boxRef = useRef<HTMLDivElement>(null)

  useGSAP(() => {
    tl &&
      tl
        .to(boxRef.current, {
          x: 300,
        })
        .to(boxRef.current, {
          rotate: 360,
        })
  }, [tl])

  return (
    <div
      ref={boxRef}
      className="w-40 h-40 bg-red-700 flex flex-col items-center justify-center text-white font-bold cursor-pointer"
    >
      {children}
    </div>
  )
}

export default function Home() {
  const containerRef = useRef<HTMLDivElement>(null)
  const [tl, setTl] = useState<gsap.core.Timeline>()
  // const [reversed, setReverced] = useState(false)

  useGSAP(() => {
    gsap.registerPlugin(ScrollTrigger)
    const tl = gsap.timeline({
      scrollTrigger: {
        trigger: containerRef.current,
        markers: true,
        start: 'top center',
        end: 'bottom center',
        scrub: true,
      },
    })
    setTl(tl)
  })

  // const toggleTimeLine = contextSafe(() => {
  //   tl && tl.reversed(!tl.reversed())
  // })

  // useGSAP(() => {
  //   tl && tl.reversed(reversed)
  // }, [reversed, tl])

  return (
    <main className="w-screen h-screen">
      {/* <button onClick={() => setReverced(!reversed)}>toggle</button> */}
      <div className="size-full flex items-center justify-center bg-rose-300"></div>
      <div
        ref={containerRef}
        className="size-full flex flex-col gap-32 items-center justify-center bg-slate-300"
      >
        <Box tl={tl}>
          <p>box1</p>
        </Box>
        <Box tl={tl}>
          <p>box2</p>
        </Box>
        <Box tl={tl}>
          <p>box3</p>
        </Box>
      </div>
      <div className="size-full flex items-center justify-center bg-rose-300"></div>
      <div className="size-full flex items-center justify-center bg-sky-300">
        <h2 className="text-3xl font-bold">Section3</h2>
      </div>
    </main>
  )
}

Discussion

ログインするとコメントできます