57 lines
2.0 KiB
JavaScript
57 lines
2.0 KiB
JavaScript
// 无限循环左右滚动插件
|
|
const vhInfiniteLoop = {
|
|
init: function (dom, k = true, time = 1) {
|
|
const _this = this;
|
|
// 设置唯一标识符并初始化
|
|
const numStr = `${dom.classList.value}-num`;
|
|
const widthStr = `${dom.classList.value}-width`;
|
|
const funStr = `${dom.classList.value}-fun`;
|
|
_this[numStr] = 0;
|
|
_this[funStr] = null;
|
|
// Copy一遍子元素DOM并添加到父元素DOM尾部
|
|
Array.from(dom.children)
|
|
.map(i => i.cloneNode(true))
|
|
.forEach(i => dom.appendChild(i));
|
|
// 取宽度,设置初始位置,绑定事件
|
|
// 每个子元素给悬浮事件
|
|
Array.from(dom.children).forEach(i => {
|
|
// 悬浮事件
|
|
i.addEventListener("mouseenter", function () {
|
|
_this[funStr] = function () {
|
|
requestAnimationFrame(() => {
|
|
_this[funStr](dom, numStr, widthStr, k);
|
|
});
|
|
};
|
|
});
|
|
// 取消悬浮事件
|
|
i.addEventListener("mouseleave", function () {
|
|
_this[funStr] = function (dom, numStr, widthStr, k) {
|
|
_this[widthStr] = dom.offsetWidth;
|
|
!k && (dom.style.transform = `translateX(-${_this[widthStr] / 2}px)`);
|
|
_this[numStr] += time;
|
|
dom.style.marginLeft = `${k ? "-" : ""}${_this[numStr]}px`;
|
|
_this[numStr] >= _this[widthStr] / 2 && (_this[numStr] = 0);
|
|
requestAnimationFrame(() => {
|
|
_this[funStr](dom, numStr, widthStr, k);
|
|
});
|
|
};
|
|
});
|
|
});
|
|
// 设置循环函数
|
|
_this[funStr] = function (dom, numStr, widthStr, k) {
|
|
_this[widthStr] = dom.offsetWidth;
|
|
!k && (dom.style.transform = `translateX(-${_this[widthStr] / 2}px)`);
|
|
_this[numStr] += time;
|
|
dom.style.marginLeft = `${k ? "-" : ""}${_this[numStr]}px`;
|
|
_this[numStr] >= _this[widthStr] / 2 && (_this[numStr] = 0);
|
|
requestAnimationFrame(() => {
|
|
_this[funStr](dom, numStr, widthStr, k);
|
|
});
|
|
};
|
|
// 启动
|
|
requestAnimationFrame(() => {
|
|
_this[funStr](dom, numStr, widthStr, k);
|
|
});
|
|
}
|
|
};
|