最近手头没啥紧要的活儿,就寻思着自己动手搞个轮盘玩玩。也不是要干啥大事儿,就是有时候做活动或者家里小孩儿要个奖励啥的,有个这玩意儿能增加点趣味性。
最初的念头和准备
一开始寻思着用最简单的法子,直接HTML、CSS加上一点点JavaScript就得了。毕竟不是啥火箭科技,对?工具嘛就用我平时顺手的编辑器,浏览器就用Chrome,方便调试。也没想着要多复杂,能转,能停,能显示个结果就行。
画个轮盘的模样
第一步,先把轮盘的底子画出来。我是用CSS画的,主要是用 `border-radius` 弄个圆,然后琢磨着用 `clip-path` 或者一堆 `div` 旋转拼接来搞扇形区域。后来发现还是用SVG画扇形可能更规矩点,不过我CSS熟一些,就硬着用多个楔形 `div` 拼接定位了,每个扇形给个不同的背景色,再把奖品文字写上去,旋转一下,对齐。
这块儿得细致点,不然歪歪扭扭不好看。文字方向也得调整,得让它从圆心向外辐射那样。搞了好一会儿,才把各个扇区 মোটামুটি均匀地分
对了,中心那个轴也得弄还有那个指针,指针我单独用一个 `div` 做的,尖尖的,固定在轮盘的上方或者中心。
让轮盘转起来
静态的画好了,就得让它动起来。这块儿主要靠JavaScript了。
- 绑定点击事件:我先弄了个“开始抽奖”的按钮,给它绑上点击事件。
- 计算停止角度:点击之后,得随机生成一个最终要停下来的角度。比如我有8个奖品,每个占45度,那就生成一个0到360之间的随机度数,再加上几圈的度数,让它能多转几圈看着更刺激。
- 执行旋转动画:我是用CSS的 `transform: rotate()` 配合 `transition` 来实现旋转动画的。JavaScript计算好最终角度后,就给轮盘的元素设置这个旋转角度。`transition` 属性设置一个缓动效果,比如 `ease-out`,这样停止的时候会慢下来,比较自然。
一开始转的时候,那个指针没固定跟着轮盘一起转了,看着就特别傻。后来反应过来,指针是固定不动的,是轮盘在它底下转。或者说,指针是相对于轮盘的父容器固定的。
确定中奖结果
轮盘停下来之后,得知道指针指的是哪个奖品。这个我是这么处理的:
根据轮盘最终旋转的度数,再结合每个扇区占据的角度范围,就能计算出当前指针指向的是哪个扇区。比如第一个奖品在0-45度,第二个在45-90度,以此类推。这里要注意取模运算,因为转了很多圈,实际的有效角度是 `总度数 % 360`。
计算出来之后,就把中奖结果显示在页面上。我还加了个小小的弹窗,提示“恭喜你抽中XXX”。
优化和细节调整
基本功能实现了,就开始捣鼓一些细节:
- 防止重复点击:在轮盘旋转的过程中,得把“开始抽奖”按钮禁用掉,不然连续点,动画就乱了。转完了再启用。
- 奖品配置:一开始奖品是写死在代码里的。后来觉得不方便,就想着能不能动态配置。简单点就直接在JavaScript数组里改,复杂点可以做个输入框啥的,我没搞那么复杂,就预留了数组修改。
- 美化界面:调了调颜色搭配,指针样式,让它看着顺眼点。这个纯粹是个人审美了。
来来回回测试了好几遍。有时候转得太快,有时候停的位置有点偏差,指针指在两个奖品中间线上就尴尬了。所以对每个扇区的边界角度要算得精确点。我就不停地调参数,改代码,直到自己看着觉得马马虎虎还行。
完事后的感受
整个过程下来,也没用啥特别高深的技术。主要就是细心和耐心。从一个简单的想法,到一步步把它实现出来,虽然是个小玩意儿,但捣鼓成功了还是挺有成就感的。以后家里搞活动或者给娃一些小激励的时候,就能派上用场了。
有时候就喜欢这种自己动手丰衣足食的感觉。网上虽然也有现成的轮盘组件或者代码,但自己从头到尾敲一遍,理解更深,也更能体会到其中的乐趣和坑点。
还没有评论,来说两句吧...