Jump to content
Search Community

ScrollTrigger - Auto start

MacReady test
Moderator Tag

Go to solution Solved by mvaneijgen,

Recommended Posts

Hi All,

 

I am a complete novice when it comes to GSAP. I've been reading through the various documentation and watched a couple of videos. I'd like to know how I could activate an animation as soon as the mouse or scroll wheel is moved. I'm using the following code to animate six images. It works when the trigger point hits the top of the view port, I don't want that to happen I want the animation to commence as soon as the mouse/scroll wheel is moved.

 

let tl = gsap.timeline({
    // yes, we can add it to an entire timeline!
    scrollTrigger: {
      trigger: ".container",
      pin: true,   // pin the trigger element while active
      start: "top top", // when the top of the trigger hits the top of the viewport
      end: "+=500", // end after scrolling 500px beyond the start
      scrub: 1, // smooth scrubbing, takes 1 second to "catch up" to the scrollbar
      snap: {
        snapTo: "labels", // snap to the closest label in the timeline
        duration: {min: 0.2, max: 3}, // the snap animation should be at least 0.2 seconds, but no more than 3 seconds (determined by velocity)
        delay: 0.2, // wait 0.2 seconds from the last scroll event before doing the snapping
        ease: "power1.inOut" // the ease of the snap animation ("power3" by default)
      }
    }
  });

// add animations and labels to the timeline
tl.addLabel("start")
  .from(".box p", {scale: 0.3, rotation:45, autoAlpha: 0})
  .addLabel("color")
  .from(".box", {backgroundColor: "#28a92b"})
  .addLabel("spin")
  .to(".box", {rotation: 360})
  .addLabel("end");

 

Link to comment
Share on other sites

Heya!

 

Hard to tell without a demo. (we really really love demos around here)

It may be that you just want to trigger scrollTrigger right at the top of the page?

let tl = gsap.timeline({
    scrollTrigger: {
      start: 0, // start right at the top of the page (starting as soon as the user scrolls)
      end: "+=500", // end after scrolling 500px beyond the start
    }
  });

tl
  .from(".box p", {scale: 0.3, rotation:45, autoAlpha: 0})
  .from(".box", {backgroundColor: "#28a92b"})
  .to(".box", {rotation: 360})


But I think it's more likely that you're not after ScrollTrigger and actually want to listen for events. 
 

https://greensock.com/docs/v3/Plugins/Observer

Link to comment
Share on other sites

Great thanks for the advice. Although I want my animation to start as soon as the mouse wheel is activated.

BTW setting the start position to '0' doesn't change the behaviour the image is pinned and the animation only triggers when

it hits the top of the viewport. I will set up a CodePen later on. Thanks for your help though much appreciated.

Link to comment
Share on other sites

Indeed. Sorry I'm at work at the moment. Also toggleActions doesn't seem to work animation plays without reversing.

 

let tl = gsap.timeline({
  // yes, we can add it to an entire timeline!
  scrollTrigger: {
    start: 0, // when the top of the trigger hits the top of the viewport
    end: "+=500", // end after scrolling 500px beyond the start
    toggleActions: "restart pause reverse pause",
  }
});

 

Link to comment
Share on other sites

6 minutes ago, Cassie said:

If you're just talking about the same as the demo you linked to - then that's exactly what my code snippet would do. - like so
 

 

 

Similar but the images actually fade out and at different angles. I'll have a play :)

Link to comment
Share on other sites

  • Solution

@MacReady it would had been nice if you tried your hand at any possible solution. I find that learning something is done by getting your hands dirty and not by having others give you the solution. Next to that if you try something and show what your thought process is others can point out where you went wrong or show you a better way.

 

Here is a basic animation. Right now they randomly rotate between -100 deg and 100deg and they move left or right also between -100 and 100. You could of course change these values or have each box animate a specific amount, you could use the wrap function for that  https://greensock.com/docs/v3/GSAP/UtilityMethods/wrap() and feed in the index of each element. 

 

let yourWrap = gsap.utils.wrap(["-5", "100", "200"]);

rotate: index => yourWrap(index)

 

See the Pen gOeZKbN?editors=0010 by mvaneijgen (@mvaneijgen) on CodePen

  • Like 1
Link to comment
Share on other sites

I did actually have a go last night I spent roughly three hours trying to achieve the effect so I'm not here to expect others to do the work for me and I'm something of a novice when it comes to website animations. Thanks for the advice.

Link to comment
Share on other sites

I'm trying to make learning a bit easier and three hours for no result after watching various videos and reading docs sounds like an absolute disaster.

 

If you could share your stumbling points it would be really helpful/what have you watched/what were you struggling with?

Link to comment
Share on other sites

I wouldn't call it a disaster I'm a complete novice and three hours included watching tutorials and trying out various other solutions. All part of the learning curve. The biggest hurdle was triggering individual elements so they rotate at different angles. I'll post my efforts later on this evening.

  • Like 1
Link to comment
Share on other sites

1 hour ago, mvaneijgen said:

@MacReady it would had been nice if you tried your hand at any possible solution. I find that learning something is done by getting your hands dirty and not by having others give you the solution. Next to that if you try something and show what your thought process is others can point out where you went wrong or show you a better way.

 

Here is a basic animation. Right now they randomly rotate between -100 deg and 100deg and they move left or right also between -100 and 100. You could of course change these values or have each box animate a specific amount, you could use the wrap function for that  https://greensock.com/docs/v3/GSAP/UtilityMethods/wrap() and feed in the index of each element. 

 

let yourWrap = gsap.utils.wrap(["-5", "100", "200"]);

rotate: index => yourWrap(index)

 

 

 

I am not understanding the wrap method. How do I target individual elements so they have specific rotational values applied on scroll? Do I pass the four boxes in as an array?

Link to comment
Share on other sites

@MacReady you can give the wrap function values you like to use let wrapper = gsap.utils.wrap(["rotation value box1", "rotation value box2", "rotation value box3", ... ect ]); (the wrap function is nice, because if in the future you have more boxes it will automatically wrap to the frist item again, but you can also just use an array)

 

and you then call like so rotate: index => wrapper(index),

 

But if it is not working for you please post your demo and will point you in the right direction

  • Like 2
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...