当前位置:首页 > 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 多级弹窗实现方法 方法一:使用动态组件与递归组件 在 Vue 中可以通过动态组件配合递归组件实现多级弹窗。定义一个基础弹窗组件,通过递归调用自身实现层级嵌套。 基础弹窗组件模板示例: &…

vue实现必填

vue实现必填

Vue 实现表单必填验证的方法 在Vue中实现表单必填验证可以通过多种方式完成,以下是几种常见的方法: 使用HTML5原生属性 最简单的必填验证可以通过HTML5的required属性实现: &l…

vue实现flvvideo

vue实现flvvideo

vue-flv-player 实现 FLV 视频播放 安装依赖包 npm install flv.js vue-flv-player 基础组件引入 <template> <v…

vue 实现搜索

vue 实现搜索

实现 Vue 搜索功能 在 Vue 中实现搜索功能通常涉及以下几个关键步骤: 数据绑定与输入监听 使用 v-model 双向绑定搜索输入框的值,监听用户输入: <template>…

vue实现双向

vue实现双向

Vue 实现双向绑定的方法 Vue 的双向绑定主要通过 v-model 指令实现,它结合了数据绑定和事件监听,适用于表单元素(如 input、select、textarea 等)。以下是几种常见的实现…

vue实现影院

vue实现影院

Vue实现影院功能的基本思路 使用Vue框架开发影院功能需要结合前端组件化开发、状态管理以及后端API交互。以下是关键实现步骤: 影院页面布局设计 影院页面通常分为顶部导航栏、影院列表区域和底部导航…