微信小程序实现卡片切换动画效果

index.wxml

<view class="xin">
<view class="title">你有一封新的信件</view>
<view class="border"></view>
<view class="xin-list" bindtouchend="moveItem" bindtouchstart="moveStart">
<block wx:for="{{xinList}}" wx:key="key" wx:for-index="idx">
<view class="single" style="opacity:{{item.display}};transform: translateX({{item.slateX}}) scale({{item.scale}});z-index:{{item.zIndex}};transform-origin: 100% 50% 0;{{item.style}}">
<view class="xin-shou">
致 {{item.to}}
</view>
<view class="xin-body">
{{item.msg}}
</view>
<view class="shenglue">···</view>
<view class="xin-xie">By {{item.from}}</view>
</view>
</block>
</view>
</view>

2.index.wxss

.xin{
     padding:0 20px;
}
.xin .title{
     font-size: 14px;
     color: #444;
}
.xin .border{
     height: 0;
     border-top: 1px solid #ccc;
     margin-top: 20px;
     width:20%;
}
.xin-list{
     width: 100%;
     position: relative;
}
.xin-list .single:nth-of-type(1){
     z-index: 10;
}
/* .xin-list .single:nth-of-type(2){
     position: absolute;
     transform: translateX(20px) scale(0.8);
     
     transform-origin: 100% 50% 0; 
     top: 0;
     z-index: -1;
}
.xin-list .single:nth-of-type(3){
     position: absolute;
     transform: translateX(40px) scale(0.6);
     
     transform-origin: 100% 50% 0; 
     
     top: 0;
     z-index: -2;
} 
*/
.xin-list .single:nth-of-type(n+4){
     
     transform:translateX(40px) scale(0.6);
     transform-origin: 100% 50% 0; 
}
.xin-list .single{
     transition: all 1s;
     overflow: hidden;
     border-radius: 1px;
     margin-top:15px;
     width: calc(100% - 60px);
     height: calc(100vh - 150px - 11vh);
     background: #fff;
     position: absolute;
     box-shadow: 3px 3px 10px 0px #777;
}
.xin-shou{
     writing-mode: vertical-lr;
     font-size: 15px;
     float: left;
     padding:10px 2px 10px 2px;
     letter-spacing:4px;
     margin:0 15px;
     position: relative;
     top: 50%;
     max-height: 80%;
     overflow: hidden;
     transform: translateY(-50%);
     border: 1px solid #999;
}
.xin-body{
     text-indent: 2em;
     letter-spacing:0.2em;
     writing-mode:vertical-lr;
     max-width:40vw;
     line-height:8vw;
     overflow: hidden;
     float: left;
     height: 70%;
     vertical-align: middle;
     position: relative;
     top: 50%;
     transform: translateY(-50%);
     text-align:justify;
}
.shenglue{
     float: left;
     height: 70%;
     line-height:25px;
     width: 25px;
     text-align:justify;
     writing-mode:vertical-lr;
     margin-top: 23%;
     letter-spacing:10px;
}
.xin-xie{
     clear: both;
     font-size: 12px;
     position: absolute;
     right: 15px;
     bottom: 10px;
}

index.js

//index.js
var app = getApp();
//获取应用实例
 
Page({
     data: {
          userInfo: {},
          startX:0, //开始移动时距离左
          endX:0, //结束移动时距离左
          nowPage:0, //当前是第几个个页面
          xinList:[
               {
                    id:5,
                    from:'一路向南1',
                    to:'记得要微笑',
                    msg:'这么多年咨询信看下来s,让我逐渐明白一件事。 很多时候,咨询的人心里已经有了答案,来咨询只是想确认自己的决定是对的。 所以有些人读过回信后,会再次写信过来, 大概就是因为回答的内容和他的想法不一样。',
                    display:0,
                    scale:'',
                    slateX:'',
                    zIndex:0,
                    style:''
               },
               {
                    id: 5,
                    from: '一路向南2',
                    to: '记得要微笑',
                    msg: '这么多年咨询信看下来s,让我逐渐明白一件事。 很多时候,咨询的人心里已经有了答案,来咨询只是想确认自己的决定是对的。 所以有些人读过回信后,会再次写信过来, 大概就是因为回答的内容和他的想法不一样。',
                    display:0,
                    scale: '',
                    slateX: '',
                    zIndex: 0,
                    style: ''
               },
               {
                    id: 5,
                    from: '一路向南3',
                    to: '记得要微笑',
                    msg: '这么多年咨询信看下来,让我逐渐明白一件事。 很多时候,咨询的人心里已经有了答案,来咨询只是想确认自己的决定是对的。 所以有些人读过回信后,会再次写信过来, 大概就是因为回答的内容和他的想法不一样。',
                    display:0,
                    scale: '',
                    slateX: '',
                    zIndex: 0,
                    style: ''
               },
               {
                    id: 5,
                    from: '一路向南4',
                    to: '记得要微笑',
                    msg: '这么多年咨询信看下来,让我逐渐明白一件事。 很多时候,咨询的人心里已经有了答案,来咨询只是想确认自己的决定是对的。 所以有些人读过回信后,会再次写信过来, 大概就是因为回答的内容和他的想法不一样。',
                    display:0,
                    scale: '',
                    slateX: '',
                    zIndex: 0,
                    style: ''
               },
               {
                    id: 5,
                    from: '一路向南5',
                    to: '记得要微笑',
                    msg: '这么多年咨询信看下来,让我逐渐明白一件事。 很多时候,咨询的人心里已经有了答案,来咨询只是想确认自己的决定是对的。 所以有些人读过回信后,会再次写信过来, 大概就是因为回答的内容和他的想法不一样。',
                    display: 0,
                    scale: '',
                    slateX: '',
                    zIndex: 0,
                    style: ''
               },
               {
                    id: 5,
                    from: '一路向南6',
                    to: '记得要微笑',
                    msg: '这么多年咨询信看下来,让我逐渐明白一件事。 很多时候,咨询的人心里已经有了答案,来咨询只是想确认自己的决定是对的。 所以有些人读过回信后,会再次写信过来, 大概就是因为回答的内容和他的想法不一样。',
                    display: 0,
                    scale: '',
                    slateX: '',
                    zIndex: 0,
                    style: ''
               },
               {
                    id: 5,
                    from: '一路向南7',
                    to: '记得要微笑',
                    msg: '这么多年咨询信看下来,让我逐渐明白一件事。 很多时候,咨询的人心里已经有了答案,来咨询只是想确认自己的决定是对的。 所以有些人读过回信后,会再次写信过来, 大概就是因为回答的内容和他的想法不一样。',
                    display: 0,
                    scale: '',
                    slateX: '',
                    zIndex: 0,
                    style: ''
               },
          ]
     },
     //事件处理函数
 
     onLoad: function (e) {
     
          this.checkPage(this.data.nowPage);
     },
     onReady: function () {
        
     },
     onShareAppMessage: function () {
          return {
               title: '解忧小酒馆,专治不开心~'
          }
     },
     //手指触发开始移动
     moveStart:function(e) {
          var startX = e.changedTouches[0].pageX;
          this.setData({
               startX:startX
          });
     },
     //手指触摸后移动完成触发事件
     moveItem: function (e) {
          var that = this;
          var endX = e.changedTouches[0].pageX;
          this.setData({
               endX: endX
          });
     
          //计算手指触摸偏移剧距离
          var moveX = this.data.startX - this.data.endX;
          
          //向左移动
          if(moveX > 20 ){
     
               if(that.data.nowPage >= (that.data.xinList.length - 1)) {
                    wx.showToast({
                         title: '最后一封信了喔,明天再来吧',
                         icon: 'none'
                    })
                    return false;
               }
               that.setData({
                    nowPage:that.data.nowPage+1
               });
               this.checkPage(this.data.nowPage);
          }
          if(moveX < -20) {
               if (that.data.nowPage <= 0) {
                    wx.showToast({
                         title: '这是第一封信了喔',
                         icon: 'none'
                    })
                    return false;
               } 
               that.setData({
                    nowPage: that.data.nowPage - 1
               });
               this.checkPage(this.data.nowPage);
               
               // wx.showToast({
               //  title: '不可以回退噢',
               //  icon:'none'
               // })
          }
          
               
     },
     // 页面判断逻辑,传入参数为当前是第几页 
     checkPage:function(index) {
          //信列表数据
          var data = this.data.xinList;
          var that = this;
          var m = 1;
          for(var i = 0;i < data.length;i ++) {
               //先将所有的页面隐藏
               var disp = 'xinList[' + i + '].display';
               var sca = 'xinList[' + i + '].scale';
               var slateX = 'xinList[' + i + '].slateX';
               var zIndex = 'xinList[' + i + '].zIndex';
               var style = 'xinList[' + i + '].style';
               that.setData({
                    [disp]:0,
                    [style]: "display:block",
               });
               //向左移动上一个页面
               if(i == (index - 1) ){
                    that.setData({
                         [slateX]: '-120%',
                         [disp]: 1,
                         [zIndex]: 2,
                         
                    });
               }
               //向右移动的最右边要display:none的页面
               if (i == (index + 3)) {
                    that.setData({
                         [style]:'display:none',
                         [slateX]:'0',
                         [zIndex]: -10,
                    });
               }
               if(i == index || (i > index && (i < index + 3))) {
                    //显示最近的三封
                    that.setData({
                         [disp]:1
                    });
                    //第一封信
                    if(m == 1){
                         this.setData({
                              [sca]: 1,
                              [slateX]: 0,
                              [zIndex]: 1,
                         });
                    }
                    //第一封信
                    else if (m == 2) {
                         this.setData({
                              [sca]: 0.8,
                              [slateX]:'20px',
                              [zIndex]: -1,
                         });
                    }
                    //第三封信
                    else if (m == 3) {
                         this.setData({
                              [sca]: 0.6,
                              [slateX]: '40px',
                              [zIndex]: -2,
                         });
                    }
                    m ++;
               }
          
          }
     }
})

 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值