vue项目实现堆叠卡片拖动切换效果

实际效果

实现流程

1. 实现卡片位置堆叠

将父元素的 position 设置成relative ,卡片的position 设置成 absolute 即可。

2. 消除图片的移动

如果卡片上有图片,默认拖动的时候就会导致像上图一样变成了选中图片移动,从而没法触发拖动事件。消除图片移动的方式就是在标签上添加ondragstart="return false;" 事件

html 复制代码
<el-image ondragstart="return false;" :src="" fit="fill" alt=""/>

3. 实现拖动事件

在卡片组件上添加@mousedown, 和 @mouseup 事件。监听鼠标的按下和抬上。当按下时记录鼠标的位置。然后给document 注册 mousemove 事件监听鼠标滑动时的位置,这个位置差代表卡片要滑动的距离,通过改变卡片的transform 样式实现卡片的切换。鼠标抬起时取消滑动事件以及处理卡片(删除或者复位)。

html 复制代码
<UserDetail class="card" :data="item" v-for="(item, index) in matchUsers" 
            @mousedown.stop="handleMouseDown($event)"
            @mouseup.stop = "handleMouseUp($event, index)"
            />
js 复制代码
// 记录按下的位置
    const position_X = ref(0)
    // 记录移动的当前位置
    const cur_X = ref(0)
    // 记录卡片元素
    const card = ref({})
    // 鼠标按下事件
    function handleMouseDown(event){
        // 获得最上方的卡片元素
        card.value = document.getElementsByClassName('card')[pageData.matchUsers.length - 1]
     	// 给两个位置赋初值
        position_X.value = event.clientX
        cur_x.value = event.clientX
        // 注册移动事件
        document.addEventListener('mousemove', handleMouseOver)
    }
    // 鼠标移动时设置卡片旋转移动
    function handleMouseOver(e){
        cur_X.value =  e.clientX
            // card.value.style.left = (cur_x - position_X.value) + 'px'
            card.value.style.transform = `translate(${cur_X.value - position_X.value}px, 0px) rotate(${(cur_X.value - position_X.value) / 20}deg)`;
    }
    // 鼠标抬起,移除移动事件,如果偏移量超过200则将卡片删除,否则复位。
    function handleMouseUp(event, index){
        document.removeEventListener('mousemove', handleMouseOver)
        if(cur_X.value - position_X.value > 200 || cur_X.value - position_X.value < -200){
            pageData.matchUsers.splice(index, 1)
        }else{
            card.value.style.transform = `translate(0px, 0px) rotate(0deg)`;
        }
    }
相关推荐
陈随易36 分钟前
在 VSCode 里,把项目一键部署到服务器
前端·后端·程序员
Highcharts.js1 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
To_OC1 小时前
我被 useState 坑了两次之后,终于把它的脾气摸透了
前端·javascript·react.js
鱼樱前端1 小时前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
_lucas2 小时前
给知识库网站接入AI问答
前端·ai编程·全栈
前端糕手2 小时前
前端面试题大全:JavaScript + Vue3 + React + TypeScript + 工程化 + 性能优化
前端
我不叫武3 小时前
一个用 Rust 写的离线编码查询桌面工具
前端
Web4Browser4 小时前
指纹浏览器 API 自动化怎么接:启动 Profile、获取 CDP 端点并连接自动化框架
前端·网络·typescript·自动化
Patrick_Wilson5 小时前
从 React 到 Flutter:写给前端的一张跨端知识地图
前端·flutter·react.js
颜酱5 小时前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端