当前位置:首页 > VUE

vue实现滑动框

2026-01-16 07:15:23VUE

Vue 实现滑动框的方法

使用原生 CSS 和 Vue 事件

通过 Vue 的 v-on 指令绑定鼠标事件,结合 CSS 的 transform 实现滑动效果。

<template>
  <div class="slider-container">
    <div 
      class="slider"
      @mousedown="startDrag"
      @mousemove="onDrag"
      @mouseup="endDrag"
      @mouseleave="endDrag"
      :style="{ transform: `translateX(${position}px)` }"
    >
      滑动内容
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      position: 0,
      isDragging: false,
      startX: 0
    }
  },
  methods: {
    startDrag(e) {
      this.isDragging = true
      this.startX = e.clientX - this.position
    },
    onDrag(e) {
      if (!this.isDragging) return
      this.position = e.clientX - this.startX
    },
    endDrag() {
      this.isDragging = false
    }
  }
}
</script>

<style>
.slider-container {
  width: 100%;
  overflow: hidden;
  position: relative;
}
.slider {
  width: 200px;
  height: 100px;
  background: #eee;
  cursor: grab;
  user-select: none;
}
</style>

使用第三方库 vue-draggable

对于更复杂的拖拽需求,可以使用 vue-draggable 库。

安装依赖:

vue实现滑动框

npm install vuedraggable

示例代码:

<template>
  <draggable 
    v-model="list"
    class="drag-area"
    @start="dragStart"
    @end="dragEnd"
  >
    <div v-for="item in list" :key="item.id" class="drag-item">
      {{ 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' }
      ]
    }
  },
  methods: {
    dragStart() {
      console.log('拖动开始')
    },
    dragEnd() {
      console.log('拖动结束')
    }
  }
}
</script>

<style>
.drag-area {
  width: 300px;
}
.drag-item {
  padding: 10px;
  margin: 5px;
  background: #f0f0f0;
  cursor: move;
}
</style>

实现触摸屏支持

对于移动端设备,需要添加触摸事件支持:

vue实现滑动框

<template>
  <div class="slider-container">
    <div 
      class="slider"
      @mousedown="startDrag"
      @touchstart="startDrag"
      @mousemove="onDrag"
      @touchmove="onDrag"
      @mouseup="endDrag"
      @touchend="endDrag"
      @mouseleave="endDrag"
      :style="{ transform: `translateX(${position}px)` }"
    >
      滑动内容
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    startDrag(e) {
      this.isDragging = true
      const clientX = e.clientX || e.touches[0].clientX
      this.startX = clientX - this.position
    },
    onDrag(e) {
      if (!this.isDragging) return
      const clientX = e.clientX || e.touches[0].clientX
      this.position = clientX - this.startX
      e.preventDefault()
    }
  }
}
</script>

添加边界限制

防止滑块滑出容器范围:

onDrag(e) {
  if (!this.isDragging) return
  const clientX = e.clientX || e.touches[0].clientX
  let newPosition = clientX - this.startX

  // 获取容器和滑块宽度
  const containerWidth = this.$el.offsetWidth
  const sliderWidth = this.$el.querySelector('.slider').offsetWidth

  // 设置边界
  const minPosition = 0
  const maxPosition = containerWidth - sliderWidth
  newPosition = Math.max(minPosition, Math.min(newPosition, maxPosition))

  this.position = newPosition
  e.preventDefault()
}

添加动画效果

使用 CSS 过渡使滑动更平滑:

.slider {
  transition: transform 0.2s ease;
}

当拖动结束时可以添加回弹效果:

endDrag() {
  this.isDragging = false

  // 如果滑块部分滑出,自动回弹
  const containerWidth = this.$el.offsetWidth
  const sliderWidth = this.$el.querySelector('.slider').offsetWidth

  if (this.position < 0) {
    this.position = 0
  } else if (this.position > containerWidth - sliderWidth) {
    this.position = containerWidth - sliderWidth
  }
}

标签: vue
分享给朋友:

相关文章

vue实现好友列表

vue实现好友列表

实现好友列表的Vue组件 数据准备 在Vue组件的data中定义好友列表数据,通常是一个数组对象,每个对象包含好友的基本信息如ID、头像、昵称等。 data() { return { f…

vue实现打字机

vue实现打字机

Vue实现打字机效果 在Vue中实现打字机效果可以通过动态更新文本内容并添加延迟来实现。以下是几种常见的实现方法: 使用setInterval实现 <template> <d…

vue实现收起展开面板

vue实现收起展开面板

实现收起展开面板的方法 在Vue中实现收起展开面板功能可以通过多种方式完成,以下是几种常见的实现方法: 使用v-show或v-if控制显示隐藏 利用Vue的指令可以轻松实现面板的展开和收起:…

vue中如何实现循环

vue中如何实现循环

在 Vue 中实现循环 Vue 提供了 v-for 指令用于实现循环渲染列表数据。v-for 可以遍历数组、对象或数字范围,生成动态的 DOM 元素。 遍历数组 使用 v-for 遍历数组时,语法为…

vue前端分页怎么实现

vue前端分页怎么实现

前端分页实现方法 在Vue中实现前端分页通常涉及数据分割和页面控制逻辑。以下是常见的实现方式: 使用计算属性分页 通过计算属性对数据进行切片处理: computed: { paginatedD…

vue实现双折线图

vue实现双折线图

实现双折线图的步骤 安装必要的依赖库(如 ECharts 或 Chart.js),这里以 ECharts 为例: npm install echarts --save 在 Vue 组件中引入 EC…