I’m trying to convert some JavaScript code to React. The code is for creating a horizontal scrollbar effect using GSAP.
I simply placed the GSAP code inside a useEffect hook to implement it. However, after doing this, nothing appears on the screen. What’s worse, no errors are showing up in the console, making it difficult to debug.Can you let me know why it doesn’t work on React code??
I’ll upload the JavaScript code and the React code shortly. The key parts to focus on are the main.js file and the useEffect hook in the React code. And also attach codesandbox link each
Javascript
index.html
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div class="wrapper">
<div class="container scrollx">
<svg
viewBox="0 0 900 10"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M9.89998 6C9.43671 8.28224 7.41896 10 5 10C2.23858 10 0 7.76142 0 5C0 2.23858 2.23858 0 5 0C7.41896 0 9.43671 1.71776 9.89998 4H445.1C445.563 1.71776 447.581 0 450 0C452.419 0 454.437 1.71776 454.9 4H890.1C890.563 1.71776 892.581 0 895 0C897.761 0 900 2.23858 900 5C900 7.76142 897.761 10 895 10C892.581 10 890.563 8.28224 890.1 6H454.9C454.437 8.28224 452.419 10 450 10C447.581 10 445.563 8.28224 445.1 6H9.89998Z"
fill="#D9D9D9"
/>
<mask
id="mask0_0_1"
style="mask-type: alpha;"
maskUnits="userSpaceOnUse"
x="0"
y="0"
width="900"
height="10"
>
<path
d="M9.89998 6C9.43671 8.28224 7.41896 10 5 10C2.23858 10 0 7.76142 0 5C0 2.23858 2.23858 0 5 0C7.41896 0 9.43671 1.71776 9.89998 4H445.1C445.563 1.71776 447.581 0 450 0C452.419 0 454.437 1.71776 454.9 4H890.1C890.563 1.71776 892.581 0 895 0C897.761 0 900 2.23858 900 5C900 7.76142 897.761 10 895 10C892.581 10 890.563 8.28224 890.1 6H454.9C454.437 8.28224 452.419 10 450 10C447.581 10 445.563 8.28224 445.1 6H9.89998Z"
fill="#D9D9D9"
/>
</mask>
<g mask="url(#mask0_0_1)">
<rect class="mask" y="-49" height="99" fill="black" />
</g>
</svg>
<section class="sec1 pin">
<span>Advanced</span>
<h1>Signify Elegance</h1>
<div class="col">
<p>
Lorem ipsum dolor sit amet consectetur. Egestas euismod nec sit
sed massa turpis in. Sit praesent arcu leo lectus pellentesque.
Ornare elit orci morbi volutpat. Ut fermentum lorem morbi quis
risus amet urna. Urna egestas lorem.
</p>
<p>
Lorem ipsum dolor sit amet consectetur. Egestas euismod nec sit
sed massa turpis in. Sit praesent arcu leo lectus pellentesque.
Ornare elit orci morbi volutpat. Ut fermentum lorem morbi quis
risus amet urna. Urna egestas lorem.
</p>
</div>
</section>
<section class="sec2 pin">
<span class="anim">Advanced</span>
<h1 class="anim">Signify Elegance</h1>
<div class="col anim">
<p>
Lorem ipsum dolor sit amet consectetur. Egestas euismod nec sit
sed massa turpis in. Sit praesent arcu leo lectus pellentesque.
Ornare elit orci morbi volutpat. Ut fermentum lorem morbi quis
risus amet urna. Urna egestas lorem.
</p>
<p>
Lorem ipsum dolor sit amet consectetur. Egestas euismod nec sit
sed massa turpis in. Sit praesent arcu leo lectus pellentesque.
Ornare elit orci morbi volutpat. Ut fermentum lorem morbi quis
risus amet urna. Urna egestas lorem.
</p>
</div>
</section>
<section class="sec3 pin">
<span class="anim">Advanced</span>
<h1 class="anim">Signify Elegance</h1>
<div class="col anim">
<p>
Lorem ipsum dolor sit amet consectetur. Egestas euismod nec sit
sed massa turpis in. Sit praesent arcu leo lectus pellentesque.
Ornare elit orci morbi volutpat. Ut fermentum lorem morbi quis
risus amet urna. Urna egestas lorem.
</p>
<p>
Lorem ipsum dolor sit amet consectetur. Egestas euismod nec sit
sed massa turpis in. Sit praesent arcu leo lectus pellentesque.
Ornare elit orci morbi volutpat. Ut fermentum lorem morbi quis
risus amet urna. Urna egestas lorem.
</p>
</div>
</section>
</div>
</div>
<script src="main.js"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"
integrity="sha512-16esztaSRplJROstbIIdwX3N97V1+pZvV33ABoG1H2OyTttBxEGkTsoIVsiP1iaTtM8b3+hu2kB6pQ4Clr5yug=="
crossorigin="anonymous"
referrerpolicy="no-referrer"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/ScrollToPlugin.min.js"
integrity="sha512-v/m68W+vaGN/6igoyFpd4GlQzu0jx9/n5gr2PKq5vif+RObyGKHse384YHrOULaxZ810XhlHUrmB3U8UnPB19Q=="
crossorigin="anonymous"
referrerpolicy="no-referrer"
></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/ScrollTrigger.min.js"></script>
</body>
</html>
main.js
const sections = gsap.utils.toArray(".container section");
const mask = document.querySelector(".mask");
let scrollTween = gsap.to(sections, {
xPercent: -100 * (sections.length - 1),
ease: "none",
scrollTrigger: {
trigger: ".container",
pin: true,
scrub: 1,
end: "+=3000"
}
});
React
App.js
import React, { useEffect, useRef } from "react";
import { Globalstyle, Wrap } from "./styles";
import { gsap, ScrollTrigger } from "gsap/all";
gsap.registerPlugin(ScrollTrigger);
const App = () => {
const containerRef = useRef(null);
const maskRef = useRef(null);
useEffect(() => {
const sections = gsap.utils.toArray(
containerRef.current.querySelectorAll("section")
);
const mask = maskRef.current;
let scrollTween = gsap.to(sections, {
xPercent: -100 * (sections.length - 1),
ease: "none",
scrollTrigger: {
trigger: containerRef.current,
pin: true,
scrub: 1,
end: "+=3000"
}
});
}, []);
return (
<>
<Globalstyle />
<Wrap>
<div className="wrapper">
<div className="container scrollx" ref={containerRef}>
<svg
viewBox="0 0 900 10"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M9.89998 6C9.43671 8.28224 7.41896 10 5 10C2.23858 10 0 7.76142 0 5C0 2.23858 2.23858 0 5 0C7.41896 0 9.43671 1.71776 9.89998 4H445.1C445.563 1.71776 447.581 0 450 0C452.419 0 454.437 1.71776 454.9 4H890.1C890.563 1.71776 892.581 0 895 0C897.761 0 900 2.23858 900 5C900 7.76142 897.761 10 895 10C892.581 10 890.563 8.28224 890.1 6H454.9C454.437 8.28224 452.419 10 450 10C447.581 10 445.563 8.28224 445.1 6H9.89998Z"
fill="#D9D9D9"
/>
<mask
id="mask0_0_1"
style={{ maskType: "alpha" }}
maskUnits="userSpaceOnUse"
x="0"
y="0"
width="900"
height="10"
>
<path
d="M9.89998 6C9.43671 8.28224 7.41896 10 5 10C2.23858 10 0 7.76142 0 5C0 2.23858 2.23858 0 5 0C7.41896 0 9.43671 1.71776 9.89998 4H445.1C445.563 1.71776 447.581 0 450 0C452.419 0 454.437 1.71776 454.9 4H890.1C890.563 1.71776 892.581 0 895 0C897.761 0 900 2.23858 900 5C900 7.76142 897.761 10 895 10C892.581 10 890.563 8.28224 890.1 6H454.9C454.437 8.28224 452.419 10 450 10C447.581 10 445.563 8.28224 445.1 6H9.89998Z"
fill="#D9D9D9"
/>
</mask>
<g mask="url(#mask0_0_1)">
<rect
className="mask"
y="-49"
height="99"
fill="black"
ref={maskRef}
/>
</g>
</svg>
<section className="sec1 pin">
<span>Advanced</span>
<h1>Signify Elegance</h1>
<div className="col">
<p>
Lorem ipsum dolor sit amet consectetur. Egestas euismod nec
sit sed massa turpis in. Sit praesent arcu leo lectus
pellentesque. Ornare elit orci morbi volutpat. Ut fermentum
lorem morbi quis risus amet urna. Urna egestas lorem.
</p>
<p>
Lorem ipsum dolor sit amet consectetur. Egestas euismod nec
sit sed massa turpis in. Sit praesent arcu leo lectus
pellentesque. Ornare elit orci morbi volutpat. Ut fermentum
lorem morbi quis risus amet urna. Urna egestas lorem.
</p>
</div>
</section>
<section className="sec2 pin">
<span className="anim">Advanced</span>
<h1 className="anim">Signify Elegance</h1>
<div className="col anim">
<p>
Lorem ipsum dolor sit amet consectetur. Egestas euismod nec
sit sed massa turpis in. Sit praesent arcu leo lectus
pellentesque. Ornare elit orci morbi volutpat. Ut fermentum
lorem morbi quis risus amet urna. Urna egestas lorem.
</p>
<p>
Lorem ipsum dolor sit amet consectetur. Egestas euismod nec
sit sed massa turpis in. Sit praesent arcu leo lectus
pellentesque. Ornare elit orci morbi volutpat. Ut fermentum
lorem morbi quis risus amet urna. Urna egestas lorem.
</p>
</div>
</section>
<section className="sec3 pin">
<span className="anim">Advanced</span>
<h1 className="anim">Signify Elegance</h1>
<div className="col anim">
<p>
Lorem ipsum dolor sit amet consectetur. Egestas euismod nec
sit sed massa turpis in. Sit praesent arcu leo lectus
pellentesque. Ornare elit orci morbi volutpat. Ut fermentum
lorem morbi quis risus amet urna. Urna egestas lorem.
</p>
<p>
Lorem ipsum dolor sit amet consectetur. Egestas euismod nec
sit sed massa turpis in. Sit praesent arcu leo lectus
pellentesque. Ornare elit orci morbi volutpat. Ut fermentum
lorem morbi quis risus amet urna. Urna egestas lorem.
</p>
</div>
</section>
</div>
</div>
</Wrap>
</>
);
};
export default App;
CodeSandBox
Javascript
https://codesandbox.io/s/horizontal-scroll-rxg8md?file=/index.html:0-4915&resolutionWidth=1400&resolutionHeight=800
React
https://codesandbox.io/s/horizontal-scroll-xv7hzj?file=/src/App.js&resolutionWidth=1400&resolutionHeight=800