3

我对 vue-router 和 gsap 的滚动触发器插件有一些问题。我有一些使用 scrolltrigger 的 vue 组件,当我转到另一个页面并返回具有滚动触发器效果的页面时,它不会触发,但如果我手动刷新页面,它就可以工作。

我发现这个主题与 NuxtJs 有相同问题的人,但 ScrollTrigger.disable() 和 ScrollTrigger.kill() 解决方案对我不起作用: https ://greensock.com/forums/topic/24886-in-nuxt- when-using-scrolltriggerkill-how-can-it-run-again-when-page-is-viewed/

这是我用 ScrollTrigger 制作的一个组件:

模板部分

<template>
<section class="marquee">
    <div class="marquee__inner" aria-hidden="true" ref="inner">
      <div class="marquee__part">food wine fish beef vegetables</div>
          <div class="marquee__part">food wine fish beef vegetables</div>
          <div class="marquee__part">food wine fish beef vegetables</div>
          <div class="marquee__part">food wine fish beef vegetables</div>
          <div class="marquee__part">food wine fish beef vegetables</div>
    </div>
</section>
</template>

脚本部分

<script>
import gsap from "gsap"
import ScrollTrigger from 'gsap/ScrollTrigger'
gsap.registerPlugin(ScrollTrigger)

export default {
  name: 'ServicesMarquee',
  data() {
    return {
      currentScroll: 0,
      isScrollingDown: true,
      test: null,
    }
  },
  methods: {
    scrollAnim() {
      gsap.to(this.$refs.inner, {
        xPercent: -65,
        scrollTrigger: {
          trigger: ".marquee",
          start: "top bottom",
          end: "top top",
          scrub: 0,
        }
      })
    },
  },
  mounted() {
    gsap.set(this.$refs.inner, {xPercent: -50});
    let tween = gsap.to(this.$refs.inner.querySelectorAll('.marquee__part'), {xPercent: -100, repeat: -1, duration: 10, ease: "linear"}).totalProgress(0.5);
    let self = this

    window.addEventListener("scroll", function(){
      if ( window.pageYOffset > self.currentScroll ) {
        self.isScrollingDown = true;
      } else {
        self.isScrollingDown = false;
      }
        
      gsap.to(tween, {
        timeScale: self.isScrollingDown ? 1 : -1
      });
      self.currentScroll = window.pageYOffset
    });
    
    gsap.to(this.$refs.inner, {xPercent: -65 });
    this.scrollAnim()
  }
}
</script>
4

1 回答 1

0

我在 Stackoverflow 和 GSAP 论坛上阅读了有关此问题和类似问题的所有文章,并且是setTimeout的,但这不是答案。

我也很困惑,这个问题并没有影响到很多人,但他们描述的情况几乎相同,当你浏览页面(路由)并返回前一个动画时 vue + router + gsap + scrolltrigger 停止工作(动画在这种情况下不起作用)。

所以小伙伴们,首先看<transition>上面<router-view>。当您同时拥有上一页和下一页的组件时,这就是问题所在,并且 ScrollTrigger 会计算当时的值(offsetTop)

于 2021-11-11T21:18:56.837 回答