J'ai été dans le besoin de cette fonctionnalité en plusieurs fois, donc je l'ai extrait dans un mixin. Il peut être utilisé comme ceci:
import windowScrollPosition from 'path/to/mixin.js'
new Vue({
mixins: [ windowScrollPosition('position') ]
})
Cela crée un réactif position
de la propriété (peut être le nom que nous aimons) sur la Vue de l'instance. La propriété contient la fenêtre de la position de défilement comme un [x,y]
tableau.
N'hésitez pas à jouer autour avec cette CodeSandbox démo.
Voici le code de la mixin. Il est abondamment commenté, donc il ne devrait pas être trop difficile d'obtenir une idée de comment il fonctionne:
function windowScrollPosition(propertyName) {
return {
data() {
return {
// Initialize scroll position at [0, 0]
[propertyName]: [0, 0]
}
},
created() {
// Only execute this code on the client side, server sticks to [0, 0]
if (!this.$isServer) {
this._scrollListener = () => {
// window.pageX/YOffset is equivalent to window.scrollX/Y, but works in IE
// We round values because high-DPI devies can provide some really nasty subpixel values
this[propertyName] = [
Math.round(window.pageXOffset),
Math.round(window.pageYOffset)
]
}
// Call listener once to detect initial position
this._scrollListener()
// When scrolling, update the position
window.addEventListener('scroll', this._scrollListener)
}
},
beforeDestroy() {
// Detach the listener when the component is gone
window.removeEventListener('scroll', this._scrollListener)
}
}
}