【javascript】九宫格抽奖组件设计
一些主要点
1. 转圈的顺序(顺时针或者逆时针);
2. 转圈的速率(从慢到快再到慢);
3. 位置的问题(下一次抽奖的起始位置是上一次抽奖的结束位置);
4. 转圈的圈数或者移动的次数。
基本原理
1. 抽奖的过程其实就是通过不断的改变 dom(通常为 li)的索引值,来达到移动的效果(比如 8 个奖项,索引值的变化如下 0 -> 1, 1 -> 2, ... , 6 -> 7 , 7 -> 0),所以 dom 的排版(绝对定位)就显得很重要了;
2. 对于移动的速度其实就是 dom 切换的快慢,在 js 中,我们可以通过定时器 setTimeout 的执行时间来控制移动的速度;
3. 移动速度的增减;
4. 什么时候移动结束。
如何写代码
外部如何使用
1. 首先通过构造函数实例化,并且在实例化时传入相关参数(一般都为 object)(比如 var lottery = new Lottery(opts)),来实现该组件的初始化;
2. 组件初始化后,还需要有个方法来执行抽奖的过程(比如 lottery.start());
3. 当然我们还需要告诉组件中的是什么奖励(一般都是接口调用返回给前端),即中奖的位置在哪里,相当于奖励的索引(比如 lottery.prize = 1)。
实例化参数 opts
- opts.index 当前移动到哪个位置,起点位置,默认第一个(即容器的第一个子元素)
- opts.length 奖励个数,默认 8 个
- opts.speed 初始移动速度
- opts.maxSpeed 移动最大速度,数值越小,移动越快
- opts.minSpeed 移动最小速度,数值越大,移动越慢
- opts.base 基本移动次数,即小于基本转动次数时,速度递增,大于该数值,速度递减
- opts.totals 总移动次数,即大于该数值时,转动即将结束
- opts.moveTo 移动的过程,有两个参数(before 和 after),before 是移动前的索引值,after 是移动后的索引值,可以在这个方法中自己设置动画效果,比如 css3
- opts.callback 移动结束之后的回调
内部实现
'use strict';
module.exports = function Lottery(opts) {
this.index = opts.index || 0;
this.speed = opts.speed || 60;
this.maxSpeed = opts.maxSpeed || 40;
this.minSpeed = opts.minSpeed || 250;
this.base = opts.base || 3;
this.totals = opts.totals || 12;
this.length = opts.length || 8;
this.prize = -1; // 中奖位置,需要外部来更新
var self = this;
var speed = self.speed;
var timer = null; // 定时器 ID
var counts = 0; // 移动次数计数
// 在移动的过程中,其实就是索引值的改变,比如 0 -> 1, 1 -> 2, ... , 6 -> 7 , 7 -> 0
var move = function() {
var index = self.index;
var len = self.length;
var before = self.index; // 当前
index += 1; // 下一个
// 当索引到最后一个时,下一个索引就是第一个
if (index > len - 1) {
index = 0;
}
opts.moveTo && opts.moveTo(before, index);
self.index = index;
};
// 外部调用抽奖方法
this.start = function() {
move();
counts += 1;
if (counts > this.totals && this.prize === this.index) {
clearTimeout(timer);
counts = 0;
speed = this.speed;
this.prize = -1;
opts.callback && opts.callback();
} else {
if (counts < this.base) {
speed -= 10;
} else {
if (counts > this.totals) {
speed += 60;
} else {
speed += 30;
}
}
speed = speed < this.maxSpeed ? this.maxSpeed : (speed > this.minSpeed ? this.minSpeed : speed);
timer = setTimeout(function() {
self.start();
}, speed);
}
};
};
扩展
1. 不限九宫格排列的抽奖;
2. 可以满足圆盘式指针旋转的抽奖。
【javascript】九宫格抽奖组件设计的更多相关文章
- atitit.抽奖活动插件组件设计--结构设计and 抽奖流程建模
atitit.抽奖活动插件组件设计--结构设计and 抽奖流程建模 1. 组件结构 1 2. startDraw 开始抽奖流程建模 1 3. 抽奖算法 2 作者:: 老哇的爪子 Attilax 艾龙, ...
- HTML5拓扑图形组件设计之道(一)
HT for Web(http://www.hightopo.com/guide/readme.html)提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表 ...
- Twproject Gantt – 开源的 JavaScript 甘特图组件
Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CSS 皮肤等功能.更重要的是,它是免费开源的. ...
- HT图形组件设计之道(一)
HT for Web简称HT提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表达的我们希望提供:Everything you need to create ...
- xmlplus 组件设计系列之零 - xmlplus 简介
xmlplus 是什么 xmlplus 是博主写的一个 JavaScript 框架,用于快速开发前后端项目. xmlplus 基于组件设计,组件是基本的构造块.评价组件设计好坏的一个重要标准是封装度. ...
- React组件设计
React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...
- React组件设计(转)
React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...
- React组件设计技巧
React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...
- 【Web技术】314- 前端组件设计原则
点击上方"前端自习课"关注,学习起来~ 译者:@没有好名字了译文:https://github.com/lightningminers/article/issues/36,http ...
随机推荐
- Python爱好者社区历史文章列表(每周append更新一次)
2月22日更新: 0.Python从零开始系列连载: Python从零开始系列连载(1)——安装环境 Python从零开始系列连载(2)——jupyter的常用操作 Python从零开始系列连载( ...
- error LNK2001: unresolved external symbol _main
想运行一个网上下载的opengl离屏渲染(渲染到纹理FBO)的程序,然后一直报错 error LNK2001: unresolved external symbol _main 解决了一下午终于弄明白 ...
- java代码发送邮箱验证码与qq邮箱smtp服务
发送邮箱的类封装,在此之前需要一个jar包 javax.mail.jar 下载链接https://github.com/javaee/javamail/releases/download/JAVAM ...
- django之Ajax初识
Ajax准么说是用于Javascript与服务器端进行交互的,我们之前呢没有了解ajax也同样可以完成与服务器的交互,那么ajax的优势在哪里?首先ajax是异步交互的也就是说我们基本不会遇到卡顿现象 ...
- django之简单验证码实现与form表单钩子函数补充
本篇主要讲解简单的验证码实现,验证码使用基本都是找现成的组件来实现,用代码实现这个简单功能主要是了解了解验证码内部的实现. 本篇导航: 五位验证码图示 代码实现 登录验证 Form组件钩子函数补充 一 ...
- shell之磁盘容量检查,配合crontab可以定时清理磁盘
我的做法: !/bin/bashAvailable=`df -k | sed -n 2p | awk '{print $4}'`if [ $Available -eq 0 ];then ...
- mount 命令用法
mount 功能: 加载指定的文件系 统:mount可将指定设备中指定的文件系统加载到 Linux目录下(也就是装载点).可将经常使用的设备写入文件/etc/fastab,以使系 统在每次启动时自动加 ...
- .Net转Java.04.踩到switch的坑
今天线上有个NullPointerException 的异常,我翻了一下代码,抛异常的竟然是switch语句 我有种不祥的预感,本地做了实验 结果是 Java的switch如果传入null值,会抛出 ...
- srs2.0安装问题
原文: https://blog.csdn.net/ddr77/article/details/52511340 编译配置如下 ./configure --disable-all --with-ssl ...
- 卷积神经网络(CNN)代码实现(MNIST)解析
在http://blog.csdn.net/fengbingchun/article/details/50814710中给出了CNN的简单实现,这里对每一步的实现作个说明: 共7层:依次为输入层.C1 ...