Как предотвратить запуск события во время анимации GSAP?

У меня есть анимация GSAP, подобная этой:

window.addEventListener('keydown', ()=>{
     GSAP.to(this.box, {
     x: this.box.position.x + 4,
     duration: 1,
    }
});

Я хочу увеличить позицию поля x на кратное 4, и мой текущий код выше работает, но только если пользователь ждет, пока не пройдет 1 секунда, прежде чем нажимать другую клавишу. Затем идет 0 -> 4 -> 8 и т. д.

Если они не ждут ни секунды, происходит что-то вроде 0 -> 3.76 -> 6.45. Эти числа меняются в зависимости от того, как долго пользователь ждет, прежде чем нажмет другую клавишу. Это имеет смысл, потому что я эффективно отменяю анимацию и использую текущую позицию (поскольку 1 секунда еще не прошла, она еще не дойдет до 4), а затем просто перезапускаю анимацию с текущей позицией (это не было 4).

По сути, я хочу предотвратить запуск прослушивателя событий «keydown» до тех пор, пока 1-секундная анимация не будет полностью завершена.

Как бы я это сделал?

Почему бы не создать переменную, которая будет использоваться для определения того, хотите ли вы запускать код в событии?

Lee Taylor 14.05.2022 23:34

@LeeTaylor Спасибо за предложение - я только что попробовал, вы имеете в виду что-то подобное (обновил мой пост)? он работает лучше, но если пользователь удерживает клавишу, он все равно отменяет анимацию раньше

awawawaw 14.05.2022 23:41

Это трудно увидеть без полностью работающей демонстрации.

Lee Taylor 14.05.2022 23:43
Поведение ключевого слова "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) для оценки ваших знаний,...
0
3
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это должно работать:

class Test {
  constructor(el) {
    this.box = el

    window.addEventListener('keydown', () => {
      if (!this.tl || !this.tl.isActive()) {
        this.tl = gsap.to(this.box, {
          x: "+=4",
          duration: 1,
        })
        console.info("Moving to:", Math.floor(this.box.getBoundingClientRect().x))
      }
    });
  }
}

const test = new Test(box)
#box {
  width: 25px;
  height: 25px;
  background: blue;
}
<div id = "box"></div>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/gsap/3.10.4/gsap.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/gsap/3.10.4/CSSRulePlugin.min.js"></script>

Вероятно, это не самое чистое решение, gsap — отличный инструмент, и, безусловно, у него есть лучший способ справиться с этим сценарием, но это первый подход жестокий, который пришел мне в голову.

Обновлено: Использование метода isActive() уже немного лучше.

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

Похожие вопросы

Как вы можете прочитать данные POST из javascript XMLHttpRequest в Golang?
Как добавить активный класс в активную ссылку в React Router dom v6.3 с использованием стилизованных компонентов - ReactJs ^ 18.1.0
Я пытаюсь исключить элементы из массива, но что-то делаю не так
ПО промежуточного слоя "strapi::session": требуются ключи приложения. Установите app.keys в config/server.js (например: keys: ['myKeyA', 'myKeyB'])
Как добавить роль с помощью discord.js? Использование v13
Создать новую страницу продукта при новой записи в базе данных
Сопоставление холста LinearGradient с изображением
Есть ли лучший способ реорганизовать эту функцию с помощью библиотеки Lodash?
Как обрабатывать ленивый импорт в функциональном компоненте, реагировать js, избегать импорта перед необходимостью рендеринга
Как сделать так, чтобы чекбокс ввода обновлял общую цену, используя значения + включая дополнительные сборы для общей суммы?