原标题:Vue 仿探探拖拽卡片的效果

已更新Vue3版,请给前端大全发送关键字vue3仿探探获取Vue3版

类似 Tinder 和 探探 的卡片效果的组件,社区中已经非常多了。我这一版除了可以实现和他们一样的效果外。还增加了 飞卡 的效果,就是类似我的女神邱淑贞这样。

可以将卡片朝任意拖拽方向飞出去,必须得 帅 是不是!

下面带大家一步步来实现这个效果

先叠起来

咱们这次不要求在weex里可用,所以叠起来非常简单。

首先让三个卡片按照 近大远小 的原则分别设置设置 z-index ,宽和高,比如每一层卡片的宽和高比上一层卡片要缩小20个像素(还有一种做法是通过zoom或者scale来设置远处卡片的缩小级别)。然后加入绝对定位 position:absolute 和 z-index 就可以将卡片层叠起来了。

拖动第一张卡

因为只有第一张卡片可以拖动,所以我们只要监听第一张卡片的拖动事件。比如 touchstart , touchmove , touchcancel , touchend 。

拖动的时候需要注意,在 touchstart 的时候记录一下手指按下的位置,在 touchmove 时要减去这个位置,看上去就是点哪儿从哪儿拖。

touchStart: function( e){

varcurTouch=e.touches[ 0];

this.startLeft=curTouch.clientX- this.left;

this.startTop=curTouch.clientY- this.top;

}

touchMove: function( e){

varcurTouch=e.touches[ 0];

this.left=curTouch.clientX- this.startLeft;

this.top=curTouch.clientY- this.startTop;

}

飞出去

要实现超任意拖拽方向飞出去这个效果,需要用到一些数学公式。

计算卡片当前拖拽的坐标和起始坐标的夹角

varangle= Math.atan2((当前坐标.y-起点坐标.y), (当前坐标.x-起点坐标.x));

飞出去的落点 x 轴坐标通过计算angle的余弦值再乘以力度得出

this.left= Math.cos(angle)* this.throwDistance;

飞出去的落点 y 轴坐标通过计算angle的正弦值再乘以力度得出

this.top= Math.sin(angle)* this.throwDistance;

这里咱们做得再完善一些,在拖动结束时去判断一下当前拖动的距离是否足够触发飞卡效果。如果不触发飞卡效果,则触发回位效果。这样的话也可以防止用户误操作。

//计算两点之间的直线距离

getDistance: function( x1, y1, x2, y2){

var_x = Math.abs(x1 - x2);

var_y = Math.abs(y1 - y2);

returnMath.sqrt(_x * _x + _y * _y);

}

vardistance= this.getDistance( 0, 0, this.left, this.top);

if(distance> this.throwTriggerDistance){

this.makeCardThrow;

} else{

this.makeCardBack;

}

下层的卡片上推

上推其实很简单,一开始的时候,我就定义了四张( 不是3张吗?怎么变4张了 )卡片的大小和位置。

当第一张卡飞出去后

第2张卡片变更为原本第1张卡片的位置和大小

this.width2=

this.cardWidth;

this.height2= this.cardHeight;

this.left2= 0;

this.top2= 0;

第3张卡片变更为原本第2张卡片的位置和大小

this.width3=(

this.cardWidth-

this.leftPad*

2);

this.height3=( this.cardHeight- this.topPad* 2);

this.left3= this.leftPad;

this.top3=( this.topPad* 3);

第4张卡片原本是透明的,现在变为第3张卡片的位置和大小

this.width4=(

this.cardWidth-

this.leftPad*

4);

this.height4=( this.cardHeight- this.topPad* 4);

this.left4= this.leftPad* 2;

this.top4=( this.topPad* 6);

this.opacity4= 1;

我把阴影效果先去掉,大家观察一下这个细节

重置所有卡片

底层的卡片上推和第一张卡片的飞出效果是同时进行的,由css的 transition 来控制。不过时间是我们设定好的,所以只要在上推和飞出的动画时间结束后,我们重置一下所有4张卡片的大小和位置即可。

this.onThrowStart;

setTimeout( function( ){

that.isThrow= false;

that.isAnimating= false;

that.onThrowDone;

that.resetAllCard;

}, 400);

这里需要注意,所有四张卡片都需要 瞬间 完成重置,所以这步之前应该禁用掉transition动画。

组件化

为了适应各种使用场景,我们要将这个效果封装一下。

//提供几个事件,分别是拖动时,拖动结束,飞卡结束,飞卡失败(回位)

@onDragMove= 'onCardDragMove'

@onDragStop= 'onCardDragStop'

@onThrowDone= 'onCardThrowDone'

@onThrowFail= 'onCardThrowFail'

//参数就不细说了,都能看明白

:cardWidth= "200"

:cardHeight= "200"

cardBgColor= "#fff"

:leftPad= "10"

:topPad= "6"

:borderRadius= "8"

:throwTriggerDistance= "100"

dragDirection= "all"

:hasShadow= "false"

:hasBorder= "true"

提供三个slot,你可以非常方便的往卡片里塞内容

//firstCard,secondCard,thirdCard

< /slot>

现在来模仿几个效果 某乎的推荐回答 @onDragMove= 'onCardDragMove'

@onDragStop= 'onCardDragStop'

@onThrowDone= 'onCardThrowDone'

:cardWidth= "300"

:cardHeight= "120"

:throwTriggerDistance= "100"

dragDirection= "horizontal"

:hasShadow= "true"

仅允许水平拖动

由于改变宽高会导致文字换行变化,也许卡片用缩放的话,用户体验会更好一些吧

探探的效果

实现探探效果的核心是监听卡片拖动的位置

onCardDragMove(obj){

if(obj.left< -10){

this.actionName= "不喜欢";

} elseif(obj.left> 10){

this.actionName= "喜欢";

} else{

this.actionName= "";

}

}

源码仓库

https://github.com/ezshine/ezflycard

已更新Vue3版,请给 前端大全 发送关键字 vue3仿探探获取Vue3版 返回搜狐,查看更多

责任编辑:

Android仿探探卡片拖拽,Vue 仿探探拖拽卡片的效果相关推荐

  1. android仿陌陌tab,Vue|Nuxt.js仿探探卡片式左右拖拽|vue仿Tinder

    开场技术宅男对探探/陌陌并不陌生,一款专注于陌生人的社交App.里面的左右滑动翻牌子效果更是让人眼前一亮,似乎有一种古时君王选妃子的感觉.让人玩的爱不释手. 一睹风采 哈哈,效果还行吧.下面就简单的讲 ...

  2. Vue/Nuxt.js仿Tinder|探探翻牌特效|vue仿探探卡片滑动

    基于Vue.js|Nuxt.js实现探探卡片滑动切换效果 陌陌|探探社交App中拖拽滑动翻牌子效果让人印象深刻,最近在开发Nuxt项目,需要实现类似这个效果,于是经过多次调试,最终实现了,现整理作些简 ...

  3. android仿探探卡片右滑缩小,仿探探卡片滑动选择

    探探的滑动选择妹子的功能,算是一个很经典的交互方式.自从出来以后可以说是备受关注,渐渐地很多类似功能的app也都有尝试.实现也是具有综合性的挑战,所以说网上也是有不少例子的,在这里我通过自定义View ...

  4. vue实现卡片式上下滑动_基于Vue.js仿制探探卡片左右滑动特效

    说明 > 最近一直在捣鼓Nuxt.js项目,项目中有个需求是实现类似探探左右滑动切换功能.要求能实现手指拖拽切换.点击按钮进行切换.拖拽回弹等功能. 如上图:最终展示效果 emmm~~ 是不是感 ...

  5. ios 探探编辑页图片拖动_nuxt+vue仿微信/探探界面|nuxt聊天实例

    最近趁着空闲时间给自己充充电,捣鼓学习了下Nuxt.js框架并开发了一个聊天项目 NuxtChat . 如上图:一些演示效果片段.emmm~ 不错哟  项目介绍 基于nuxt.js+vue.js+vu ...

  6. nuxt-chat聊天室|vue仿微信/探探界面nuxt+vue+vuex|朋友圈

    Nuxt-Chatroom 基于Nuxt.js+Vue.js仿微信|探探App界面聊天社交 运用nuxt.js+vue.js+vuex+vpopup+vant+webpack等技术架构开发的社交聊天室 ...

  7. 五行代码实现 炫动滑动 卡片层叠布局,仿探探、人人影视订阅界面 简单优雅

    LayoutManagerDemo 项目地址:mcxtzhang/LayoutManagerDemo 简介:五行代码实现 炫动滑动 卡片层叠布局,仿探探.人人影视订阅界面 简单&优雅:Layo ...

  8. 基于 Spring Boot + Vue 实现的可视化拖拽编辑的大屏项目

    大家好,今天给小伙伴们分享一个基于 SpringBoot + Vue 实现的可视化拖拽编辑的大屏项目: 简介 这个是一个开源的一个BI平台,酷炫大屏展示,能随时随地掌控业务动态,让每个决策都有数据支撑 ...

  9. Vue.Draggable 实现组件拖拽

    Vue.Draggable 实现组件拖拽 特性 支持触摸设备 支持拖拽和选择文本 支持智能滚动 支持不同列表之间的拖拽 不以jQuery为基础 和视图模型同步刷新 和vue2的国度动画兼容 支持撤销操 ...

最新文章

  1. JSP--JavaBean
  2. 2022年值得关注的8个人工智能趋势
  3. Matlab中只运行m文件中部分程序的方法
  4. U型管铁球或将代替现代火箭喷射装置
  5. 深入了解android平台的jni---注册native函数
  6. SAP 企业管理软件与解决方案 产品简介
  7. Swig在Mac OS X上的安装
  8. python读取hdf文件 高效_利用python读取MODIS hdf文件
  9. 改造一下jeecg中的部门树
  10. 进程间通信之消息队列
  11. 计算机的硬盘 内存在哪查到,电脑硬盘内存怎么查看
  12. button执行onclick函数_可能你的react函数组件从来没有优化过
  13. ueditor 动态设置多语言
  14. Linux TTY 串口 struct termios结构体参数
  15. 关闭android系统自动更新,彻底关闭魅族flyme系统自动更新的方法分享
  16. 笔记本无线上网怎么通过网线共享给台式机 设置方法
  17. java 解析邮件_JavaMail:在Web应用下完整接收、解析复杂邮件
  18. python节日贺卡图片大全_简单漂亮三年级新年贺卡图片大全
  19. Python数据结构之平衡二叉树
  20. 广东计算机一级试题答案,广东计算机一级考试试题和答案

热门文章

  1. Oracle trunc函数
  2. Mybatis的mapper标签 namespace属性说明
  3. Sentinel 分布式系统的流量防卫兵
  4. 梯度算法的matlab程序,基于MATLAB的梯度法源代码
  5. 【算法设计与分析】10 差消法化简高阶递推方程
  6. 【Git、GitHub、GitLab】九 工作中非常重要的一些git用法
  7. 【C++深度剖析教程34】C++中的强制类型转换dynamic_cast
  8. new/delete与malloc/free
  9. Lesson 028 —— python 模块
  10. 转:linux中fork()函数详解