最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 2021更新,Vue仿探探拖拽卡片的效果

    正文概述 掘金(大帅搞全栈)   2020-12-15   353

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

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

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

    绝对原创,如有雷同,纯属对方抄袭?

    先叠起来

    其实我最早实现这个效果,是在2018年的时候,在weex上实现过一版。原帖请看这里:zhuanlan.zhihu.com/p/37482853

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

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

    2021更新,Vue仿探探拖拽卡片的效果

    拖动第一张卡

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

    2021更新,Vue仿探探拖拽卡片的效果

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

    touchStart:function(e){
    	var curTouch=e.touches[0];
    	this.startLeft=curTouch.clientX-this.left;
    	this.startTop=curTouch.clientY-this.top;
    }
    touchMove:function(e){
    	var curTouch=e.touches[0];
    	this.left=curTouch.clientX-this.startLeft;
    	this.top=curTouch.clientY-this.startTop;
    }
    

    飞出去

    2021更新,Vue仿探探拖拽卡片的效果

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

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

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

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

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

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

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

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

    2021更新,Vue仿探探拖拽卡片的效果

    //计算两点之间的直线距离
    getDistance:function(x1, y1, x2, y2) {
        var _x = Math.abs(x1 - x2); 
        var _y = Math.abs(y1 - y2); 
        return Math.sqrt(_x * _x + _y * _y);
    }
                
    var distance=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;
    

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

    2021更新,Vue仿探探拖拽卡片的效果

    重置所有卡片

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

    2021更新,Vue仿探探拖拽卡片的效果

    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 name="firstCard"></slot>
    

    现在来模仿几个效果

    某乎的推荐回答

    @onDragMove='onCardDragMove'
    @onDragStop='onCardDragStop'
    @onThrowDone='onCardThrowDone'
    :cardWidth="300" 
    :cardHeight="120"
    :throwTriggerDistance="100"
    dragDirection="horizontal"
    :hasShadow="true"
    

    仅允许水平拖动

    2021更新,Vue仿探探拖拽卡片的效果

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

    探探的效果

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

    onCardDragMove(obj){
        if(obj.left<-10){
            this.actionName="不喜欢";
        }else if(obj.left>10){
            this.actionName="喜欢";
        }else{
            this.actionName="";
        }
    }
    

    2021更新,Vue仿探探拖拽卡片的效果

    源码仓库

    github.com/ezshine/ezf…

    这周我会抽空再实现一个vue3版本的~

    关注大帅搞全栈

    近期文章(感谢掘友的鼓励与支持???)

    • ?做了一夜动画,就为让大家更好的理解Vue3的Composition Api 836赞
    • ?2020,疫情重创了我的第三次创业 | 掘金年度征文 122赞
    • ?我失败的创业历史之”有温度“的人文考勤系统 15赞
    • ?如何用JS做一个老虎机抽奖,由服务端控制得奖几率 38赞
    • ?前端开发中新拟态风格的崛起 56赞

    欢迎拍砖,一起探讨更优雅的实现


    起源地下载网 » 2021更新,Vue仿探探拖拽卡片的效果

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元