Как отключить триггер прокрутки при прокрутке вверх gsap ScrollTrigger?

У меня есть простая страница с анимацией 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>

[КодПен][1]

Но когда я прокручиваю вверх, а затем снова вниз, повторяется ли анимация? Как я могу исправить это, когда я прокручиваю вверх, а затем снова вниз, не должна ли анимация повторяться?

Вопрос: Как отключить триггер прокрутки при прокрутке вверх gsap ScrollTrigger?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
176
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема в том, что 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>

Вы можете добавить trigger.kill(); в хук обратного вызова onComplete:

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",
    onComplete: function() {
    ScrollTrigger.getAll().forEach((trigger) => { 
      if (elem === trigger.trigger) trigger.kill() 
    });

  }
  });
  
  
}

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,
       toggleActions: "play none none none",
      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>

В вашем примере при первой прокрутке последние блоки даже не отображаются. Но мне нравится эта идея.

SVE 05.04.2023 15:12

Другие вопросы по теме