案例总结【抽奖功能实现】

在此记录一些小的功能demo实现过程的记录。**这些demo都是根据网上收集或者自己突发奇想实现的功能。

前天实现了一个简单的抽奖功能,今天来复个盘。

image

这个功能很简单,就是点击之后,轮盘旋转,旋转停止弹出抽奖结果。我从两个角度重新写了一遍,一个是面向过程的方法,一步一步实现,这种偏向正常人的思维。再一个实现方法是面向对象的方法,这个对我来说也是比较新鲜的,以前虽然听过,但很少实操过。


第一个面向过程编程的方式中,对于我来说重点有以下几个:

  1. 点击让轮盘随机旋转,旋转几圈,角度怎么随机?

  2. 旋转通过什么实现?

  3. 如何判断轮盘停止之后获得什么奖项?

实现过程:

第一个问题通过Math.random()来实现;

第二个问题通过css3的旋转属性实现;

第三个问题通过if else判断旋转角度即可,再通过函数封装一下就好了;

var deg = Math.random() * 360;

难点:

  1. 点击多次就有问题,自己知道要等旋转结束才能再点击

  2. 什么时候判断旋转结束

  3. 如果别人点击多次如何避免出现问题

解决:

  1. 通过一个监听事件WebkitTransitionEnd监听轮盘旋转结束,这个都忘记好久了。

  2. 通过给程序加锁,可以避免多次点击多次产生执行事件,导致错误。也就是在锁开的点击就生效,点击事件执行,然后锁立马关上,等到监听事件监听到轮盘旋转结束,再打开锁。

最后还有一个问题,就是第二次点击,轮盘不会旋转设置好的8圈,而是转一圈以内的角度。这个问题在于,第一次旋转结束的状态角度跟第二次随机生成的状态角度相差不过360度,比如:第一次随机旋转8圈+45度 停止,第二次随机了一个8圈+90度,那么两次的度数相差45度,对于旋转属性来说,第二次变换只想对于上一次的状态变化,所以并不会旋转8圈,而是转45度。

所以在每次旋转结束,都要隐式的把轮盘的状态归零。

ele.style.transform = `rotate(${deg}deg)`;

用面向对象的方法实现有几点要记录的:

整体思路:

  1. 轮盘对象

  2. 按钮对象

  3. 轮盘有监听旋转停止功能

  4. 轮盘有旋转的功能

  5. 轮盘有奖项属性,并且有判断奖项的功能

  6. 轮盘有初始角度

  7. 轮盘有旋转结束的时间点

  8. 按钮有被点击的功能

  9. 按钮点击有生成旋转角度的功能

  10. 按钮有控制轮盘是否符合旋转要求的能力(判断轮盘是否旋转结束)

在实现过程中,除了有些地方需要记录this,写法上跟面向过程有些不一样,其他的功能都跟面向过程实现方法一致。只是要多熟悉一下这种感觉,不过确实挺好。

最后通过一个立即执行函数封闭一下作用域,不让外界影响程序。并立即执行函数中传递了window,绑定了一个对象,把它暴露出去,这个对象是外界定制轮盘旋转多少圈的,如果需要也可以定制一些其他功能需求。

image
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、简历准备 1、个人技能 (1)自定义控件、UI设计、常用动画特效 自定义控件 ①为什么要自定义控件? Andr...
    lucas777阅读 10,637评论 2 54
  • 通过前面几节课的基础铺垫,本节课我们将正式进入传感器部分——距离传感器的知识学习,但是在正确运用传感器设计程...
    果子_734d阅读 3,474评论 0 0
  • 今日阅读的是《非暴力沟通》。 通过全书的阅读获得感受如下。 1.使用暴力的人其实是因为他们内心的宁静遭到就破坏,所...
    番茄加点酱阅读 4,302评论 0 1
  • 这次要一人在郴州度过两天一夜。马克思说人是一切社会关系的总和?这话我想是没错的,一个人离开人群,最多只是一只动物,...
    更向远行阅读 1,670评论 1 1

友情链接更多精彩内容