Очень часто события изменения размера или прокрутки запускаются несколько раз, поскольку пользователи обычно перетаскивают окно или прокручивают несколько пикселей вниз.
Причина, по которой они исчезают, заключается в том, что обработчик отключается несколько раз перед тем, каканимация заканчивается.
А из анимации работает, изменяя целевое значение с его текущего значения на предоставленное значение.Когда анимация запущена, ее текущее значение меняется.Если анимация .from запускается снова до завершения первой анимации, конечное значение для второй анимации меняется с первого вызова.Это приводит к искаженному виду анимации.
Чтобы избежать нескольких вызовов, вы можете добавить булеву переменную, чтобы проверить, запущена ли анимация в данный момент, и обновить ее как ложное в конце вашей анимации.
$.fn.isInViewport = function() {
var elementTop = $(this).offset().top;
var elementBottom = elementTop + $(this).outerHeight();
var viewportTop = $(window).scrollTop();
var viewportBottom = viewportTop + $(window).height();
return elementBottom > viewportTop && elementTop < viewportBottom;
};
var isAnimating = false;
var updateCheck = function() {
isAnimating = false;
}
$(window).on('resize scroll', function() {
if (!isAnimating) {
isAnimating = true;
TweenMax.from('#bstem', .1, {drawSVG: 0, ease: Power3.easeIn});
TweenMax.from('#beth', 1, {drawSVG: 0, ease: Power3.easeIn}).delay(.1);
TweenMax.from('#jacobs', 1.25, {drawSVG: 0, ease: Power3.easeIn, onComplete: updateCheck}).delay(.9);
}
});
Источник
Поскольку события прокрутки могут запускаться с высокой скоростью, обработчик событий не должен выполнять вычислительно дорогостоящие операции, такие как модификации DOM.Вместо этого рекомендуется регулировать событие, используя requestAnimationFrame, setTimeout или customEvent, следующим образом.Однако обратите внимание, что входные события и кадры анимации запускаются примерно с одинаковой скоростью, и поэтому приведенная ниже оптимизация часто не требуется.