Как запустить анимацию, когда доскролили к блоку?
тоесть блок попадает во вьюпорт - отрабатывает анимация
следуещий раз она запускается после обновлении страницы
а сейчас анимация отрабатывает после загрузки страницы и с мобилки пока доскролишь -её не видно
function animateBlock(entries, observer) {
const $this = $(entries[0].target)
if (entries[0].isIntersecting) {
console.log(1);
}
}
var options = {
rootMargin: '0px',
threshold: .2
}
let elem = $('.item');
var elemObserver = new IntersectionObserver(animateBlock, options);
elemObserver.observe(elem);
.item {
transform: translateX(-100%);
outline: 1px solid red;
animation: view 0.3s linear forwards;
animation-delay: 0.3s;
}
@keyframes view {
100% {
transform: translateX(0);
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<section class="text">
<div class="container">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor nihil dicta autem minima vel, dignissimos officia libero nesciunt saepe consectetur ex atque voluptatibus maiores ab quibusdam explicabo deserunt dolore voluptatem.
</div>
</section>
<section class="text">
<div class="container">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor nihil dicta autem minima vel, dignissimos officia libero nesciunt saepe consectetur ex atque voluptatibus maiores ab quibusdam explicabo deserunt dolore voluptatem.
</div>
</section>
<section class="text">
<div class="container">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor nihil dicta autem minima vel, dignissimos officia libero nesciunt saepe consectetur ex atque voluptatibus maiores ab quibusdam explicabo deserunt dolore voluptatem.
</div>
</section>
<section class="text">
<div class="container">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor nihil dicta autem minima vel, dignissimos officia libero nesciunt saepe consectetur ex atque voluptatibus maiores ab quibusdam explicabo deserunt dolore voluptatem.
</div>
</section>
<section class="text">
<div class="container">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor nihil dicta autem minima vel, dignissimos officia libero nesciunt saepe consectetur ex atque voluptatibus maiores ab quibusdam explicabo deserunt dolore voluptatem.
</div>
</section>
<section class="block">
<div class="container">
<div class="item">
<h3>block который анимируем</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id unde illum optio eveniet voluptates! Ullam quasi deserunt nemo id iure laboriosam distinctio, alias maxime expedita. Ut aperiam autem, hic explicabo.</p>
</div>
</div>
</section>
<section class="text">
<div class="container">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor nihil dicta autem minima vel, dignissimos officia libero nesciunt saepe consectetur ex atque voluptatibus maiores ab quibusdam explicabo deserunt dolore voluptatem.
</div>
</section>
<section class="block">
<div class="container">
<div class="item">
<h3>block который анимируем</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id unde illum optio eveniet voluptates! Ullam quasi deserunt nemo id iure laboriosam distinctio, alias maxime expedita. Ut aperiam autem, hic explicabo.</p>
</div>
</div>
</section>
<section class="text">
<div class="container">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor nihil dicta autem minima vel, dignissimos officia libero nesciunt saepe consectetur ex atque voluptatibus maiores ab quibusdam explicabo deserunt dolore voluptatem.
</div>
</section>
Ответы (1 шт):
Автор решения: Laukhin Andrey
→ Ссылка
Во-первых, IntersectionObserver.observe() добавляет один элемент, а $('.item') - это набор элементов. Во-вторых, нужно немного изменить структуру, чтобы стиль с анимацией присваивался объекту после пересечения с областью видимости.
CSS
.item {
transform: translateX(-100%);
outline: 1px solid red;
}
.animate {
animation: view 0.3s linear forwards;
animation-delay: 0.3s;
}
@keyframes view {
100% {
transform: translateX(0);
}
}
Нужно изменить структуру блока с анимацией, а точнее изменить класс контейнера, иначе не будет вызван метод анимации, ведь изначально .item скрыт.
HTML
<section class="block">
<div class="container-anim">
<div class="item">
<h3>block который анимируем</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id unde illum optio eveniet voluptates! Ullam quasi deserunt nemo id iure laboriosam distinctio, alias maxime expedita. Ut aperiam autem, hic explicabo.</p>
</div>
</div>
</section>
JS
$(document).ready(function() {
function animateBlock(entries, observer)
{
// нужно обработать все, ведь попасть в область просмотра могут несколько блоков
for(let i=0; i<entries.length; i++)
{
const $this = $(entries[i].target);
if (entries[i].isIntersecting)
{
$('.item', $this).addClass('animate');
elemObserver.unobserve(entries[i].target);
}
}
}
var options = {
rootMargin: '0px',
threshold: .2
}
let elem = $('.container-anim');
var elemObserver = new IntersectionObserver(animateBlock, options);
elem.each((i, e) => elemObserver.observe(e));
})