JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)

我将详细讲解“JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)”,并给出两个示例说明。

JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)

前言

上一篇文章已经介绍了JavaScript实现跑马灯抽奖活动的基本思路和代码,在这篇文章中,我们将分析、优化并完善之前的代码。接下来我们将介绍具体的步骤。

代码优化

1. 变量申明

原来的代码中,所有的变量都是使用var声明的。但是var是在函数中申明变量的,会存在变量提升的问题。所以优化的第一步是使用let和const来代替var,确保变量只在需要使用的代码块内部定义。

2. 代码简化

原来的代码在每次转动时都需要重新计算距离,这样会增加代码的复杂度和运行时间。我们可以将转动距离提前进行预处理,避免重复计算。

同时,我们可以将一些重复代码进行封装,使代码更加简洁易读。

3. 细节优化

在实际使用中,用户可能会连续多次点击开始按钮,这样会导致每个跑马灯都在不停地旋转,造成资源浪费。我们可以添加一些判断措施,确保每次只有一个跑马灯在旋转。

完整代码

下面是优化后的完整代码:

const lottery = document.querySelector(".lottery");
const startBtn = document.querySelector(".start-btn");

startBtn.addEventListener("click", () => {
  if (lottery.classList.contains("active")) return; // 判断是否已经在旋转

  const prizes = ["电视", "手机", "平板电脑", "电饭煲"];
  const prizeIndex = Math.floor(Math.random() * prizes.length);
  const prize = prizes[prizeIndex];

  lottery.classList.add("active");

  let rotateCount = 0;
  const rotateUnit = 45; // 每次旋转的角度
  const rotateNum = 8; // 旋转次数
  const totalAngle = rotateNum * 360 + prizeIndex * rotateUnit; // 总的旋转角度

  for (let i = 0; i < 4; i++) {
    const list = lottery.querySelector(`.list-${i}`);
    list.style.transform = `rotate(${totalAngle}deg)`;
  }

  setTimeout(() => {
    lottery.classList.remove("active");
    alert(`恭喜你获得了${prize}`);
  }, 4000);
});

示例说明

示例一

在原来的代码中,每次旋转时都需要重新计算距离。下面是优化前的代码:

const rotate = (index, deg, speed, timer) => {
  const lottery = document.querySelector(".lottery");
  const lists = lottery.querySelectorAll(".list");
  const distance = index * avgDeg - deg; // 计算距离
  let speedMod = speed;

  clearInterval(timer);

  timer = setInterval(() => {
    if (speedMod > 0 && distance < 0) {
      // 是否需要旋转到下一个转盘
      distance += 360;
    } else if (speedMod < 0 && distance > 0) {
      // 是否需要旋转到上一个转盘
      distance -= 360;
    }
    deg += speedMod;

    if (Math.abs(distance - speedMod) < Math.abs(speedMod)) {
      // 最后一步旋转到奖品
      deg += distance;
      clearInterval(timer);
    }

    distance -= speedMod;
    speedMod *= 0.98; // 加速度递减
    speedMod = speedMod < 0.1 ? 0.1 : speedMod; // 最小速度为0.1

    lists.forEach((list, i) => {
      const itemDeg = avgDeg * i;
      list.style.transform = `rotate(${deg + itemDeg}deg)`;
    });
  }, 10);

  return timer;
};

可以看到,每次计算距离的代码比较麻烦。我们可以在代码中预处理需要旋转的角度,避免重复计算。下面是优化后的代码:

const rotate = (index, deg, speed, timer) => {
  const lottery = document.querySelector(".lottery");
  const lists = lottery.querySelectorAll(".list");
  let speedMod = speed;

  clearInterval(timer);

  timer = setInterval(() => {
    deg += speedMod;
    rotateCount++;

    if (rotateCount >= rotateNum && (deg - totalAngle) % 360 == 0) {
      clearInterval(timer);
      rotateCount = 0;
      lottery.classList.remove("active");
      alert(`恭喜你获得了${prize}`);
      return;
    }

    speedMod *= 0.98;
    speedMod = speedMod < 0.1 ? 0.1 : speedMod;

    lists.forEach((list, i) => {
      const itemDeg = i * rotateUnit;
      list.style.transform = `rotate(${deg + itemDeg}deg)`;
    });
  }, 10);

  return timer;
};

示例二

在实际使用中,用户可能会连续多次点击开始按钮,这样会导致每个跑马灯都在不停地旋转,造成资源浪费。我们可以添加一些判断措施,确保每次只有一个跑马灯在旋转。下面是添加判断措施后的代码:

const lottery = document.querySelector(".lottery");
const startBtn = document.querySelector(".start-btn");
let isRunning = false; // 判断是否正在旋转

startBtn.addEventListener("click", () => {
  if (isRunning) return; // 判断是否已经在旋转

  isRunning = true;

  const prizes = ["电视", "手机", "平板电脑", "电饭煲"];
  const prizeIndex = Math.floor(Math.random() * prizes.length);
  const prize = prizes[prizeIndex];

  lottery.classList.add("active");

  let rotateCount = 0;
  const rotateUnit = 45; // 每次旋转的角度
  const rotateNum = 8; // 旋转次数
  const totalAngle = rotateNum * 360 + prizeIndex * rotateUnit; // 总的旋转角度

  for (let i = 0; i < 4; i++) {
    const list = lottery.querySelector(`.list-${i}`);
    list.style.transform = `rotate(${totalAngle}deg)`;
  }

  setTimeout(() => {
    isRunning = false;
    lottery.classList.remove("active");
    alert(`恭喜你获得了${prize}`);
  }, 4000);
});

在上面的代码中,我们添加了一个isRunning变量来判断是否正在旋转,如果已经在旋转了,就不执行后续操作。这样就可以避免资源浪费了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现跑马灯抽奖活动实例代码解析与优化(二) - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 在Webpack中用url-loader处理图片和字体的问题

    在Webpack中使用url-loader处理图片和字体文件,可以方便地将这些文件打包到生成的最终bundle文件中,从而加快页面的加载速度。下面是一份完整的攻略,包括安装必要的loader、配置Webpack以及两个例子。 安装必要的loader 首先,为了使用url-loader,我们需要安装它。可以使用npm或者yarn。 使用npm: npm ins…

    JavaScript 2023年5月19日
    00
  • javascript 通用loading动画效果实例代码

    对于这个问题,我可以提供以下完整攻略: JavaScript 通用 Loading 动画效果实例代码 什么是 Loading 动画 Loading 动画指的是在某些长时间操作(例如网络请求或计算)期间,为了让用户知道应用程序正在运行中,而在屏幕上呈现的动画效果。通常采用旋转、脉冲或进度条等形式。 如何实现 Loading 动画 HTML & CSS …

    JavaScript 2023年6月10日
    00
  • JavaScript中的History历史对象

    当我们在浏览器中访问一个网页时,浏览器会自动记录下访问过的历史记录,这些历史记录在浏览器中可以用JavaScript的History对象进行访问和操作。下面是JavaScript中的History对象的详细讲解及相关示例说明。 History对象 History对象用来操作浏览器的历史记录,它保存着用户在当前窗口打开的所有页面的URL信息,可以通过Histo…

    JavaScript 2023年5月27日
    00
  • 如何使用JS中的webWorker

    下面是有关如何使用JS中的webWorker的完整攻略。 什么是Web Worker? Web Worker是JavaScript技术的一部分,它提供了一种在后台运行JavaScript代码的方法,该方法不会影响用户界面的响应能力。Web Worker类似于多线程,它可以在后台执行计算密集型的任务,而不会影响到主线程和用户界面。 如何创建及使用Web Wor…

    JavaScript 2023年5月28日
    00
  • 在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题

    在一个JS文件里远程调用jQuery.js会在IE8下出现一个奇怪问题,这个问题是由于jQuery.js本身的一个问题导致的。具体的解决方法如下: 问题原因 在IE8浏览器中,如果将jQuery.js脚本文件远程加载到一个JS文件中,会发生jQuery.js文件无法执行的问题。这是由于IE8浏览器的安全设置对ActiveXObject对象的访问做了限制,导致…

    JavaScript 2023年5月27日
    00
  • 7个令人惊讶的JavaScript特性详解

    7个令人惊讶的JavaScript特性详解 介绍 这篇文章将会介绍七个我们可能不知道或很少使用的有趣的JavaScript特性。这些特性可能会帮助你更好地理解JavaScript的本质以及如何更好地使用它。 1. 默认参数 默认参数允许我们在一个函数的参数列表中为某些参数定义默认值。如果没有传递值给这个参数,它将使用默认值。 function sayHell…

    JavaScript 2023年5月27日
    00
  • JavaScript中将值转换为字符串的五种方法总结

    我将为您详细讲解JavaScript中将值转换为字符串的五种方法总结。 方法一:使用toString()方法将值转换为字符串 所有的JavaScript数据类型都具有toString()方法来转换为字符串。这种方法是最常用的将值转换为字符串的方法。 示例: var num = 10; var str = num.toString(); console.log…

    JavaScript 2023年5月28日
    00
  • javascript工具库代码

    让我详细讲解一下JavaScript工具库代码的完整攻略。 什么是JavaScript工具库代码? JavaScript工具库代码是已经封装好的JavaScript函数或类,它们帮助我们实现一些常见业务场景和功能,节省了开发者自行编写这些功能代码的时间和精力,提高了开发效率。 如何使用JavaScript工具库代码? 使用JavaScript工具库代码可以通…

    JavaScript 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部