drop-card.uvue 5.2 KB
Newer Older
DCloud_JSON's avatar
DCloud_JSON 已提交
1
<template>
2 3 4 5 6 7 8 9 10 11
  <view class="root">
    <template v-for="(item,index) in cardList" :key="index">
      <view class="card" ref="card" @touchstart="touchstart($event as TouchEvent,index)" @touchmove="touchmove($event as TouchEvent,index)" @touchend="touchend" @touchcancel="touchend">
        <image class="card-img" ref="card-img" :src="item"></image>
        <template v-if="index == 2">
          <view class="state">
            <image class="state-icon like" ref="state-icon-like" src="/static/template/drop-card/like.png" mode="widthFix"></image>
            <image class="state-icon dislike" ref="state-icon-dislike" src="/static/template/drop-card/dislike.png" mode="widthFix"></image>
          </view>
        </template>
DCloud_JSON's avatar
DCloud_JSON 已提交
12
      </view>
13
    </template>
DCloud_JSON's avatar
DCloud_JSON 已提交
14 15 16 17
  </view>
</template>
<script lang="ts">
  let sX : number = 0,
18 19 20
    sY : number = 0,
    screenWidth : number = 1,
    nodesMap = new Map<string, INode[]>();
DCloud_JSON's avatar
DCloud_JSON 已提交
21 22 23 24
  export default {
    data() {
      return {
        x: 0,
25 26 27 28 29 30 31
        y: 0,
        cardList: [
          '/static/template/drop-card/1.jpg',
          '/static/template/drop-card/2.jpg',
          '/static/template/drop-card/3.jpg'
        ] as string[],
        NodesMap: new Map<string, INode[]>(),
DCloud_JSON's avatar
DCloud_JSON 已提交
32 33
      }
    },
34 35 36 37
    onReady() {
      this.setStyle('card',2,'transitionTimingFunction','ease-in-out');
      this.setStyle('card',2,'transitionProperty','transform');
      
DCloud_JSON's avatar
DCloud_JSON 已提交
38 39
      uni.getSystemInfo({
        success: (e) => {
40 41 42 43 44 45 46
          // console.log('e',e);
          screenWidth = e.screenWidth;
          let height = e.screenHeight - 200 + 'px'
          for (var i = 0; i < 3; i++) {
            this.setStyle('card',i,'height', height);
            this.setStyle('card-img',i,'height', height);
          }
DCloud_JSON's avatar
DCloud_JSON 已提交
47
        }
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
      })
    },
    watch: {
      x() {
        this.onMove()
      },
      y() {
        this.onMove()
      }
    },
    computed: {
      movePercent() : number {
        return Math.abs(this.x) / (screenWidth/2*3)
      },
      likeOpacity() : number {
        return this.x < 0 ? 0 : this.movePercent * 100
      },
      dislikeOpacity() : number {
        return this.x > 0 ? 0 : this.movePercent * 100
      }
DCloud_JSON's avatar
DCloud_JSON 已提交
68
    },
69 70 71 72 73 74 75 76 77 78
    methods: {
      setStyle(refName:string,index:number,propertyName:string,propertyStyle:any):void{
        let nodes:INode[]|null = nodesMap.get(refName)
        if(nodes == null){
          nodes = this.$refs.get(refName) as INode[]
          nodesMap.set(refName,nodes)
        }else{
          // console.log('直接拿');
        }
        (nodes)[index].style.setProperty(propertyName,propertyStyle);
DCloud_JSON's avatar
DCloud_JSON 已提交
79
      },
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
      onMove() {
        this.setStyle('card',0,'transform', 'scale('+(this.movePercent/10+0.80)+')')
        this.setStyle('card',1,'transform', 'scale('+(this.movePercent/10+0.90)+')')
        this.setStyle('card',2,'transform', 'translateX('+this.x+'px) translateY('+this.y+'px) rotate('+this.x/-30+'deg)')
        
        this.setStyle('state-icon-like',0,'opacity', x < 0 ? 0 : movePercent * 10)
        this.setStyle('state-icon-dislike',0,'opacity', x > 0 ? 0 : movePercent * 10)
      },
      changeCardList() {
        let newArr = this.cardList.slice();
        this.cardList[0] = newArr[2]
        this.cardList[1] = newArr[0]
        this.cardList[2] = newArr[1]
        this.x = 0
        this.y = 0
      },
      touchstart(e : TouchEvent,index:number) {
        if(index != 2){
          return 
        }
DCloud_JSON's avatar
DCloud_JSON 已提交
100 101 102
        sX = e.touches[0].screenX;
        sY = e.touches[0].screenY;
      },
103 104 105 106
      touchmove(e : TouchEvent,index:number) {
        if(index != 2){
          return 
        }
DCloud_JSON's avatar
DCloud_JSON 已提交
107 108 109 110 111
        this.x += e.touches[0].screenX - sX;
        this.y += e.touches[0].screenY - sY;
        sX = e.touches[0].screenX;
        sY = e.touches[0].screenY;
      },
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
      touchend() {
        // console.log('touchend');
        
        // 设置释放之后飘走的方向 0回到坐标中心 1向右 2向左
        let k:number = 0;
        if (this.x > screenWidth / 6 ) {
          k = 1
        }else if(this.x < screenWidth * -1 / 6){
          k = -1
        }
        // 设置动画时间
        let time = 400;
        this.setStyle('card',2,'transitionDuration',time.toFixed(0));
        
        this.x = screenWidth * 1.5 * k
        this.y = Math.abs(screenWidth * 0.5 * k)
        
        setTimeout(()=>{
          //关闭动画
          this.setStyle('card',2,'transitionDuration',0);
          // 更改卡片上的图片内容
          if(k != 0){
            this.changeCardList()
          }
        },time)
DCloud_JSON's avatar
DCloud_JSON 已提交
137 138 139 140 141 142 143 144 145 146 147
      }
    }
  }
</script>
<style>
  .root {
    flex: 1;
    position: relative;
  }

  .card {
148
    width: 700rpx;
DCloud_JSON's avatar
DCloud_JSON 已提交
149 150 151
    height: 750rpx;
    position: absolute;
    margin: 0 25rpx;
152
    margin-top: 30px;
DCloud_JSON's avatar
DCloud_JSON 已提交
153
    border-radius: 10px;
154 155 156
    color: #FFF;
    box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
    z-index: 100;
DCloud_JSON's avatar
DCloud_JSON 已提交
157 158
  }
  
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
  .card-img {
    border-radius: 10px;
  }

  .state {
    top: 20rpx;
    left: 20rpx;
    width: 650rpx;
    padding: 4px;
    position: absolute;
    flex-direction: row;
    justify-content: space-between;
  }

  .state-icon {
    width: 30px;
    height: 30px;
    border: 1px solid #FFF;
    background-color: #FFF;
    padding: 3px;
    border-radius: 100px;
    box-shadow: 0 0 1px #EBEBEB;
    opacity: 0;
DCloud_JSON's avatar
DCloud_JSON 已提交
182 183
  }
</style>