资讯专栏INFORMATION COLUMN

转盘抽奖-- 自己手撸

gaara / 3170人阅读

摘要:自己很菜,不可否认。所以上周日试试水,看看自己能否写个圆盘抽奖的。效果图代码外部圆内部园请输入外数字开始基础旋转的圆以自己的宽度的一半为,以父盒子的高度一半为,作为旋转点。

自己很菜,不可否认。
所以上周日试试水,看看自己能否写个圆盘抽奖的demo。
// github L6zt
开发思路

布局 css rotate 布局;

抽奖过渡效果,采用css3 transition;

动态计算抽奖结束时的角度,赋值给待选择的元素。

效果图

代码

</>复制代码

  1. 1

  2. 2

  3. 3

  4. a

  5. b

  6. c

  7. d

  8. e

  9. f

  10. 开始

</>复制代码

  1. * {
  2. margin: 0;
  3. }
  4. .rotate {
  5. position: relative;
  6. margin: 0 auto;
  7. width: 400px;
  8. height: 400px;
  9. text-align: center;
  10. color: #fff;
  11. font-size: 50px;
  12. border-radius: 50%;
  13. background: antiquewhite;
  14. }
  15. .tn {
  16. transition: all 3s cubic-bezier(.11,.77,.2,.94);
  17. transform-origin: 50% 50%;
  18. }
  19. .out-circle {
  20. position: absolute;
  21. width: 300px;
  22. height: 300px;
  23. left: 0;
  24. right: 0;
  25. top: 0;
  26. bottom: 0;
  27. margin: auto;
  28. }
  29. /*基础旋转的圆*/
  30. .out-circle p {
  31. position: absolute;
  32. display: block;
  33. margin: 0 auto;
  34. left: 0;
  35. right: 0;
  36. width: 30px;
  37. height: 30px;
  38. line-height: 30px;
  39. background: red;
  40. /*以自己的宽度的一半 为 x,以父盒子的高度一半 为 y, 作为旋转点。*/
  41. transform-origin: 15px 150px;
  42. border-radius: 50%;
  43. font-size: 16px;
  44. }
  45. .inner-circle {
  46. position: absolute;
  47. width: 200px;
  48. height: 200px;
  49. left: 0;
  50. right: 0;
  51. top: 0;
  52. bottom: 0;
  53. margin: auto;
  54. }
  55. /*基础旋转的圆*/
  56. .inner-circle p {
  57. position: absolute;
  58. display: block;
  59. margin: 0 auto;
  60. left: 0;
  61. right: 0;
  62. width: 30px;
  63. height: 30px;
  64. line-height: 30px;
  65. background: #4eff00;
  66. transform-origin: 15px 100px;
  67. border-radius: 50%;
  68. font-size: 16px;
  69. }
  70. .p11 {
  71. transform: rotate(0deg);
  72. }
  73. .p12 {
  74. transform: rotate(60deg);
  75. }
  76. .p13 {
  77. transform: rotate(120deg);
  78. }
  79. .p14 {
  80. transform: rotate(180deg);
  81. }
  82. .p15 {
  83. transform: rotate(240deg);
  84. }
  85. .p16 {
  86. transform: rotate(300deg);
  87. }
  88. .p1 {
  89. transform: rotate(0deg);
  90. }
  91. .p2 {
  92. transform: rotate(120deg);
  93. }
  94. .p3 {
  95. transform: rotate(240deg);
  96. }
  97. a {
  98. padding: 2.5px 10px;
  99. background: #0ebeff;
  100. border-radius: 5px;
  101. color: #fff;
  102. text-decoration: none;
  103. }
  104. .start-game {
  105. position:absolute;
  106. top: 20px;
  107. left: 20px;
  108. }

</>复制代码

  1. (function () {
  2. let deg = 0;
  3. // 基础角度
  4. let baseDeg = 120;
  5. let $input = $("#num");
  6. // 多少个旋转点
  7. let blocks = 360 / baseDeg;
  8. let k = null;
  9. let flag = false;
  10. const $rotate = $(".rotate");
  11. // 0 1 2
  12. $("a").on("click", function () {
  13. var num = $input.val();
  14. // 当前旋转 位置
  15. var curLc = deg % 360 / 120;
  16. // 待旋转的角度
  17. deg = deg + 4 * 360 + (2*blocks - num - curLc) * baseDeg;
  18. if (flag === true) {
  19. return false;
  20. }
  21. flag = true;
  22. clearInterval(k);
  23. k = null;
  24. $rotate.addClass("tn");
  25. $rotate.css({
  26. "transform": `rotate(${deg}deg)`
  27. });
  28. // 监听过渡结束效果!--没加入兼容性
  29. $rotate.on("transitionend", function () {
  30. flag = false;
  31. $(this).removeClass("tn");
  32. let timeK = null;
  33. // 抽奖后 圆盘动旋转
  34. setTimeout(() => {
  35. k = timeK = setInterval( () => {
  36. var temDeg = deg.toString();
  37. if (k !== timeK) {
  38. clearInterval(timeK);
  39. return false;
  40. }
  41. if ($rotate.hasClass("tn")) {
  42. return false;
  43. }
  44. // 一下代码 正则是为了解决 js 小数点 计算 问题。
  45. temDeg = (/./).test(temDeg) ? temDeg.replace(/.d+/, function ($1) {
  46. var result = $1.length === 2 ? `${$1.substr(1)}0`: `${$1.substr(1)}`;
  47. return result
  48. }) : `${temDeg}00`;
  49. temDeg = parseInt(temDeg);
  50. temDeg += 5;
  51. temDeg = temDeg.toString().split("");
  52. temDeg.splice(temDeg.length - 2, 0, ".");
  53. temDeg = temDeg.join("");
  54. deg = parseFloat(temDeg);
  55. $(this).css({
  56. "transform": `rotate(${deg}deg)`
  57. });
  58. }, 13)
  59. }, 1000);
  60. });
  61. })
  62. })()

demo地址

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96643.html

相关文章

  • 九宫格抽奖--手撸代码

    摘要:总是看到类似的九宫格抽奖效果后来想自己手撸一个试一试吧。多多尝试万一成功了呢先来总结一下效果类似与跑马灯效果,闪动效果先快后慢。 总是看到类似的九宫格抽奖效果,后来想自己手撸一个试一试吧。(多多尝试,万一成功了呢 github L6zt) 先来总结一下效果,类似与跑马灯效果,闪动效果先快后慢。代码解析如下所示:代码 0 ...

    zhou_you 评论0 收藏0
  • 九宫格抽奖--手撸代码

    摘要:总是看到类似的九宫格抽奖效果后来想自己手撸一个试一试吧。多多尝试万一成功了呢先来总结一下效果类似与跑马灯效果,闪动效果先快后慢。 总是看到类似的九宫格抽奖效果,后来想自己手撸一个试一试吧。(多多尝试,万一成功了呢 github L6zt) 先来总结一下效果,类似与跑马灯效果,闪动效果先快后慢。代码解析如下所示:代码 0 ...

    ChanceWong 评论0 收藏0
  • canvas之转盘抽奖

    摘要:最近工作中重构了抽奖转盘,给大家提供一个开发转盘抽奖的思路需求转盘根据奖品数量不同而有变化目录结构由于业务需要所以开发了两个版本抽奖,和,不过部分只能替换图片,没有功能逻辑。 最近工作中重构了抽奖转盘,给大家提供一个开发转盘抽奖的思路 需求 1、转盘根据奖品数量不同而有变化 2、canvas 目录结构 showImg(https://segmentfault.com/img/bVbwL...

    _ang 评论0 收藏0
  • Vue+CSS3实现转盘抽奖

    摘要:最近有个转盘抽奖的需求,搜了一下现有的轮子,有的是用的动画函数实现的,有的是用绘图然后再用高频率的调用旋转方法,前者太老了没法简单移植到项目,后者感觉性能表现可能不会太好。核心思路是用以及实现旋转动画,使用和绘制出定位较为精确的轮盘奖项。 最近有个转盘抽奖的需求,搜了一下现有的轮子,有的是用jQuery的动画函数实现的,有的是用canvas绘图然后再用高频率的setTimeout调用旋...

    mj 评论0 收藏0

发表评论

0条评论

gaara

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<