var move_x = function(selector) {
const $box = $(selector);
if (!$box.length) {
console.error("Element not found with selector:", selector);
return;
}
let isDragging = false,
startX, scrollLeft;
// 初始光标样式
$box.css('cursor', 'grab');
// 滚轮滚动
$box.on('wheel', function(e) {
$box.scrollLeft($box.scrollLeft() + (e.originalEvent.deltaY > 0 ? 30 : -30));
e.preventDefault();
});
// 鼠标按下
$box.on('mousedown', function(e) {
isDragging = true;
startX = e.clientX - $box.offset().left;
scrollLeft = $box.scrollLeft();
$box.css('cursor', 'grabbing');
e.preventDefault();
});
// 鼠标移动
$(document).on('mousemove', function(e) {
if (!isDragging) return;
const x = e.clientX - $box.offset().left;
const walk = (x - startX) * 2;
$box.scrollLeft(scrollLeft - walk);
});
// 重置拖拽状态
function resetDrag() {
isDragging = false;
$box.css('cursor', 'grab');
}
$box.on('mouseleave', resetDrag);
$(document).on('mouseup', resetDrag);
// 触摸支持
$box.on('touchstart', function(e) {
isDragging = true;
startX = e.originalEvent.touches[0].clientX - $box.offset().left;
scrollLeft = $box.scrollLeft();
});
$(document).on('touchmove', function(e) {
if (!isDragging) return;
const x = e.originalEvent.touches[0].clientX - $box.offset().left;
const walk = (x - startX) * 2;
$box.scrollLeft(scrollLeft - walk);
});
$box.on('touchend', resetDrag);
// 返回一个对象以便可以移除事件监听
return {
destroy: function() {
$box.off('wheel mousedown mouseleave touchstart touchend');
$(document).off('mousemove mouseup touchmove');
}
};
}; |