一些主要点

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】九宫格抽奖组件设计的更多相关文章

  1. atitit.抽奖活动插件组件设计--结构设计and 抽奖流程建模

    atitit.抽奖活动插件组件设计--结构设计and 抽奖流程建模 1. 组件结构 1 2. startDraw 开始抽奖流程建模 1 3. 抽奖算法 2 作者:: 老哇的爪子 Attilax 艾龙, ...

  2. HTML5拓扑图形组件设计之道(一)

    HT for Web(http://www.hightopo.com/guide/readme.html)提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表 ...

  3. Twproject Gantt – 开源的 JavaScript 甘特图组件

    Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CSS 皮肤等功能.更重要的是,它是免费开源的. ...

  4. HT图形组件设计之道(一)

    HT for Web简称HT提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表达的我们希望提供:Everything you need to create ...

  5. xmlplus 组件设计系列之零 - xmlplus 简介

    xmlplus 是什么 xmlplus 是博主写的一个 JavaScript 框架,用于快速开发前后端项目. xmlplus 基于组件设计,组件是基本的构造块.评价组件设计好坏的一个重要标准是封装度. ...

  6. React组件设计

    React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...

  7. React组件设计(转)

    React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...

  8. React组件设计技巧

    React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...

  9. 【Web技术】314- 前端组件设计原则

    点击上方"前端自习课"关注,学习起来~ 译者:@没有好名字了译文:https://github.com/lightningminers/article/issues/36,http ...

随机推荐

  1. JAVA实现Word(doc)文件读写

    1.pom.xml依赖 <dependencies> <dependency> <groupId>org.apache.poi</groupId> &l ...

  2. (转)java创建对象的步骤

    关于对象的创建过程一般是从new指令(我说的是JVM的层面)开始的(具体请看图1),JVM首先对符号引用进行解析,如果找不到对应的符号引用,那么这个类还没有被加载,因此JVM便会进行类加载过程.符号引 ...

  3. BZOJ2702 : 金融风暴

    求出离每个点最近的关键点,然后用二维ST表回答正方形最大值. 将关键点分为上下两部分,以上为例: 从上到下依次考虑每一行,记录每一列往上最近的关键点的距离,那么最优决策具有单调性,可以分治求解. 时间 ...

  4. redis(六)

    安装包 到中文官网查找客户端代码 联网安装 sudo pip install redis 使用源码安装 unzip redis-py-master.zip cd redis-py-master sud ...

  5. Dijkstra求次短路

    #10076.「一本通 3.2 练习 2」Roadblocks:https://loj.ac/problem/10076 解法: 次短路具有一种性质:次短路一定是由起点到点x的最短路 + x到y的距离 ...

  6. Android Studio 2.3 解决小米手机调试安装apk失败问题

    在开发者选项里面,拉到底,把miui优化选项去掉就好了. 参考资料 [问题反馈] Android Studio 2.3 在红米note3手机中 调试安装Apk失败

  7. elastic-job详解(一):数据分片

    数据分片的目的在于把一个任务分散到不同的机器上运行,既可以解决单机计算能力上限的问题,也能降低部分任务失败对整体系统的影响.elastic-job并不直接提供数据处理的功能,框架只会将分片项分配至各个 ...

  8. JavaScirpt对象原生方法

    Object.assign() Object.assign()方法用于合并对象,只会合并可枚举的属性 const obj1= {a: 1} const obj2 = Object.assign({}, ...

  9. WPF模拟键盘输入和删除

    private void ButtonNumber_Click(object sender, RoutedEventArgs e) { Button btn = (Button)sender; str ...

  10. 国密SM3算法在linux和windows平台结果不一致问题

    什么是sm3,是一种类似于sha256的哈希算法,是咱们国家的哈希标准算法: 最近在使用sm3算法时,同样的一份数据,调用同样的sm3接口,发现得到的结果是不一样的: 那么在应用过的过程中,如果同样的 ...