微信小程序,类似于转盘抽奖功能

此事例的转盘抽奖是将圆盘划分为六等份
我们可以将其想象成一个九宫格(是一个正方形),将所有的内容先定位到最中间的位置,再以中间的位置为起点,将元素分别按照他们的位置向上、下、左右移动移动的距离,去放置他们。注意他们的位置是有规律的,位置确定好就不要轻易改变他,若是文字位置不合理,可以根据padding值去调试。(还有一种做法,将其三块拼接成长方形,一共三个长方形,然后根据他们的位置开始旋转)
WXML

<!-- 活动抽奖弹出框 -->
<view class="activityzhezhao">
    <view class="activityzhezhao1">
      <!-- 转盘中间的按钮 -->
      <view class="cen" bindtap="onClick"></view>

      <view class="activity_box {{anmClass}} {{animationFlag ? 'animation': ''}}">
        <view class="item" wx:for="{{awards}}" wx:key="*this">
          <text style="color:{{item.color}}">{{item.firstname}}</text>
          <text style="color:{{item.color}}">{{item.lastname}}</text>
        </view>
      </view>
    </view>
    <!-- 转盘底柱 -->
      <view class="activityCircle">
        <cover-image src="xxx"></cover-image>
      </view>
      <!-- 关闭按钮 -->
      <view class="activityzhezhao12" bindtap="dialonClose"></view>
</view>

WXSS

page {
 height: 100%;
 width: 100%;
}

view {
 box-sizing: border-box;
}

.activityzhezhao{
 width: 100%;
 height: 100%;
 position: absolute;
 background-color: rgba(0, 0, 0, 0.5);
 z-index: 2;
 top: 0;
 left: 0;
 overflow-x: hidden;
 overflow-y: hidden;
 display: flex;
 align-items: center;
}
.activityzhezhao1{
 width: 100%;
 height: 60%;
 position: relative;
}
.activityCircle{
 width: 69vw;
 height: 28vw;
 margin-top: 45vw;
 margin-left: -84vw;
}
.activityzhezhao12{
 width: 9vw;
 height: 9vw;
 margin-top: -95vw;
 margin-left: -10vw;
 background: url('xxx') no-repeat;
 background-size: 100% 100%;
}
.activityzhezhao11{
 width: 69vw;
   height: 87vw;
 background: url('xxx') no-repeat;
 background-size: 100% 100%;
 margin: 0 auto;
}
.cen {
 position: absolute;
 left: 38vw;
 top: 15vw;
 width: 22vw;
 height: 30vw;
 background: url('xxx') no-repeat;
 background-size: 100% 100%;
 z-index: 99;
}


.activity_box {
 height: 66vw;
 width: 66vw;
 position: absolute;
 top: 0;
 left: 16vw;
 background: url('xxx') no-repeat;
 background-size: 100% 100%;
 > view {
   width: 22vw;
   height: 22vw;
   position: absolute;
   top: 22vw;
   left: 22vw;

   text {
     display: block;
   }

   

   &:nth-of-type(1) {
     top: 0;
     left: 22vw;
     padding-top: 6vw;
   }
   &:nth-of-type(2) {
     top: 11vw;
     left: 44vw;
     padding-top: 8vw;
     transform: rotate(60deg);
   }
   &:nth-of-type(3) {
     top: 33vw;
     left: 42vw;
     padding-top: 8vw;
     transform: rotate(120deg);
   }
   &:nth-of-type(4) {
     top: 44vw;
     left: 22vw;
     margin-top: -7vw;
     transform: rotate(180deg);
   }
   &:nth-of-type(5) {
     top: 35vw;
     left: 0;
     padding-top: 10vw;
     transform: rotate(-120deg);
   }
   &:nth-of-type(6) {
     top: 11vw;
     left: 0vw;
     padding-top: 12vw;
     transform: rotate(-60deg);
   }
 }


 .item {
   font-family: PingFangSC-Semibold;
   font-size: 12px;
   color: #000;
   text-align: center;

 }


}
.animation{
 animation-fill-mode : forwards !important;
 animation: animation 6s linear;
}
.anm60 {
 animation-fill-mode : forwards !important;
 animation: animation1 .33s linear;
}
.anm120{
 animation-fill-mode : forwards !important;
 animation: animation2 .66s linear;
}
.anm180{
 animation-fill-mode : forwards !important;
 animation: animation3 .99s linear;
}
.anm240{
 animation-fill-mode : forwards !important;
 animation: animation4 1.33s linear;
}
.anm300{
 animation-fill-mode : forwards !important;
 animation: animation5 1.66s linear;
}
.anm0{
 animation-fill-mode : forwards !important;
 animation: animation6 1.99s linear;
}
@keyframes animation{
 from{
   transform: rotate(0deg);
 }
 to{
   transform: rotate(1080deg);
 }
}
@keyframes animation1{
 from{
   transform: rotate(0deg);
 }
 to{
   transform: rotate(60deg);
 }
}
@keyframes animation2{
 from{
   transform: rotate(0deg);
 }
 to{
   transform: rotate(120deg);
 }
}
@keyframes animation3{
 from{
   transform: rotate(0deg);
 }
 to{
   transform: rotate(180deg);
 }
}
@keyframes animation4{
 from{
   transform: rotate(0deg);
 }
 to{
   transform: rotate(240deg);
 }
}
@keyframes animation5{
 from{
   transform: rotate(0deg);
 }
 to{
   transform: rotate(300deg);
 }
}
@keyframes animation6{
 from{
   transform: rotate(0deg);
 }
 to{
   transform: rotate(360deg);
 }
}

JS

// components/dial/index.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
  },
  /**
   * 组件的初始数据
   */
  data: {
    anmAry: ['anm0', 'anm60','anm120','anm180','anm240','anm300'],
    anmClass: '',
    animationFlag: false,
    // 设置的奖项名称
      awards:[
        {
          id:0,
          firstname:'100%',
          lastname:'xxx',
          color:'#ff6906'
        },
        {
          id:1,
          firstname:'50%',
          lastname:'xxx',
          color:'#ffffff'
        },
        {
          id:2,
          lastname:'xxx',
          color:'#ff6906'
        },
        {
          id:3,
          firstname:'100%',
          lastname:'xxx',
          color:'#ffffff'
        },
        {
          id:4,
          firstname:'50%',
          lastname:'xxx',
          color:'#ff6906'
        },
        {
          id:5,
          lastname:'xxx',
          color:'#ffffff'
        },
      ],
  },
  /**
   * 组件的方法列表
   */
  methods: {
    // 点击关闭按钮,关闭弹窗
    dialonClose(){
      this.triggerEvent("dialonClose");
    },
    onClick(){
      this.setData({
        animationFlag: true
      })
      setTimeout(() => {
    // 这个index需要根据后台接口返回的去限定,可以使用索引,也可以使用key value,这个需要和后台去商量
        let index = parseInt(Math.random()*5)
        console.log(index);
        this.setData({
          animationFlag: false,
          anmClass: this.data.anmAry[index]
        })
      }, 6000);
    }
  }
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容