当前位置:首页 > VUE

vue实现卡片叠加滑动

2026-01-21 21:52:30VUE

Vue实现卡片叠加滑动效果

实现卡片叠加滑动效果可以通过CSS和Vue的动画过渡功能结合完成。以下是具体实现方法:

基础HTML结构

<template>
  <div class="card-stack">
    <div 
      v-for="(card, index) in cards" 
      :key="card.id"
      :style="{ zIndex: cards.length - index }"
      class="card"
      @click="handleSwipe(index)"
    >
      {{ card.content }}
    </div>
  </div>
</template>

Vue数据与交互逻辑

<script>
export default {
  data() {
    return {
      cards: [
        { id: 1, content: 'Card 1' },
        { id: 2, content: 'Card 2' },
        { id: 3, content: 'Card 3' }
      ]
    }
  },
  methods: {
    handleSwipe(index) {
      // 移除最顶层卡片
      this.cards.splice(index, 1);

      // 可选:添加新卡片到底部
      // this.cards.push({ 
      //   id: Date.now(), 
      //   content: `Card ${this.cards.length + 1}` 
      // });
    }
  }
}
</script>

CSS样式与动画

vue实现卡片叠加滑动

<style scoped>
.card-stack {
  position: relative;
  width: 300px;
  height: 400px;
  margin: 0 auto;
}

.card {
  position: absolute;
  width: 100%;
  height: 100%;
  background: white;
  border-radius: 10px;
  box-shadow: 0 2px 10px rgba(0,0,0,0.1);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 24px;
  transition: all 0.3s ease;
  cursor: pointer;
}

/* 卡片堆叠效果 */
.card:nth-child(1) { transform: translateY(0) scale(1); }
.card:nth-child(2) { transform: translateY(10px) scale(0.95); }
.card:nth-child(3) { transform: translateY(20px) scale(0.9); }

/* 滑动动画 */
.card.swipe-left {
  transform: translateX(-200%) rotate(-30deg) !important;
  opacity: 0;
}

.card.swipe-right {
  transform: translateX(200%) rotate(30deg) !important;
  opacity: 0;
}
</style>

进阶实现:拖拽滑动

对于需要拖拽滑动的实现,可以结合@touchstart@touchmove@touchend事件(或对应的鼠标事件):

拖拽逻辑

methods: {
  startDrag(e, index) {
    this.dragging = {
      index,
      startX: e.touches ? e.touches[0].clientX : e.clientX,
      startY: e.touches ? e.touches[0].clientY : e.clientY
    };
  },

  duringDrag(e) {
    if (!this.dragging) return;

    const currentX = e.touches ? e.touches[0].clientX : e.clientX;
    const offsetX = currentX - this.dragging.startX;
    const card = this.$refs.cards[this.dragging.index];

    card.style.transform = `translateX(${offsetX}px) rotate(${offsetX * 0.1}deg)`;
  },

  endDrag(e) {
    if (!this.dragging) return;

    const currentX = e.changedTouches ? e.changedTouches[0].clientX : e.clientX;
    const offsetX = currentX - this.dragging.startX;

    if (Math.abs(offsetX) > 100) {
      // 滑动超过阈值,移除卡片
      this.cards.splice(this.dragging.index, 1);
    } else {
      // 回弹动画
      this.$refs.cards[this.dragging.index].style.transform = '';
    }

    this.dragging = null;
  }
}

对应HTML修改

vue实现卡片叠加滑动

<div 
  v-for="(card, index) in cards" 
  :key="card.id"
  :ref="'cards'"
  @touchstart="startDrag($event, index)"
  @mousedown="startDrag($event, index)"
  @touchmove="duringDrag"
  @mousemove="duringDrag"
  @touchend="endDrag"
  @mouseup="endDrag"
  @mouseleave="endDrag"
>

使用第三方库

对于更复杂的效果,可以考虑使用专门库:

  • vue-swipe-cards: 专门为Vue设计的卡片滑动组件
  • hammer.js: 手势识别库,可处理复杂手势
  • vue-draggable: 实现拖拽排序功能

安装示例:

npm install vue-swipe-cards

使用示例:

import VueSwipeCards from 'vue-swipe-cards';

export default {
  components: {
    'swipe-cards': VueSwipeCards
  },
  // ...其他配置
}

以上方案可根据具体需求选择基础实现或进阶实现,第三方库能快速实现专业级效果但会增加项目体积。

标签: 卡片vue
分享给朋友:

相关文章

vue实现视频会议

vue实现视频会议

使用 Vue 实现视频会议 技术选型 Vue.js 作为前端框架,结合 WebRTC 技术实现实时音视频通信。常用的库包括: peerjs:简化 WebRTC 的点对点连接。 socket.io:…

vue设计与实现下载

vue设计与实现下载

vue设计与实现电子书下载 《Vue.js设计与实现》是一本深入解析Vue.js框架原理的书籍,由霍春阳(HcySunYang)撰写。以下是获取该资源的常见途径: 正版购买渠道 京东、当当、天…

vue实现上移下移插件

vue实现上移下移插件

实现上移下移功能的 Vue 插件 在 Vue 中实现列表项的上移和下移功能,可以通过自定义指令或组件封装的方式完成。以下是两种常见实现方式: 基于数组操作的通用方法 通过操作数组索引实现元素位置交换…

vue实现倒计时抢券

vue实现倒计时抢券

Vue 实现倒计时抢券功能 核心逻辑 倒计时抢券功能需要结合时间计算、状态管理和界面交互。通过 Vue 的响应式特性和生命周期钩子,可以高效实现这一需求。 实现步骤 1. 数据准备 在 Vue 组…

vue实现菜单栏锚点

vue实现菜单栏锚点

实现锚点菜单的基本思路 在Vue中实现菜单栏锚点功能,主要涉及两个方面:创建可跳转的锚点位置,以及菜单项的点击滚动控制。通过监听滚动事件可以高亮当前可见区域的对应菜单项。 创建页面锚点位置 在需要…

vue实现mvc

vue实现mvc

Vue 实现 MVC 模式 Vue 本身是一个 MVVM(Model-View-ViewModel)框架,但可以通过结构调整实现 MVC(Model-View-Controller)模式。以下是具体实…