Jump to content
Search Community

Convert locomotive-scroll to gsap module

toundai test
Moderator Tag

Recommended Posts

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

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

  • 3 weeks later...

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

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...