const onEntry7 = animateSequence('.floating', 'show-bottom');
const observer7 = new IntersectionObserver(onEntry7);
const allElements7 = document.querySelectorAll('#staff div.with-img');
allElements7.forEach(e => observer7.observe(e));
function animateSequence(targetSelector, classToAdd, delay = 500) {
const animatedElements = [];
let chain = Promise.resolve();
function show(e) {
return new Promise((res, rej) => {
setTimeout(() => {
e.classList.add(classToAdd);
res();
}, delay);
});
}
return function(entries) {
entries.forEach(entry => {
if (entry.intersectionRatio > 0) {
const elem = entry.target.querySelector(targetSelector);
if (!animatedElements.includes(elem)) {
animatedElements.push(elem);
console.clear();
console.log('chaining', ...animatedElements.map(e => e.getAttribute('data--name')));
chain = chain.then(() => show(elem));
observer7.unobserve(entry.target);
}
}
})
}
}
.floating {
opacity: 0;
transition: 1s opacity;
width: 157px;
height: 220px;
}
.floating.show-bottom {
opacity: 1;
animation: movefromtop 1s alternate infinite;
animation-iteration-count: 1;
animation-fill-mode: forwards;
}
@keyframes movefromtop {
from { transform: translateY(-5em); }
to { transform: translateY(0em); }
}
section#staff {
margin-top: 200px;
margin-bottom: 200px;
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
Scroll Down
<section id="staff" style="padding-top: 100px;">
<div class="col-lg-12 mx-auto mb-5">
<div class="container">
<div class="row icons-info">
<div class="with-img col-xs-12 col-xs-6 col-sm-6 col-md-6 col-lg-3">
<img class="floating" src="https://lagaleramagazine.es/rucab/img/Muñeco 1-08.png" data--name="1">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras nibh justo, tincidunt sed felis vitae, egestas scelerisque eros. </p>
</div>
<div class="with-img col-xs-12 col-xs-6 col-sm-6 col-md-6 col-lg-3 ">
<img class="floating" src="https://lagaleramagazine.es/rucab/img/Muñeco 2-08.png" data--name="2">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras nibh justo, tincidunt sed felis vitae, egestas scelerisque eros.</p>
</div>
<div class="with-img col-xs-12 col-xs-6 col-sm-6 col-md-6 col-lg-3 ">
<img class="floating" src="https://lagaleramagazine.es/rucab/img/Muñeco 3-08.png" data--name="3">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras nibh justo, tincidunt sed felis vitae, egestas scelerisque eros.</p>
</div>
<div class="with-img col-xs-12 col-xs-6 col-sm-6 col-md-6 col-lg-3">
<img class="floating" src="https://lagaleramagazine.es/rucab/img/Muñeco 1-08.png" data--name="4">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras nibh justo, tincidunt sed felis vitae, egestas scelerisque eros. </p>
</div>
</div>
</div>
</div>
</section>