Есть слайдер Swiper.
На каждом слайдере размещён текст который при загрузке страницы или при попадании в видимую область выезжает из левого края страницы. Но он это делает один раз и всё. Нужно что-бы на каждом слайде при смене слайдов анимация повторялась.
Собственно вот сам пример:
Ссылка на сайт
Слайдер инициализируется так:
<script>
var swiper = new Swiper('.swiper-container', {
pagination: {
el: '.swiper-pagination',
clickable: true,
},
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
keyboard: {
enabled: true,
onlyInViewport: false,
},
autoplay: {
delay: 5000,
}
});
</script>
Анимацию вызываю так:
const animItems = document.querySelectorAll('._animate');
if (animItems.length > 0) {
window.addEventListener('scroll', animOnScroll);
function animOnScroll() {
for (let index = 0; index < animItems.length; index++) {
const animItem = animItems[index];
const animItemHeight = animItem.offsetHeight;
const animItemOffset = offset(animItem).top;
const animStart = 4;
let animItemPoint = window.innerHeight - animItemHeight / animStart;
if (animItemHeight > window.innerHeight) {
animItemPoint = window.innerHeight - window.innerHeight / animStart;
}
if ((pageYOffset > animItemOffset - animItemPoint) && pageYOffset < (animItemOffset + animItemHeight)) {
animItem.classList.add('_active');
} else {
animItem.classList.remove('_active');
}
}
}
function offset(el) {
const rect = el.getBoundingClientRect(),
scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
scrollTop = window.pageYOffset || document.documentElement.scrollTop;
return { top: rect.top + scrollTop, left: rect.left + scrollLeft}
}
setTimeout(() => {
animOnScroll();
}, 300);
}
Я знаю что у Swiper есть API slideChange, но в моём случае анимация не повторялась при смене слайдов.
Делал так:
<script>
var swiper = new Swiper('.swiper-container', {
pagination: {
el: '.swiper-pagination',
clickable: true,
},
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
keyboard: {
enabled: true,
onlyInViewport: false,
},
autoplay: {
delay: 5000,
}
});
swiper.on('slideChange', function () {
console.log('Слайд сменился'); // Оставил для проверки работает ли скрипт
const animItems = document.querySelectorAll('._animate');
if (animItems.length > 0) {
window.addEventListener('scroll', animOnScroll);
function animOnScroll() {
for (let index = 0; index < animItems.length; index++) {
const animItem = animItems[index];
const animItemHeight = animItem.offsetHeight;
const animItemOffset = offset(animItem).top;
const animStart = 4;
let animItemPoint = window.innerHeight - animItemHeight / animStart;
if (animItemHeight > window.innerHeight) {
animItemPoint = window.innerHeight - window.innerHeight / animStart;
}
if ((pageYOffset > animItemOffset - animItemPoint) && pageYOffset < (animItemOffset + animItemHeight)) {
animItem.classList.add('_active');
} else {
animItem.classList.remove('_active');
}
}
}
function offset(el) {
const rect = el.getBoundingClientRect(),
scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
scrollTop = window.pageYOffset || document.documentElement.scrollTop;
return { top: rect.top + scrollTop, left: rect.left + scrollLeft}
}
setTimeout(() => {
animOnScroll();
}, 300);
}
});
</script>
Если открыть консоль, то видно что вызов самого slideChange работает, а вот анимация не повторяется.
Могу предположить, что нужно подкорректировать сам вызов анимации, но как котелок не соображает.