当前位置:首页 > VUE

vue实现拖动滑动

2026-01-17 21:05:27VUE

Vue 实现拖动滑动

使用原生 HTML5 拖放 API

在 Vue 中可以通过 @dragstart@dragover@drop 等事件实现基础的拖放功能。以下是一个简单的拖放示例:

<template>
  <div 
    @dragover.prevent
    @drop="handleDrop"
    style="width: 300px; height: 200px; border: 1px dashed #ccc;"
  >
    <div 
      draggable="true"
      @dragstart="handleDragStart"
      style="width: 100px; height: 50px; background: #42b983;"
    >
      拖动我
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(e) {
      e.dataTransfer.setData('text/plain', 'drag-data');
    },
    handleDrop(e) {
      e.preventDefault();
      const data = e.dataTransfer.getData('text/plain');
      console.log('拖放数据:', data);
    }
  }
}
</script>

使用第三方库 vue-draggable

对于更复杂的拖放需求,推荐使用 vue-draggable 库。安装方式:

npm install vuedraggable

基本用法:

<template>
  <draggable v-model="list" @end="onDragEnd">
    <div v-for="item in list" :key="item.id">
      {{ item.name }}
    </div>
  </draggable>
</template>

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      list: [
        { id: 1, name: 'Item 1' },
        { id: 2, name: 'Item 2' },
        { id: 3, name: 'Item 3' }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽完成', this.list);
    }
  }
};
</script>

实现滑动效果

如果需要实现滑动效果(如轮播图),可以使用 vue-awesome-swiper 库:

npm install swiper vue-awesome-swiper

示例代码:

<template>
  <swiper :options="swiperOption">
    <swiper-slide v-for="(slide, index) in slides" :key="index">
      <img :src="slide.image" style="width: 100%">
    </swiper-slide>
    <div class="swiper-pagination" slot="pagination"></div>
  </swiper>
</template>

<script>
import { Swiper, SwiperSlide } from 'vue-awesome-swiper';
import 'swiper/css/swiper.css';

export default {
  components: {
    Swiper,
    SwiperSlide
  },
  data() {
    return {
      swiperOption: {
        pagination: {
          el: '.swiper-pagination'
        },
        loop: true,
        autoplay: {
          delay: 3000
        }
      },
      slides: [
        { image: 'https://via.placeholder.com/600x300?text=Slide1' },
        { image: 'https://via.placeholder.com/600x300?text=Slide2' },
        { image: 'https://via.placeholder.com/600x300?text=Slide3' }
      ]
    };
  }
};
</script>

自定义拖动滑动

如果需要完全自定义的拖动滑动效果,可以通过监听鼠标事件实现:

<template>
  <div 
    ref="slider"
    @mousedown="startDrag"
    @mousemove="onDrag"
    @mouseup="endDrag"
    @mouseleave="endDrag"
    style="width: 100%; height: 200px; background: #eee; position: relative;"
  >
    <div 
      ref="handle"
      style="width: 50px; height: 50px; background: #42b983; position: absolute;"
      :style="{ left: handleX + 'px' }"
    ></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isDragging: false,
      startX: 0,
      handleX: 0
    };
  },
  methods: {
    startDrag(e) {
      this.isDragging = true;
      this.startX = e.clientX - this.handleX;
    },
    onDrag(e) {
      if (!this.isDragging) return;
      const sliderWidth = this.$refs.slider.offsetWidth;
      const handleWidth = this.$refs.handle.offsetWidth;
      let newX = e.clientX - this.startX;

      // 限制在滑块范围内
      newX = Math.max(0, Math.min(newX, sliderWidth - handleWidth));

      this.handleX = newX;
    },
    endDrag() {
      this.isDragging = false;
    }
  }
};
</script>

触摸屏支持

对于移动端触摸事件,需要添加对应的触摸事件监听:

<div 
  @touchstart="startDrag"
  @touchmove="onDrag"
  @touchend="endDrag"
  @touchcancel="endDrag"
>
  <!-- 拖动元素 -->
</div>

对应的 methods 需要修改为处理触摸事件:

startDrag(e) {
  this.isDragging = true;
  this.startX = e.touches[0].clientX - this.handleX;
},
onDrag(e) {
  if (!this.isDragging) return;
  const newX = e.touches[0].clientX - this.startX;
  this.handleX = newX;
}

vue实现拖动滑动

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

相关文章

vue实现选区创建

vue实现选区创建

Vue 实现选区创建的方法 在 Vue 中实现选区创建通常涉及 DOM 操作和事件处理。以下是几种常见的方法: 使用原生 DOM API 通过 window.getSelection() 和 Ra…

vue实现检测数组

vue实现检测数组

Vue 中检测数组变化的方法 Vue 的响应式系统无法直接检测到数组的某些变化,因为 JavaScript 的限制。以下是一些解决方案: 使用 Vue.set 或 this.$set Vue 提供…

vue为啥能实现监听

vue为啥能实现监听

Vue 实现监听的原理 Vue 的监听能力主要基于其响应式系统,该系统通过数据劫持和依赖收集实现。当数据变化时,系统能自动触发视图更新或执行回调函数。 核心机制:Object.defineProp…

vue实现点击页面切换

vue实现点击页面切换

实现点击页面切换功能 在Vue中实现点击页面切换功能,可以通过路由跳转或组件动态渲染两种方式完成。以下是具体实现方法: 使用Vue Router实现页面跳转 安装Vue Router后,在项目中…

vue实现选择本地文件

vue实现选择本地文件

实现文件选择功能 在Vue中实现本地文件选择可以通过HTML原生的<input type="file">元素实现。创建一个基本的文件选择组件: <template> &l…

vue怎么实现拖动数据

vue怎么实现拖动数据

Vue 实现拖动数据的方法 使用 HTML5 拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件实现拖动功能。 <template> &…