toundai Posted July 10, 2023 Share Posted July 10, 2023 I want to convert a locomotive scroll into a gsap module on react. import React, {useLayoutEffect} from "react"; import { useEffect } from "react"; import { useRef } from "react"; import { imageData } from "../../../Constants/constants.jsx"; import LocomotiveScroll from "locomotive-scroll"; import "../../../../node_modules/locomotive-scroll/src/locomotive-scroll.scss"; import "../../../styles.scss" import GalleryItem from "./GalleryItem.jsx"; const Home = () => { const ref = useRef(null); useEffect(() => { if (ref) { if (typeof window === "undefined" || !window.document) { return } const scroll = new LocomotiveScroll({ el: ref.current, smooth: true, direction: "horizontal", multiplier: 0.5, }); } }, []); const images = imageData.map((tupples, index) => tupples.map((url, elementIndex) => ( <GalleryItem key={url} src={url} index={elementIndex} columnOffset={index * 7} /> )) ); if (typeof window === "undefined" || !window.document) { return null } return ( <> {/*<div className="top"></div>*/} <div className="main-container"> <div className="scroll-container" data-scroll-container ref={ref}> <div className="content"> <div className="gallery"> {images} </div> </div> </div> </div> </> ); }; export default Home; I can't use locomotive scroll with both vertical and horizontal scroll. This component display multiple images placed on different position. Link to comment Share on other sites More sharing options...
Rodrigo Posted July 10, 2023 Share Posted July 10, 2023 Hi @toundai and welcome to the GreenSock forums! Locomotive is not a GSAP product so we can't really offer support for it since GSAP has it's own smooth scrolling solution called ScrollSmoother: https://greensock.com/scrollsmoother/ But still @akapowl, one of the forums superstars, created this demo for combined scrolling with locomotive: See the Pen wvJroYy by akapowl (@akapowl) on CodePen Also you might want to have a look at this threads as well: Hopefully this helps. Happy Tweening! Link to comment Share on other sites More sharing options...
toundai Posted July 30, 2023 Author Share Posted July 30, 2023 I don't know why this is not working still. Any ideas ? No scroll, but the content is already on the hidden layer (right on the page). import React, {useLayoutEffect} from "react"; import { useEffect } from "react"; import { useRef } from "react"; import { imageData } from "../../../Constants/constants.jsx"; import "../../../../node_modules/locomotive-scroll/src/locomotive-scroll.scss"; import "../../../styles.scss" import {gsap} from "gsap"; import { ScrollTrigger } from "gsap/ScrollTrigger"; gsap.registerPlugin(ScrollTrigger); function useArrayRef() { const refs = useRef([]); refs.current = []; return [refs, (ref) => ref && refs.current.push(ref)]; } const Home = () => { const ref = useRef(null); const [sections, setSectionsRef] = useArrayRef(); useEffect(() => { if (ref) { if (typeof window === "undefined" || !window.document) { return } // const scroll = new LocomotiveScroll({ // el: ref.current, // smooth: true, // direction: "horizontal", // multiplier: 0.5, // }); const totalSections = sections.current.length; gsap.to(sections.current, { xPercent: -100 * (totalSections - 1), ease: "none", scrollTrigger: { trigger: ref.current, pin: true, scrub: 1, // snap: 1 / (totalSections - 1), end: () => "+=" + ref.current.offsetWidth } }); } }, []); const images = imageData.map((tupples, index) => tupples.map((url, elementIndex) => ( <GalleryItem src={url} index={elementIndex} columnOffset={index * 7} /> )) ); if (typeof window === "undefined" || !window.document) { return null } return ( <> {/*<div className="top"></div>*/} <div> <div className={"horizontalTest"} ref={ref}> <div className="contentTest"> <div className="galleryTest"> {images} </div> </div> </div> </div> </> ); }; export default Home; Link to comment Share on other sites More sharing options...
GSAP Helper Posted July 30, 2023 Share Posted July 30, 2023 It's pretty tough to troubleshoot without a minimal demo - the issue could be caused by CSS, markup, a third party library, your browser, an external script that's totally unrelated to GSAP, etc. Would you please provide a very simple CodePen or Stackblitz that demonstrates the issue? Please don't include your whole project. Just some colored <div> elements and the GSAP code is best (avoid frameworks if possible). See if you can recreate the issue with as few dependancies as possible. If not, incrementally add code bit by bit until it breaks. Usually people solve their own issues during this process! If not, then at least we have a reduced test case which greatly increases your chances of getting a relevant answer. Here's a starter CodePen that loads all the plugins. Just click "fork" at the bottom right and make your minimal demo: See the Pen aYYOdN by GreenSock (@GreenSock) on CodePen If you're using something like React/Next/Vue/Nuxt or some other framework, you may find StackBlitz easier to use. We have a series of collections with different templates for you to get started on these different frameworks: React/Next/Vue/Nuxt. Once we see an isolated demo, we'll do our best to jump in and help with your GSAP-specific questions. Link to comment Share on other sites More sharing options...
Rodrigo Posted July 31, 2023 Share Posted July 31, 2023 Hi, Besides echoing the need for a minimal demo, from the code snippet you posted I can see that you are not using GSAP Context in your effect hook and you're not doing proper cleanup neither. Please read the resources in this page in order to get a good grasp on how to properly setup a project in React using GSAP: Hopefully this helps. Happy Tweening! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now