营销组件-大转盘

1,195 阅读2分钟

背景

平时在电商业务开发中,经常会碰到需要开发一些营销相关的功能单页,例如大转盘,刮刮卡,翻牌抽奖等营销功能。为了提高项目的开发速度,故对这些营销功能进行组件封装。

计划

参考支付宝小程序版本,开发出对应vue版本的营销组件库。

营销功能罗列(vue组件版本)

  • wheel-draw 大转盘
  • scratch-card 刮刮卡
  • flip-draw 翻牌抽奖
  • fruit-slots 水果机
  • hit-eggs 砸金蛋
  • dice-roller 摇骰子

设计与分析

大转盘原型脑图:

大转盘原型脑图

抽奖按钮状态图:

抽奖按钮状态图

项目难点:

  • 1.奖项布局问题。 根据传入的全部的奖项数组进行动态分配空间和布局,利用transform配合transformOrigin进行布局
  • 2.转盘怎么转起来,并且是一开始从慢到快,再到停下来的动画?(纯css能实现吗?) 可以利用css3的transform:rotate(x deg),配合动画过渡属性transition: all 6s ease完成旋转动画。
  • 3.某一次抽奖奖项的确认在什么时机确认比较合适?
    • 1.点击抽奖按钮时才去请求抽奖接口确认,这种情况存在接口延迟的请求,转盘不会马上转起来,只有等到奖项回传后才会转起来,用户体验感不好;
    • 2.初始化时就调用了抽奖逻辑(如果有抽奖次数),然后点击抽奖按钮时已经知道当前抽奖的奖项,同时调用抽奖接口,把下一次抽奖的奖项返回回来(如果有抽奖次数),这种处理逻辑可以避免点击抽奖按钮,转盘不能马上转起来的问题,同时引入了另外一个问题,就是当前的抽奖操作和用户的操作其实是不一致的。

组件API设计

参数说明类型默认值
width转盘的宽度Number|String300
initDeg转盘初始化旋转的角度Number0
rotTimes抽奖的剩余次数Number1
prizeList奖项列表数组Array[]
prizeName抽奖名称String''
prizeWidth抽奖的宽度NumberNaN
prizePaddingTop抽奖距离顶部的距离NumberNaN
bgImg转盘背景图Stringgw.alipayobjects.com/zos/rmsport…
btnImg抽奖按钮图Stringgw.alipayobjects.com/zos/rmsport…
onStart抽奖开始触发的回调函数Function() => {}
onFinish抽奖结束触发的回调函数Function() => {}
onTimesUp没有抽奖次数触发的回调函数Function() => {}

代码逻辑

template结构

<template>
  <div class="wheel-container" :style="{
    width: width + 'px',
    height: width + 'px'
  }">
    <div
      class="wheel-list"
      :style="{
        background: 'url(' + bgImg + ') 0% 0% / 100% 100% no-repeat',
        transform: 'rotate(' + (degValue || initDeg) + 'deg)'
      }"
    >
      <div class="wheel-item" v-for="(item, index) in prizeList" :key="index">
        <div
          class="wheel-img"
          :style="{
            width: prizeWidthData,
            paddingTop: prizePaddingTopData,
            transform: 'rotate(' + (index + 0.5)/6 + 'turn)',
            transformOrigin: itemTransformOrigin,
          }"
        >
          <img :src="item.img" style="width: 100%;height:auto;">
        </div>
      </div>
    </div>
    <div class="wheel-btn">
      <img :src="btnImg" class="img" @click="start">
    </div>
  </div>
</template>

未完待续~~~

最后

项目代码地址:营销组件,欢迎留言,顺手点个start~