当前位置:首页 > VUE

Vue实现鼠标拖拽滚动

2026-01-21 20:08:27VUE

Vue 实现鼠标拖拽滚动的方法

使用原生事件监听实现基础拖拽滚动

在Vue组件中,通过@mousedown@mousemove@mouseup事件监听实现拖拽滚动效果。需要记录鼠标按下时的初始位置和滚动容器的初始滚动位置。

<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等库。这些库提供了更完善的拖拽功能,包括惯性滚动、边界限制等特性。

安装sortablejs

Vue实现鼠标拖拽滚动

npm install sortablejs --save

在Vue中使用:

<template>
  <div ref="scrollContainer">
    <!-- 可拖拽滚动的内容 -->
  </div>
</template>

<script>
import Sortable from 'sortablejs'

export default {
  mounted() {
    new Sortable(this.$refs.scrollContainer, {
      animation: 150,
      scroll: true,
      scrollSensitivity: 50,
      scrollSpeed: 10,
      onStart: function() {
        // 拖拽开始时的回调
      },
      onEnd: function() {
        // 拖拽结束时的回调
      }
    })
  }
}
</script>

自定义指令实现复用

将拖拽滚动逻辑封装为Vue自定义指令,可以在多个组件中复用。

Vue实现鼠标拖拽滚动

// dragScroll.js
export default {
  bind(el) {
    let isDown = false
    let startX
    let scrollLeft

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

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

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

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

在main.js中注册指令:

import dragScroll from './directives/dragScroll'

Vue.directive('drag-scroll', dragScroll)

在组件中使用:

<div v-drag-scroll>
  <!-- 可拖拽滚动的内容 -->
</div>

注意事项

  1. 拖拽滚动实现需要考虑性能问题,避免频繁的DOM操作
  2. 移动端适配需要额外处理触摸事件(touchstart、touchmove等)
  3. 对于复杂布局,可能需要计算多个嵌套容器的滚动位置
  4. 可以添加CSS属性cursor: grabcursor: grabbing增强用户体验
  5. 考虑添加惯性滚动效果,使拖拽更加自然

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

相关文章

vue 中实现拖拽

vue 中实现拖拽

Vue 中实现拖拽功能 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop…

vue实现拖拽div

vue实现拖拽div

实现拖拽功能的基本思路 在Vue中实现拖拽功能可以通过HTML5的拖拽API或第三方库如vuedraggable来完成。以下是两种常见方法的详细说明: 使用HTML5拖拽API HTML5提供了原生…

jquery拖拽

jquery拖拽

jQuery拖拽实现方法 使用jQuery实现拖拽功能可以通过多种方式完成,以下是常见的实现方法: 使用jQuery UI的Draggable组件 jQuery UI提供了现成的拖拽组件,只需引入相…

vue实现左右拖拽

vue实现左右拖拽

Vue 实现左右拖拽功能 使用 HTML5 拖放 API 在 Vue 中可以利用 HTML5 的原生拖放 API 实现左右拖拽功能。通过 draggable 属性标记可拖拽元素,并监听 dragsta…

vue实现拖拽组件

vue实现拖拽组件

Vue 实现拖拽组件的方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…

vue实现dom拖拽

vue实现dom拖拽

Vue 实现 DOM 拖拽 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性和相关事件实现拖拽功能。在 Vue 中,可以通过绑定这些事件来实…