Javascript pur
Voici un exemple en javascript de gestion des classes pendant le défilement.
const navbar = document.getElementById('navbar')
// OnScroll event handler
const onScroll = () => {
// Get scroll value
const scroll = document.documentElement.scrollTop
// If scroll value is more than 0 - add class
if (scroll > 0) {
navbar.classList.add("scrolled");
} else {
navbar.classList.remove("scrolled")
}
}
// Use the function
window.addEventListener('scroll', onScroll)
#navbar {
position: fixed;
top: 0;
left: 0;
right: 0;
width: 100%;
height: 60px;
background-color: #89d0f7;
box-shadow: 0px 5px 0px rgba(0, 0, 0, 0);
transition: box-shadow 500ms;
}
#navbar.scrolled {
box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.25);
}
#content {
height: 3000px;
margin-top: 60px;
}
<!-- Optional - lodash library, used for throttlin onScroll handler-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
<header id="navbar"></header>
<div id="content"></div>
Quelques améliorations
Vous voudrez probablement limiter la gestion des événements de défilement, d'autant plus que la logique du gestionnaire devient plus complexe. throttle
de lodash
lib s'avère utile.
Et si vous faites du spa, gardez à l'esprit que vous devez supprimer les écouteurs d'événements avec la fonction removeEventListener
une fois qu'ils ne sont plus nécessaires (par exemple, lors de la onDestroy
le crochet de cycle de vie de votre composant, comme destroyed()
pour Vue, ou peut-être la fonction de retour de useEffect
pour React).
Exemple d'étranglement avec lodash :
// Throttling onScroll handler at 100ms with lodash
const throttledOnScroll = _.throttle(onScroll, 100, {})
// Use
window.addEventListener('scroll', throttledOnScroll)