turn-lucky翻牌抽奖

3,286 阅读2分钟

vue 翻牌抽奖

前段时间公司需要搞个抽奖活动,按照产品要求就写了个翻牌抽奖。最近抽空封装成翻牌抽奖的插件turn-lucky

先看最终效果

方法

closeDialog (关闭弹窗事件)

flipCard (翻牌事件)这里可以根据后端接口返回图片地址

传入参数:

参数typeexample
titleString福袋(可不传)
imgSrcString图片地址
showDialogBoolean弹窗是否关闭
luckNameString中奖名字(可不传)
btnTextString弹窗按钮文案(可不传)

npm包  npm install turn-lucky

在需要用到的页面中(注意 一个页面目前只能引入一次)

import turnLucky from "turn-lucky";

components: { turnLucky }

开发思路

翻牌css特效

  .front,.back {
    -webkit-backface-visibility: hidden;
    -moz-backface-visibility: hidden;
    -o-backface-visibility: hidden;
    backface-visibility: hidden;
    -webkit-transition: 0.6s;
    -webkit-transform-style: preserve-3d;
    -moz-transition: 0.6s;
    -moz-transform-style: preserve-3d;
    -o-transition: 0.6s;
    -o-transform-style: preserve-3d;
    -ms-transition: 0.6s;
    -ms-transform-style: preserve-3d;
    transition: 0.6s;
    transform-style: preserve-3d;
    top: 0;
    left: 0;
    width: 109px;
    height: 109px;
    background: url("xxx.png") center center;
    background-size: contain;
    border-radius: 12px;
  }
  .back {
    -webkit-transform: rotateY(-180deg);
    -moz-transform: rotateY(-180deg);
    -o-transform: rotateY(-180deg);
    -ms-transform: rotateY(-180deg);
    transform: rotateY(-180deg);
    position: absolute;
  }
  .flip-container.flipped .back {
    -webkit-transform: rotateY(0deg);
    -moz-transform: rotateY(0deg);
    -o-transform: rotateY(0deg);
    -ms-transform: rotateY(0deg);
    transform: rotateY(0deg);
  }
  .flip-container.flipped .front {
    -webkit-transform: rotateY(180deg);
    -moz-transform: rotateY(180deg);
    -o-transform: rotateY(180deg);
    -ms-transform: rotateY(180deg);
    transform: rotateY(180deg);
  }

弹窗打开及关闭css特效

/*1、定义动画*/
@keyframes bounce {
  0% {
    transform: scale(0);
    opacity: 0;
  }
  50% {
    transform: scale(1.2);
    opacity: 0.5;
  }
  100% {
    transform: scale(1);
    opacity: 1;
  }
}
/*2、调用动画*/
.rightTopIn {
  transform-origin: center center;
  animation: bounce 1s;
}
.rightTopOut {
  transform-origin: right top;
  animation: bounce 1s reverse;
}

佛光css特效

.Rotation{
    background: url("xxx.png") no-repeat center center;
    background-size: cover;
    animation:turn 8s linear infinite;      
}
@keyframes turn{
  0%{-webkit-transform:rotate(0deg);}
  25%{-webkit-transform:rotate(90deg);}
  50%{-webkit-transform:rotate(180deg);}
  75%{-webkit-transform:rotate(270deg);}
  100%{-webkit-transform:rotate(360deg);}
}

红包雨特效

<div class="red_packet" id="red_packet">
   <ul v-for="(item, index) in liParams">
       <li :style="{ left: item.left, animationDuration: item.durTime, webkitAnimationDuration: item.durTime}" :class="item.cls" :data-index="index" @webkitAnimationEnd="removeDom">
            <i :style="{ transform: item.transforms, webkitTransform: item.transforms}"></i>
       </li>
    </ul>
</div>

data () {
    return {
        liParams: [],
        rainTimer: null,
        duration: 10000, // 定义时间
    }  
}
mounted () {
  this.startRedPacket()
},
methods: {
  /**
   * 开启动画
   */
  startRedPacket() {
      let win = document.documentElement.clientWidth || document.body.clientWidth
      let left = parseInt(Math.random() * (win - 50) + 0);

      let rotate = (parseInt(Math.random() * (45 - (-45)) - 45)) + "deg"; // 旋转角度
      let scales = (Math.random() * (12 - 8 + 1) + 8) * 0.1; // 图片尺寸
      let durTime = (Math.random() * (2.5 - 1.2 + 1) + 1.2) + 's'; // 时间 1.2和1.2这个数值保持一样

      this.liParams.push({left: left+'px', cls: 'move_1', transforms: 'rotate('+ rotate +') scale('+ scales +')', durTime: durTime})

      setTimeout( () => { // 多少时间结束
          clearTimeout(this.rainTimer)
          return;
      }, this.duration)

      this.rainTimer = setTimeout( () => {
          this.startRedPacket()
      },50) 
  },
  /**
   * 回收dom节点
   */
  removeDom (e) {
      let target = e.currentTarget;
      document.querySelector('#red_packet').removeChild(target)
  }
},
destroyed(){
    if(this.rainTimer){
        clearInterval(this.timer)
    }
}