我有一个包含GSAP和ScrollTrigger动画的简单页面:

function animateFrom(elem, direction) {
  direction = direction || 1;
  var x = 0,
    y = direction * 100;
  if (elem.classList.contains("gs_reveal_fromLeft")) {
    x = -100;
    y = 0;
  } else if (elem.classList.contains("gs_reveal_fromRight")) {
    x = 100;
    y = 0;
  }
  elem.style.transform = "translate(" + x + "px, " + y + "px)";
  elem.style.opacity = "0";
  gsap.fromTo(elem, {
    x: x,
    y: y,
    autoAlpha: 0
  }, {
    duration: 1.5,
    x: 0,
    y: 0,
    autoAlpha: 1,
    ease: "expo",
    overwrite: "auto"
  });
}

function hide(elem) {
  gsap.set(elem, {
    autoAlpha: 0
  });
}

document.addEventListener("DOMContentLoaded", function() {
  gsap.registerPlugin(ScrollTrigger);

  gsap.utils.toArray(".gs_reveal").forEach(function(elem) {
    hide(elem); // assure that the element is hidden when scrolled into view

    ScrollTrigger.create({
      trigger: elem,
      markers: false,
      onEnter: function() {
        animateFrom(elem)
      },
      // onEnterBack: function() { animateFrom(elem, -1) },
      // onLeave: function() { hide(elem) } // assure that the element is hidden when scrolled into view
    });
  });
});
.gs_reveal {
  opacity: 0;
  visibility: hidden;
  will-change: transform, opacity;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.3/css/bootstrap.min.css" integrity="sha512-SbiR/eusphKoMVVXysTKG/7VseWii+Y3FdHrt0EpKgpToZeemhqHeZeLWLhJutz/2ut2Vw1uQEj2MbRF+TVBUA==" crossorigin="anonymous" referrerpolicy="no-referrer"
/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/gsap.min.js" integrity="sha512-cOH8ndwGgPo+K7pTvMrqYbmI8u8k6Sho3js0gOqVWTmQMlLIi6TbqGWRTpf1ga8ci9H3iPsvDLr4X7xwhC/+DQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/ScrollTrigger.min.js" integrity="sha512-AMl4wfwAmDM1lsQvVBBRHYENn1FR8cfOTpt8QVbb/P55mYOdahHD4LmHM1W55pNe3j/3od8ELzPf/8eNkkjISQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>


<div class="container">
  <div class="py-5">
    <h1 class="gs_reveal text-center">Scroll down and up to see different reveal animations</h1>
  </div>

  <div class="">
    <div class="row py-5">
      <div class="col-5 gs_reveal gs_reveal_fromLeft">
        <div class="d-block">
          <img src="https://picsum.photos/479/479?index=1" alt="" class="img-fluid">
        </div>
      </div>
      <div class="col-7">
        <h2 class="gs_reveal">Create amazing svg animations</h2>
        <p class="gs_reveal">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Debitis quia doloribus, inventore rem, at pariatur asperiores minus qui accusantium quod nisi! Modi eveniet eaque enim totam deserunt dolores alias aliquid.</p>
      </div>
    </div>

    <div class="row py-5">
      <div class="col-7 text-end">
        <h2 class="gs_reveal">Supercharge immersive WebGL experiences</h2>
        <p class="gs_reveal"> Lorem ipsum, dolor sit amet consectetur adipisicing elit. Aliquam praesentium numquam fugiat consequatur aliquid eos assumenda natus deserunt eum doloribus quia mollitia omnis, voluptatem maiores dicta exercitationem veritatis magnam iusto in
          officiis reiciendis ipsum, delectus maxime? Sit eligendi temporibus dolores? </p>
      </div>

      <div class="col-5 gs_reveal gs_reveal_fromRight">
        <div class="d-block">
          <img src="https://picsum.photos/479/479?index=2" alt="" class="img-fluid">
        </div>
      </div>
    </div>

    <div class="row py-5">
      <div class="col-5 gs_reveal_fromLeft">
        <div class="block">
          <img src="https://picsum.photos/479/479?index=3" alt="" class="img-fluid">
        </div>
      </div>

      <div class="col-7 text-start">
        <h2 class="gs_reveal">Control performant Canvas animations</h2>
        <p class="gs_reveal"> Lorem, ipsum dolor sit amet consectetur adipisicing elit. Inventore nulla natus minus praesentium, adipisci quam distinctio recusandae accusamus similique aut velit iusto reprehenderit deleniti! Nobis?</p>
      </div>
    </div>

    <div class="row py-5">
      <div class="col-7 text-end">
        <h2 class="gs_reveal">Award winning websites</h2>
        <p class="gs_reveal"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Exercitationem vero temporibus deleniti qui rem ipsa! </p>
      </div>

      <div class="col-5 gs_reveal gs_reveal_fromRight">
        <div class="d-block">
          <img src="https://picsum.photos/479/479?index=4" alt="" class="img-fluid">
        </div>
      </div>
    </div>

  </div>

</div>

[CodePen][1]

但当我向上滚动,然后再次向下滚动时,动画会重复吗?当我向上滚动然后再次向下滚动时,我如何修复它,难道不应该重复动画吗?

Question:如何在向上滚动gsap ScrollTrigger时禁用滚动触发器?

推荐答案

问题是,每次进入该部分时都会调用animateFrom.

您需要将其标记为已播放.

function animateFrom(elem, direction) {
  if (elem.played === true) {
    return;
  }
  elem.played = true;
  direction = direction || 1;
  var x = 0,
    y = direction * 100;
  if (elem.classList.contains("gs_reveal_fromLeft")) {
    x = -100;
    y = 0;
  } else if (elem.classList.contains("gs_reveal_fromRight")) {
    x = 100;
    y = 0;
  }
  elem.style.transform = "translate(" + x + "px, " + y + "px)";
  elem.style.opacity = "0";
  gsap.fromTo(elem, {
    x: x,
    y: y,
    autoAlpha: 0
  }, {
    duration: 1.5,
    x: 0,
    y: 0,
    autoAlpha: 1,
    ease: "expo",
    overwrite: "auto"
  });
}

function hide(elem) {
  gsap.set(elem, {
    autoAlpha: 0
  });
}

document.addEventListener("DOMContentLoaded", function() {
  gsap.registerPlugin(ScrollTrigger);

  gsap.utils.toArray(".gs_reveal").forEach(function(elem) {
    hide(elem); // assure that the element is hidden when scrolled into view

    ScrollTrigger.create({
      trigger: elem,
      markers: false,
      onEnter: function() {
        animateFrom(elem)
      },
      // onEnterBack: function() { animateFrom(elem, -1) },
      // onLeave: function() { hide(elem) } // assure that the element is hidden when scrolled into view
    });
  });
});
.gs_reveal {
  opacity: 0;
  visibility: hidden;
  will-change: transform, opacity;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.2.3/css/bootstrap.min.css" integrity="sha512-SbiR/eusphKoMVVXysTKG/7VseWii+Y3FdHrt0EpKgpToZeemhqHeZeLWLhJutz/2ut2Vw1uQEj2MbRF+TVBUA==" crossorigin="anonymous" referrerpolicy="no-referrer"
/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/gsap.min.js" integrity="sha512-cOH8ndwGgPo+K7pTvMrqYbmI8u8k6Sho3js0gOqVWTmQMlLIi6TbqGWRTpf1ga8ci9H3iPsvDLr4X7xwhC/+DQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/ScrollTrigger.min.js" integrity="sha512-AMl4wfwAmDM1lsQvVBBRHYENn1FR8cfOTpt8QVbb/P55mYOdahHD4LmHM1W55pNe3j/3od8ELzPf/8eNkkjISQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>


<div class="container">
  <div class="py-5">
    <h1 class="gs_reveal text-center">Scroll down and up to see different reveal animations</h1>
  </div>

  <div class="">
    <div class="row py-5">
      <div class="col-5 gs_reveal gs_reveal_fromLeft">
        <div class="d-block">
          <img src="https://picsum.photos/479/479?index=1" alt="" class="img-fluid">
        </div>
      </div>
      <div class="col-7">
        <h2 class="gs_reveal">Create amazing svg animations</h2>
        <p class="gs_reveal">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Debitis quia doloribus, inventore rem, at pariatur asperiores minus qui accusantium quod nisi! Modi eveniet eaque enim totam deserunt dolores alias aliquid.</p>
      </div>
    </div>

    <div class="row py-5">
      <div class="col-7 text-end">
        <h2 class="gs_reveal">Supercharge immersive WebGL experiences</h2>
        <p class="gs_reveal"> Lorem ipsum, dolor sit amet consectetur adipisicing elit. Aliquam praesentium numquam fugiat consequatur aliquid eos assumenda natus deserunt eum doloribus quia mollitia omnis, voluptatem maiores dicta exercitationem veritatis magnam iusto in
          officiis reiciendis ipsum, delectus maxime? Sit eligendi temporibus dolores? </p>
      </div>

      <div class="col-5 gs_reveal gs_reveal_fromRight">
        <div class="d-block">
          <img src="https://picsum.photos/479/479?index=2" alt="" class="img-fluid">
        </div>
      </div>
    </div>

    <div class="row py-5">
      <div class="col-5 gs_reveal_fromLeft">
        <div class="block">
          <img src="https://picsum.photos/479/479?index=3" alt="" class="img-fluid">
        </div>
      </div>

      <div class="col-7 text-start">
        <h2 class="gs_reveal">Control performant Canvas animations</h2>
        <p class="gs_reveal"> Lorem, ipsum dolor sit amet consectetur adipisicing elit. Inventore nulla natus minus praesentium, adipisci quam distinctio recusandae accusamus similique aut velit iusto reprehenderit deleniti! Nobis?</p>
      </div>
    </div>

    <div class="row py-5">
      <div class="col-7 text-end">
        <h2 class="gs_reveal">Award winning websites</h2>
        <p class="gs_reveal"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Exercitationem vero temporibus deleniti qui rem ipsa! </p>
      </div>

      <div class="col-5 gs_reveal gs_reveal_fromRight">
        <div class="d-block">
          <img src="https://picsum.photos/479/479?index=4" alt="" class="img-fluid">
        </div>
      </div>
    </div>

  </div>

</div>

Javascript相关问答推荐

使用jsPDF添加Image JPEG将p5.js草图画布下载为PDF

如何使图像逐渐/平稳地响应(先减少宽度,然后减少高度)

使用JavaScript/PHP将二维码保存为服务器端的图像

我无法使用tailwind-css和reactJS修改图像的位置

react 页面更改类别时如何返回第0页

如何避免使用ajax在Vue 3合成API中重定向

用户单击仅在JavaScript中传递一次以及其他行为

为什么JavaScript双边字符串文字插值不是二次的?

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

使用json文件字符串来enum显示类型字符串无法按照计算的enum成员值的要求分配给类型号

InDesign—创建一个独立的窗口,在文档中进行更正时保持打开状态

更改JSON中使用AJAX返回的图像的路径

如何将Cookie从服务器发送到用户浏览器

并不是所有的iframe都被更换

如何在coCos2d-x中更正此错误

对网格项目进行垂直排序不起作用

本地库中的chartjs-4.4.2和chartjs-plugin-注解

无法读取未定义的属性(正在读取合并)-react RTK

在查看网页时,如何使HTML中的按钮工作方式类似于鼠标上的滚轮或箭头键?

JWT Cookie安全性