当前位置:首页 > VUE

vue实现拖拽滚动

2026-03-09 16:53:05VUE

Vue 实现拖拽滚动的方法

使用原生拖拽事件 在 Vue 中可以通过监听 mousedownmousemovemouseup 事件实现拖拽滚动效果。创建一个可拖拽的区域,记录鼠标按下时的位置,并在移动时计算偏移量来调整滚动位置。

<template>
  <div 
    ref="scrollContainer"
    @mousedown="startDrag"
    @mousemove="onDrag"
    @mouseup="stopDrag"
    @mouseleave="stopDrag"
  >
    <!-- 可滚动内容 -->
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDragging: false,
      startX: 0,
      scrollLeft: 0
    };
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.startX = e.pageX - this.$refs.scrollContainer.offsetLeft;
      this.scrollLeft = this.$refs.scrollContainer.scrollLeft;
    },
    onDrag(e) {
      if (!this.isDragging) return;
      e.preventDefault();
      const x = e.pageX - this.$refs.scrollContainer.offsetLeft;
      const walk = (x - this.startX) * 2;
      this.$refs.scrollContainer.scrollLeft = this.scrollLeft - walk;
    },
    stopDrag() {
      this.isDragging = false;
    }
  }
};
</script>

使用第三方库 借助 vue-draggablesortablejs 等库可以快速实现拖拽滚动功能。这些库提供了更丰富的 API 和事件支持,适合复杂场景。

vue实现拖拽滚动

npm install sortablejs
<template>
  <div ref="scrollContainer">
    <div v-for="item in items" :key="item.id">{{ item.text }}</div>
  </div>
</template>

<script>
import Sortable from 'sortablejs';
export default {
  mounted() {
    new Sortable(this.$refs.scrollContainer, {
      animation: 150,
      onEnd: (event) => {
        console.log('拖拽结束', event);
      }
    });
  },
  data() {
    return {
      items: [
        { id: 1, text: 'Item 1' },
        { id: 2, text: 'Item 2' }
      ]
    };
  }
};
</script>

自定义指令实现 通过 Vue 自定义指令可以封装拖拽逻辑,使组件更简洁。创建一个指令处理拖拽事件和滚动行为。

vue实现拖拽滚动

Vue.directive('drag-scroll', {
  bind(el, binding) {
    let isDragging = false;
    let startX = 0;
    let scrollLeft = 0;

    el.addEventListener('mousedown', (e) => {
      isDragging = true;
      startX = e.pageX - el.offsetLeft;
      scrollLeft = el.scrollLeft;
    });

    el.addEventListener('mousemove', (e) => {
      if (!isDragging) return;
      e.preventDefault();
      const x = e.pageX - el.offsetLeft;
      const walk = (x - startX) * 2;
      el.scrollLeft = scrollLeft - walk;
    });

    el.addEventListener('mouseup', () => {
      isDragging = false;
    });

    el.addEventListener('mouseleave', () => {
      isDragging = false;
    });
  }
});

使用 CSS 属性增强体验 为拖拽区域添加 cursor: grabcursor: grabbing 样式可以提升用户体验。在拖拽过程中动态切换光标样式。

.drag-scroll-container {
  cursor: grab;
  overflow-x: auto;
  white-space: nowrap;
}

.drag-scroll-container:active {
  cursor: grabbing;
}

注意事项

  • 在移动端需要额外处理 touchstarttouchmovetouchend 事件。
  • 拖拽滚动可能与默认的浏览器滚动行为冲突,需要调用 e.preventDefault() 阻止默认事件。
  • 对于大量数据的列表,建议使用虚拟滚动技术优化性能。

标签: 拖拽vue
分享给朋友:

相关文章

vue实现jqueryui

vue实现jqueryui

Vue 实现 jQuery UI 功能 在 Vue 项目中实现类似 jQuery UI 的功能,可以通过原生 Vue 组件或第三方库来实现。以下是几种常见 jQuery UI 功能的 Vue 替代方案…

vue实现数组

vue实现数组

Vue 实现数组操作的方法 在 Vue 中,数组的操作需要特别注意响应式的问题。Vue 提供了一些方法来确保数组的变动能够触发视图更新。 响应式数组方法 Vue 对以下数组方法进行了封装,确保它们能…

vue 实现树状

vue 实现树状

Vue 实现树状结构的方法 递归组件实现树状结构 递归组件是 Vue 中实现树状结构的常见方法。通过组件自身调用自身,可以轻松构建多层级树状结构。 <template> <ul…

vue实现Siri

vue实现Siri

Vue 实现 Siri 风格语音交互 实现类似 Siri 的语音交互功能需要结合语音识别、语音合成和前端交互逻辑。Vue 作为前端框架,可以很好地管理这些功能的交互状态。 语音识别集成 使用 Web…

vue实现vr

vue实现vr

Vue 实现 VR 的方法 Vue 可以与 WebVR 或 WebXR API 结合使用,通过 Three.js、A-Frame 等库实现 VR 效果。以下是几种常见方法: 使用 A-Frame 框…

vue实现加载

vue实现加载

Vue 实现加载功能的方法 使用 v-if 或 v-show 控制加载状态 通过数据绑定控制加载动画的显示与隐藏。v-if 会完全移除 DOM 元素,v-show 只是切换 display 属性。…