当前位置:首页 > 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怎么实现选中删除

vue怎么实现选中删除

实现选中删除功能的方法 在Vue中实现选中删除功能通常涉及以下几个关键步骤: 数据绑定与选中状态管理 使用v-model或v-for指令绑定列表数据,结合复选框或单选按钮实现选中状态管理。例如:…

vue实现导航栏切图

vue实现导航栏切图

Vue 实现导航栏切图 使用 Vue Router 实现基础导航 在 Vue 项目中,可以通过 Vue Router 实现导航栏的路由切换。创建一个导航栏组件,并在其中使用 <router-li…

vue实现下拉框删除

vue实现下拉框删除

Vue 实现下拉框删除功能 在Vue中实现下拉框的删除功能通常涉及以下步骤: 数据绑定与渲染 在Vue组件中定义数据数组用于存储下拉框选项: data() { return { op…

vue实现标签

vue实现标签

Vue 实现标签的方法 在 Vue 中实现标签功能可以通过多种方式完成,以下是几种常见的方法: 使用动态组件 动态组件可以根据不同的条件渲染不同的标签内容。通过 :is 属性动态绑定组件名,实现标签…

vue插件实现

vue插件实现

Vue 插件实现方法 Vue 插件是一种向 Vue 应用程序添加全局功能的机制。插件可以包含全局指令、过滤器、混入、实例方法等。 插件的基本结构 一个 Vue 插件通常是一个对象或函数,需要暴露一个…

vue实现曲线

vue实现曲线

Vue 实现曲线的方法 在 Vue 中实现曲线可以通过多种方式,包括使用 SVG、Canvas 或第三方库如 D3.js、ECharts 等。以下是几种常见的方法: 使用 SVG 绘制曲线 SVG…