1 回答
TA贡献1811条经验 获得超5个赞
您目前正在为每次更新向浏览器添加一个新事件。一个简单的解决方案如下:
const scroll = {
eventsAlreadyAdded: false,
create: function (el) {
this.scrollAnimation = gsap.timeline({ repeat: -1 });
// another piece of awesome code here...
if (!scroll.eventsAlreadyAdded) {
this.create__addMouseEvents(el);
scroll.eventsAlreadyAdded = true;
}
},
create__addMouseEvents: function (el) { /* .. */ },
update: function () { /* .. */ },
init: function () { /* .. */ }
}
由于您没有实例化滚动对象,因此必须更改全局引用 scroll.eventsAlreadyAdded。
或者,您可以稍微重写代码,以便处理实例化变量(未测试):
class Scroll {
/**
* Returns the element
* @type {Node}
*/
static get element() {
return document.querySelector('THE ELEMET SELECTOR');
}
/**
* Initial the scroll event to given element
* @param {Node} el the element that will get an animation
*/
constructor(el) {
this.el = el;
/**
* Remembers whether the events have already been attached to the element
* @type {boolean}
*/
this.eventsAlreadyAdded = false;
/**
* The timeline instanze from gsap
* @type {Timeline}
*/
this.scrollAnimation = null;
this.create();
}
create() {
this.scrollAnimation = gsap.timeline({
repeat: -1
});
// another piece of awesome code here...
this.addMouseEvents();
}
addMouseEvents() {
if (this.eventsAlreadyAdded) return;
this.el.addEventListener('mouseover', () => this.scrollAnimation.pause());
this.el.addEventListener('mouseout', () => this.scrollAnimation.resume());
this.eventsAlreadyAdded = true;
}
update() {
if (this.scrollAnimation) {
this.scrollAnimation.kill();
}
this.create();
}
}
let scroll = null;
let windowResizeTimer = null;
document.addEventListener('DOMContentLoaded', () => {
scroll = new Scroll(Scroll.element)
});
window.addEventListener('resize', () => {
if (!scroll) return;
if (windowResizeTimer) clearTimeout(windowResizeTimer);
windowResizeTimer = setTimeout(() => { scroll.update(); }, 150);
});
添加回答
举报