前置准备
- 需要提前定义全局css类
hide-scrollbar
.hide-scrollbar {
overflow: auto;
scrollbar-width: none;
-ms-overflow-style: none;
&::-webkit-scrollbar {
display:none;
}
}
export const vScroll = {
mounted(el,binding) {
const {modifiers} = binding
const horizontal = modifiers.horizontal
const vertical = modifiers.vertical
const hide = modifiers.hide
let startX = 0
let startY = 0
let initX = 0
let initY = 0
if(hide) {
el.classList.add('hide-scrollbar');
}
function onMouseMove(event) {
event.preventDefault();
el.style.cursor = "grabbing"
if(horizontal) {
el.scrollLeft = startX - event.clientX + initX
}
if(vertical) {
el.scrollTop = startY - event.clientY + initY
}
}
function onMouseUp() {
el.style.cursor = "grab"
document.removeEventListener("mousemove",onMouseMove);
document.removeEventListener("mouseup",onMouseUp);
}
el.addEventListener("mousedown",function(event) {
el.style.cursor = "grabbing"
startX = event.clientX;
startY = event.clientY;
initX = el.scrollLeft
initY = el.scrollTop
document.addEventListener("mousemove",onMouseMove);
document.addEventListener("mouseup",onMouseUp);
});
el.addEventListener('mouseover', function() {
el.style.cursor = "grab"
});
el.addEventListener('mouseout', function() {
el.style.cursor = "default"
});
},
beforeUnmount(el) {
el.removeEventListener("mousedown")
el.removeEventListener("mouseover")
el.removeEventListener("mouseout")
}
};
<script setup>
import { vScroll} from "./vScroll.js"
</script>
<template>
<div v-scroll.horizontal.hide style="width: 200px;overflow: auto;">
<p style="width: 500px"></p>
</div>
</template>