【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 ...
随机推荐
- JavaScript基础笔记(一)基本概念
基本概念 一.语法 一)区分大小写 二)标识符 书写规则同Java 三)注释 略 四)严格模式 1.在整个脚本中启用严格模式:在顶部添加 "use strict" 2.指定函数在严 ...
- 冲刺NOIP复习,算法知识点总结
前言 离NOIP还有一个星期,匆忙的把整理的算法补充完善,看着当时的整理觉得那时还年少.第二页贴了几张从贴吧里找来的图片,看着就很热血的.当年来学这个竞赛就是为了兴趣,感受计算机之美的. ...
- 护眼党必备良心app
这几天用电脑用得厉害,眼睛经常感到疲劳,寻思着买个好点的蓝光眼镜.本来已经看上一个100+RMB的“高端”防蓝光眼镜,结果逛知乎发现了这两个app,能直接让电脑和手机屏幕过滤掉蓝光从而有效缓解视觉疲劳 ...
- BZOJ3565 : [SHOI2014]超能粒子炮
若$a\leq 1000$,则整个$f$数列会形成$O(a)$段公差为$a$的等差数列. 否则$a^{-1}\leq 1000$,设$ai+b=f(i)$,那么有$i=a^{-1}f(i)-ba^{- ...
- BZOJ2828 : 火柴游戏
设$f[i][j][k]$表示考虑了前$i$个数字,增加了$j$根火柴,删掉了$k$根火柴是否可能,用bitset加速DP. 然后设$g[i][j]$表示增加了$i$根火柴,删掉了$j$根火柴的最小代 ...
- JS 模仿块级作用域
function outputNumbers(count) { for (var i=0; i<count; i++) { console.log(i); } var i; // 重新声明变量 ...
- JAVA自学笔记07
JAVA自学笔记07 1.构造方法 1) 例如:Student s = new Student();//构造方法 System.out.println(s);// Student@e5bbd6 2)功 ...
- 常见问题2:html+css效果综合整理
1.---文本框提示文字颜色--placeholder属性 <input type="text" placeholder="请输入提示文字" /> ...
- js中的iterable用法
iterable字面意思:可迭代的,可重复的 . 遍历Array可以采用下标循环,遍历Map和Set就无法使用下标.为了统一集合类型,ES6标准引入了新的iterable类型,Array.Map和Se ...
- django之模型层(model)--查询补充及cookie
已经连续写了好几篇django的模型层(model)增删改查的随笔了,没篇大篇幅都是查询相关的操作,可以看出查询在数据的操作中是多么的重要,而本篇最后再补充一点关于关于查询的一些方法,模型层基本的操作 ...