Problème sur 1 animation JS au scroll vers le haut (vers le bas ça marche :) )

Pour toutes les discussions javascript, jQuery et autres frameworks
Répondre
yannquere
Messages : 1
Enregistré le : 14 juil. 2023, 19:56

Problème sur 1 animation JS au scroll vers le haut (vers le bas ça marche :) )

Message par yannquere » 14 juil. 2023, 19:58

Bonjour à tous,

Je suis en train de développer un site sur lequel je souhaite mettre en place une animation des titres au scroll. voici le lien de ma page test :
https://mlc.agence-communication-brest.fr/test/


Au scroll vers le bas les 2 lignes de titres se séparent bien pour aller chacune dans leur direction, au moment ou elles apparaissent visibles à l’écran.
C’est quand on scroll vers le haut que réside mon problème. Le dernier titre visible reprend bien sa position initiale, lorsqu’on arrive à sa hauteur, mais cela remet aussi en position initiale tous les titres qui sont plus haut sur la page et donc non visibles.
Je souhaiterais que chaque titre reprenne sa place uniquement quand on remonte à sa hauteur. Je pense qu’il ne manque pas grand chose, mais je suis très mauvais en JS et j’ai atteint mes limites techniques là-dessus ! Est-ce que quelqu’un aurait une petite idée de comment arriver à mes fins svp ? 🙂

Voici les codes HTML, CSS et JS que j’ai généré.

Code : Tout sélectionner

<div class="toto ">
<span class="titrehaut">Lorem ipsum</span><br>
<span class="titrebas">dolor sit amet !</span>
</div>

<div class="toto ">
<span class="titrehaut">Lorem ipsum</span><br>
<span class="titrebas">dolor sit amet !</span>
</div>

<div class="toto ">
<span class="titrehaut">Lorem ipsum</span><br>
<span class="titrebas">dolor sit amet !</span>
</div>

Code : Tout sélectionner

.toto {
overflow: visible;
}

.toto span {
display: inline-block;
vertical-align: middle;
transition: transform 3.5s;
}

.titrehaut.translate-right {
transform: translateX(100%);
}

.titrebas.translate-left {
transform: translateX(-100%);
}

Code : Tout sélectionner

<script>
var lastScrollPos = window.pageYOffset;

window.addEventListener('scroll', function() {
var titresHaut = document.querySelectorAll('.titrehaut');
var titresBas = document.querySelectorAll('.titrebas');
var currentScrollPos = window.pageYOffset;

if (currentScrollPos > lastScrollPos) {
// Scroll vers le bas
titresHaut.forEach(function(element) {
var rect = element.getBoundingClientRect();
if (rect.top < window.innerHeight && rect.bottom >= 0) {
element.classList.add('translate-right');
} else {
element.classList.remove('translate-right');
}
});

titresBas.forEach(function(element) {
var rect = element.getBoundingClientRect();
if (rect.top < window.innerHeight && rect.bottom >= 0) {
element.classList.add('translate-left');
} else {
element.classList.remove('translate-left');
}
});
} else {
// Scroll vers le haut
titresHaut.forEach(function(element) {
element.classList.remove('translate-right');
});

titresBas.forEach(function(element) {
element.classList.remove('translate-left');
});
}

lastScrollPos = currentScrollPos;
});
</script>


Un grand grand merci pour votre aide !



Yann

Avatar du membre
webmaster
Administrateur du site
Messages : 578
Enregistré le : 28 févr. 2017, 15:19

Re: Problème sur 1 animation JS au scroll vers le haut (vers le bas ça marche :) )

Message par webmaster » 15 juil. 2023, 10:38

Bonjour,

C'est pas mal comme idée et comme réalisation

A mon avis, il manque sur le scroll vers le haut une condition sur la position de scroll de la page avec window.pageYOffset

sur le scroll vers le bas, il y a bien
if (rect.top < window.innerHeight && rect.bottom >= 0) {

Sur le scroll vers le haut, il faut aussi ajouter ce type de contrainte pour ne pas activer l'animation sur tous les titres. A tester, mais ca serait du genre :
if (rect.top > window.pageYOffset && rect.bottom <= window.pageYOffset+window.innerHeight) {
TJS : 25 ans et mon livre Tout JavaScript chez Dunod
https://www.toutjavascript.com/livre/index.php

Répondre