You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fullcalendar Scheduler横向拖拽滚动画布功能实现求助

解决Fullcalendar Scheduler滚动画布横向拖拽问题

你的问题出在没有基于当前滚动位置来计算偏移量,原来的代码每次mousemove都直接用初始的e.pageX减去当前evt.clientX作为scrollLeft的值,这会导致滚动位置被强制重置到一个固定差值,而不是在原有基础上累加偏移。

我来帮你调整代码,核心是在鼠标按下时记录两个关键状态:当前的滚动位置,以及初始的鼠标坐标,然后在移动时计算鼠标的偏移量,再更新滚动位置:

// 定义变量存储初始状态
let startScrollLeft;
let startPageX;

$('.fc-scroller-canvas').on('mousedown', function(e) {
    // 记录初始滚动位置和鼠标X坐标
    startScrollLeft = $('.fc-scroller').scrollLeft();
    startPageX = e.pageX;
    
    // 阻止默认行为,避免选中文本或触发其他冲突事件
    e.preventDefault();

    $('.fc-scroller-canvas').on('mousemove', function(evt) {
        // 计算鼠标移动的差值:初始X - 当前X
        const deltaX = startPageX - evt.pageX;
        // 新的滚动位置 = 初始滚动位置 + 差值(拖拽方向和滚动方向相反)
        $('.fc-scroller').scrollLeft(startScrollLeft + deltaX);
    });
});

$('.fc-scroller-canvas').on('mouseup mouseleave', function() {
    // 移除mousemove事件,同时处理鼠标离开画布的情况
    $('.fc-scroller-canvas').off('mousemove');
});

另外,建议给.fc-scroller-canvas添加CSS样式,优化拖拽时的用户体验:

.fc-scroller-canvas {
    user-select: none;
    cursor: grab;
}
.fc-scroller-canvas:active {
    cursor: grabbing;
}

关键修复点说明:

  • 记录初始状态:在mousedown时保存当前的scrollLeft和鼠标初始位置,确保后续计算是基于拖拽开始时的状态,不会出现跳回初始位置的问题。
  • 计算偏移量:用startPageX - evt.pageX得到鼠标移动的水平差值,这个差值就是画布需要滚动的距离(鼠标往左拖,画布需要往右滚,所以直接加到初始滚动位置上)。
  • 优化事件解绑:同时监听mouseup和mouseleave事件,避免鼠标移出画布后还能继续拖拽的异常情况。
  • 交互体验优化:添加鼠标样式和文本选择禁用,让拖拽操作更直观自然。

你可以试试这个方案,应该就能正常实现横向拖拽滚动的效果了。

内容的提问来源于stack exchange,提问作者Jose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:11:34