运营:提个活动需求,拉新下用户嘛。
产品:网上demo那么多随便拷拷就能用。
开发:
那么没做过的首先是google一下看看有没有好的demo拿来改改。
做过的呢想想拷贝下就好了吧。

进入正题:

网上老.虎.机.的插件挺多的,实现原理也各不一样,
这里先给个网上找的老.虎.机的效果demo: 点我,emmmm,基本就是这个操作了吧。

然后这里主要提下自己当初做老.虎.机时想到的一个原理:

划重点

css的 background-position属性是设置背景图像的起始位置,那么我们控制背景图在0-3秒的时间内显示不同的位置,再加上过渡动画就可以达到老.虎.机旋转的效果
第一个版本的在这里点我
看下效果视频(第二个版本)
这里只能上传图片 - -然后我视频转的gif有十多兆,放这里有点卡。就上传视频了。
视频效果
该版本定时3秒停,然后弹窗,未做到老.虎.机底部滚动停止后再显示弹窗。

今天要说的是第三种方案(实现底部滚动停止后显示弹窗且跟后端返回的中奖码一致)

image.png

image.png

先贴一段代码

WXML
  <view class="box-container"><view class="box-tips">{{boxTips}}</view> <view class="wheel-boxs"> <view class="box-list" wx:for="{{boxStatus}}" wx:key="index"> <view class="box-text" wx:if="{{!isStart}}">{{item}}</view> <view class="box-image" style="background: url('https://qiniu-image.qtshe.com/20181113wheels.png'); background-position-y: {{isStart ? ((16 - item) * 100) + 1500 + 'rpx' : 0}}; background-size: 100% 100%; transition-property: {{isStart ? 'all' : 'none'}}; transition-delay: {{(index + 1) * 100 + 'ms'}}; transition-duration: 3.5s;"> </view> {{item}} </view> </view> <view class="start-box"> <form bindsubmit="startDraw" report-submit="true" wx:if="{{pageVo.remainCount !== 0}}"> <button class="start-draw" formType="submit" /> </form> </view> <view class="last-tips">当前剩余 <text>{{pageVo.remainCount || 0}}</text> 次攒码机会</view> </view> 
WXSS
.box-container {width: 680rpx;height: 380rpx; background: url(https://qiniu-image.qtshe.com/20190227goddess_02.png) no-repeat center center; background-size: 100% 100%; position: relative; z-index: 10; margin: auto; overflow: hidden; } .wheel-boxs { width: 680rpx; padding: 0 80rpx; margin-top: 16rpx; } .box-list { width: 90rpx; height: 100rpx; background: url(https://qiniu-image.qtshe.com/20190227goddess_11.png) no-repeat center center; background-size: 100% 100%; display: inline-block; margin-right: 16rpx; overflow: hidden; } .box-list:last-child { margin-right: 0; } .box-tips { width: 500rpx; height: 54rpx; background: url(https://qiniu-image.qtshe.com/20190227goddess_10.png) no-repeat center center; overflow: hidden; background-size: 100% 100%; margin: 20rpx auto; color: #000; font-size: 24rpx; text-align: center; line-height: 54rpx; margin-top: 36rpx; } .box-text { width: 100%; height: 100rpx; line-height: 100rpx; text-align: center; font-size: 44rpx; color: #f8294a; font-weight: 600; } .box-image { height: 1500%; } .start-box { width: 100%; text-align: center; margin: 16rpx 0 8rpx; } .start-box button { width: 290rpx; height: 76rpx; background: url(https://qiniu-image.qtshe.com/20190227startDraw.png) no-repeat center center; background-size: 290rpx 76rpx; margin: 0 auto; } .start-box .start-draw { width: 290rpx; height: 76rpx; background: url(https://qiniu-image.qtshe.com/20190227startDraw.png) no-repeat center center; background-size: 290rpx 76rpx; margin: 0 auto; } 
JS
const app = getApp()
Page({data: {isStart: false, //是否开始抽奖 isDialog: false, //是否显示中奖弹窗 dialogId: 1, //显示第几个中奖弹窗 boxTips: '本场女神码将在3月8日 19:00截止领取', //页面中部文案显示 typeTips: '3月8日20点开奖哦!', boxStatus: ['码', '上', '有', '红', '包'], //五个抽奖默认文案 results: [], //抽中的码 }, onLoad() { this.initData() }, //显隐藏中奖弹窗或规则弹窗等 handleModel() { this.setData({ isDialog: !this.data.isDialog }) }, onShow() {}, //初始化页面数据 initData() { let postData = { url: 'xxx' } app.ajax(postData).then((res) => { if (res.success) { this.setData({ pageVo: res.data, }) } else { util.toast( res.msg || '团团开小差啦,请稍后再试') } }, () => { wx.hideLoading() util.toast( '团团开小差啦,请稍后再试') }) }, //收集FormId 发模版消息用 addFormId(e) { if (e.detail.formId !== 'the formId is a mock one') { //开发者工具上显示这段文案,过滤掉 let formData = { url: 'xxx', data: { formId: e.detail.formId, openId: wx.getStorageSync('openId') || '' } } app.ajax(formData) } }, //开始抽奖 startDraw(e) { //这里可以做下节流 this.addFormId(e) //收集formId let postData = { url: 'xxx' } app.ajax(postData).then((res) => { if (res.success) { this.setData({ isStart: true, results: res.data.result.split(','), //假如后端返回[1,2,3,4,5] dialogId: res.data.special ? 3 : 2 //3为彩蛋状态,2为普通状态 }) } else { util.toast(res.msg || '团团开小差啦,请稍后再试') } }, () => { wx.hideLoading() util.toast( '团团开小差啦,请稍后再试') }) }, onShareAppMessage() { return { title: '码上有红包!点我瓜分10万女神节礼金!', path: '/activity/xxx/xxx', imageUrl: 'https://qiniu-image.qtshe.com/20190227goddess-share.png' } } }) 

最后完整的实现效果在这里:
点我查看完整的视频效果

注意两个点:

  • 旋转的背景图是雪碧图。我这里用到的是这张(https://qiniu-image.qtshe.com/20181113wheels.png)可供参考
  • 控制好图的位移单位,需要计算下,这样才可以让后端返回的值与你的图想匹配。我这里是15个icon所以计算方式如下
<view class="box-image" style=" background: url('https://qiniu-image.qtshe.com/20181113wheels.png'); background-position-y: {{isStart ? ((16 - item) * 100) + 1500 + 'rpx' : 0}}; background-size: 100% 100%; transition-property: {{isStart ? 'all' : 'none'}}; transition-delay: {{(index + 1) * 100 + 'ms'}}; transition-duration: 3.5s;"> </view> 

这里可以封装成自定义组件,传入图片以及数量即可。后面如果有再用到 我会封装下再发出来。

最后说下弹窗显示的图的匹配方法,根据图片大小计算,比较麻烦:
wxml

<view class="ci-wrapper"><view wx:if="{{icontype ==='nomal'}}" class="icon-default icon-nomal" style=" background-position-y: {{(-24 - 117.86 * (typeId - 1)) + 'rpx'}};"></view> <view wx:else class="icon-default icon-fade" style=" background-position-y: {{(-20 - 110.73 * (typeId - 1)) + 'rpx'}}; "></view> </view> 

wxss

.ci-wrapper {
}
.icon-default {width: 70rpx; height: 70rpx; background-repeat: no-repeat; } .icon-nomal { background-image: url(https://qiniu-image.qtshe.com/20181113wheels.png); background-position-x: -17rpx; background-size: 100rpx 1768rpx } .icon-fade { background-image: url(https://qiniu-image.qtshe.com/20181113wheels_fade.png); background-size: 110rpx 1661rpx; background-position-x: -18rpx; } 

Js

Component({properties: {icontype: {type: String,value: "nomal"},iconid: { type: Number, value: 1, observer(newVal, oldVal) { this.setData({ typeId: newVal }); } } }, data: { nomalOrigin: { x: -17, y: -24 }, fadeOrigin: { x: -17, y: -24 }, typeId: 1 } }) 

以上就是一个完整小程序的tigerDraw实现方案,有什么优化点大家可以指出来,后续会整理一下出个文件拷贝就可使用。

这里写了个代码片段 可以直接导入使用

https://developers.weixin.qq.com/s/1k5eSnmh7z72

青团社招聘:
招聘岗位:资深前端开发工程师

简历投递到:hr@qtshe.com || haochen@qtshe.com

职位描述:

1、建设工具、提炼组件、抽象框架,促进前端工程化、服务化,持续提升研发效率,保障线上产品质量

2、构建H5/PC应用基础设施,主导建设前端各种发布/监控等平台,指导落实解决方案

3、持续优化前端页面性能,维护前端代码规范,钻研各种前沿技术和创新交互,增强用户体验、开拓前端能力边界

转载于:https://www.cnblogs.com/Mcy1358781719/p/10653224.html

小程序抽奖老虎.机实现原理相关推荐

  1. 微信小程序抽奖 简单功能实现

    抽奖是一种常见的互动活动,在微信小程序中也有很多不同的实现方式.以下是一份简单的微信小程序抽奖源码,供参考:在 wxml 文件中添加抽奖的页面布局: <view class="cont ...

  2. 答题活动小程序抽奖概率实现方案分享

    答题活动小程序抽奖概率实现方案分享 答题活动小程序抽奖概率实现方案分享 ~ 首先写这篇文章一方面为了消化今天学到的抽奖概率方案,另一方面呢,也为了梳理思路,做出权衡,希望在写完这篇文章的时候,能确定该 ...

  3. 微信按钮android代码实现原理,微信小程序button标签open-type实现原理

    这篇文章主要介绍了微信小程序button标签open-type属性原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 open-type (微信 ...

  4. 简单的小程序实现ATM机操作

    简单的小程序实现ATM机操作 代码如下: package Day06; import java.util.Scanner; public class TestAccount { public stat ...

  5. java窗口小程序atm_简单的小程序实现ATM机操作

    简单的小程序实现ATM机操作 代码如下: package Day06; import java.util.Scanner; public class TestAccount { public stat ...

  6. PHP抽奖小程序/微信红包封面抽奖小程序/抽奖小程序开源源码

    PHP抽奖小程序源码,微信红包封面抽奖小程序,全开源.带流量主(需要自行替换代码),独立后台,亲测完美可用. 下载 PHP抽奖小程序/微信红包封面抽奖小程序/抽奖小程序开源源码 亲测截图:

  7. 微信小程序抽奖插件分享

    微信小程序开发抽奖功能分享 小程序抽奖插件github地址 该网站有这么多示例可以选择 下面演示编写如何在微信小程序中使用 1.先找到小程序项目的根目录,看是否有package.json文件,如果没有 ...

  8. 微信小程序使用真机或开发工具进行http请求开发测试亲测有效

    微信小程序使用真机或开发工具进行http请求开发测试 1使用微信开发这工具进行http请求的配置 2:真机进行http请求 微信开发这平台要求上线微信小程序配置的合法域以及网络请求名必须是https, ...

  9. 微信知识付费小程序梦想贩卖机v2-1.0.67源码下载+无限裂变

    小程序说明: 微信小程序梦想贩卖机V2-1.0.67无限商用多开源码 小程序知识变现功能模块 商用多开版 官方原版加密 无须授权,可无限开 一键上传到微信公众平台前端. 下载地址: 去体验一番吧: 实 ...

最新文章

  1. 【PHP】 debian apt 安装PHP7.1 安装composer
  2. 重庆邮电大学发布2021年最新小样本目标检测综述
  3. 洛谷P4322 最佳团伙(树上dp)
  4. java连接mongodb的jar包_Java实战之管家婆记账系统(1)——项目简述
  5. 华为交换机实操系列(资源)
  6. 【Hive】数据导入方法
  7. Tomcat乱码解决方法
  8. java论文致谢_JAVA语言课程设计论文致谢范文
  9. matlab RFID解码,UHF RFID编码之TPP编码
  10. 男人一生三块田,你不耕别人替你耕...
  11. 【开餐馆】 动态规划
  12. android的图形旋转与点内判断
  13. visudo精确用户赋权与sudo日志跟踪
  14. 100道Java并发和多线程面试题
  15. ZigBee Z-Stack 4.02 基本网络参数设置
  16. 中点方法、改进欧拉及Heun方法
  17. 计算机文化基础作业5000字,《计算机文化基础》作业(完成版)-20210413191226.docx-原创力文档...
  18. VBS弹出选择打印机对话框
  19. 域名快速备案的8大攻略
  20. 中标麒麟V7软件源配置

热门文章

  1. 桃李教育 高中计算机教师,一名信息技术老师的立德树人情怀~
  2. win7需要计算机管理员权限,win7管理员权限如何获得
  3. 判断全角空格和半角空格
  4. NOIP2011 聪明的质检员 - 前缀和 - 二分
  5. 从质检员到游戏测试工程师,我如何拿下月薪8k+的工作
  6. python数据收集整理教案_(完整版)《数据收集整理(例1)》教案
  7. 数据库的统计数据——sysstat
  8. python3无损资源储存,py文件内可以带任何资源
  9. html css ios系统字体,让iOS在CSS中选择系统字体Helvetica Neue或San Francisco
  10. 关于 未能加载文件或程序集“”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 的解决办法