基于Html+CSS+JS实现手动放烟花效果

yizhihongxing

下面我将为您详细讲解基于Html+CSS+JS实现手动放烟花效果的完整攻略。

需求分析

为了实现手动放烟花效果,需要实现以下功能:

  1. 通过点击页面添加烟花;
  2. 每个烟花需要有不同的颜色和大小;
  3. 烟花需要能够在页面上随机位置爆炸,并播放烟花爆炸动画;
  4. 烟花爆炸效果需要自动消失,不占用页面空间;
  5. 页面需要考虑到不同的屏幕大小,能够自适应。

技术实现

HTML

在 HTML 中,我们需要先创建一个空的容器,用于放置烟花。这个容器可以是一个 div,例如:

<div id="fireworks-container"></div>

CSS

对于 CSS,我们可以给烟花容器设置一些基本样式,例如:

#fireworks-container {
  width: 100%;
  height: 100%;
  position: fixed;
  top: 0;
  left: 0;
  z-index: 9999;
  background-color: rgba(0, 0, 0, 0.9);
}

这里采用了 fixed 定位,使容器始终位于页面顶部,而 background-color 则是用来遮盖页面内容,突出烟花效果。接下来,我们需要创建烟花的样式。

.firework {
  position: absolute;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  transform: translate(-50%, -50%);
  animation: explode 1s ease-out;
  animation-fill-mode: forwards;
}

@keyframes explode {
  to {
    width: 200px;
    height: 200px;
    opacity: 0;
  }
}

这段代码定义了烟花的样式,给它们设置了位置、大小、边框圆角。接下来通过 keyframes 创建烟花爆炸动画,其中 to 关键字表示在动画结束时的状态。可以看到,最终的状态是将烟花放大并透明度降至零,直至消失。

JavaScript

在 JavaScript 中,我们需要编写代码实现烟花的生成、爆炸和消失。

生成烟花

首先,我们需要在页面中添加点击事件,当用户点击时就会在页面上添加一个烟花。

document.addEventListener('click', function(event) {
  createFirework(event.clientX, event.clientY);
});

在点击事件中,我们调用了 createFirework 函数,传入事件的坐标参数,例如:

function createFirework(x, y) {
  var firework = document.createElement('div');
  firework.className = 'firework';
  firework.style.left = x + 'px';
  firework.style.top = y + 'px';
  firework.style.backgroundColor = getRandomColor();
  firework.style.animationDuration = getRandomNumber(1, 2) + 's';

  document.getElementById('fireworks-container').appendChild(firework);

  // 等待烟花爆炸结束后再将其从页面移除
  setTimeout(function() {
    firework.parentNode.removeChild(firework);
  }, 2000);
}

createFirework 函数实现了烟花的生成,它使用了 createElement 创建一个 div,设置了其类名(即之前定义的 firework)、位置和颜色。这里的 getRandomColor 和 getRandomNumber 是辅助函数,用来随机生成颜色和大小。最后,我们将烟花加入到容器中,通过 setTimeout 来控制烟花爆炸动画的时间,并在爆炸结束后将其从页面中移除。

随机生成烟花颜色和大小

function getRandomNumber(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

function getRandomColor() {
  var r = getRandomNumber(0, 255);
  var g = getRandomNumber(0, 255);
  var b = getRandomNumber(0, 255);

  return 'rgb(' + r + ', ' + g + ', ' + b + ')';
}

getRandomNumber 和 getRandomColor 都是简单的取随机数和生成随机颜色的函数。

烟花爆炸动画

最后是烟花爆炸动画的实现。我们已经在 CSS 中定义了爆炸动画效果,但需要通过 JS 来触发它。我们可以通过检测动画结束事件来判断烟花是否爆炸结束,并在结束后将其从页面中移除。这个事件可以通过监听 transitionend 事件来实现。

firework.addEventListener('transitionend', function() {
  firework.parentNode.removeChild(firework);
});

示例说明

示例1

下面是一个简单的示例,点击页面会随机生成大小不同的烟花,烟花会在随机位置爆炸。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>手动放烟花效果</title>
  <style>
    #fireworks-container {
      width: 100%;
      height: 100%;
      position: fixed;
      top: 0;
      left: 0;
      z-index: 9999;
      background-color: rgba(0, 0, 0, 0.9);
    }

    .firework {
      position: absolute;
      width: 10px;
      height: 10px;
      border-radius: 50%;
      transform: translate(-50%, -50%);
      animation: explode 1s ease-out;
      animation-fill-mode: forwards;
    }

    @keyframes explode {
      to {
        width: 200px;
        height: 200px;
        opacity: 0;
      }
    }
  </style>
</head>
<body>
<div id="fireworks-container"></div>
<script>
  document.addEventListener('click', function(event) {
    createFirework(event.clientX, event.clientY);
  });

  function createFirework(x, y) {
    var firework = document.createElement('div');
    firework.className = 'firework';
    firework.style.left = x + 'px';
    firework.style.top = y + 'px';
    firework.style.backgroundColor = getRandomColor();
    firework.style.animationDuration = getRandomNumber(1, 2) + 's';

    document.getElementById('fireworks-container').appendChild(firework);

    // 等待烟花爆炸结束后再将其从页面移除
    firework.addEventListener('transitionend', function() {
      firework.parentNode.removeChild(firework);
    });
  }

  function getRandomNumber(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
  }

  function getRandomColor() {
    var r = getRandomNumber(0, 255);
    var g = getRandomNumber(0, 255);
    var b = getRandomNumber(0, 255);

    return 'rgb(' + r + ', ' + g + ', ' + b + ')';
  }
</script>
</body>
</html>
示例2

下面是一个稍微高级一点的示例,除了生成烟花外,还包括了烟花爆炸时的声音,以及只在指定区域内生成烟花。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>手动放烟花效果</title>
  <style>
    #fireworks-container {
      width: 100%;
      height: 100%;
      position: fixed;
      top: 0;
      left: 0;
      z-index: 9999;
      background-color: rgba(0, 0, 0, 0.9);
    }

    .firework {
      position: absolute;
      width: 10px;
      height: 10px;
      border-radius: 50%;
      transform: translate(-50%, -50%);
      animation: explode 1s ease-out;
      animation-fill-mode: forwards;
    }

    @keyframes explode {
      to {
        width: 200px;
        height: 200px;
        opacity: 0;
      }
    }
  </style>
</head>
<body>
<div id="fireworks-container"></div>
<script>
  // 在指定区域内生成烟花
  var container = document.getElementById('fireworks-container');
  container.addEventListener('click', function(event) {
    if (event.target == container) {
      createFirework(event.clientX, event.clientY);
      playSound();
    }
  });

  // 生成烟花
  function createFirework(x, y) {
    var firework = document.createElement('div');
    firework.className = 'firework';
    firework.style.left = x + 'px';
    firework.style.top = y + 'px';
    firework.style.backgroundColor = getRandomColor();
    firework.style.animationDuration = getRandomNumber(1, 2) + 's';

    container.appendChild(firework);

    // 等待烟花爆炸结束后再将其从页面移除
    firework.addEventListener('transitionend', function() {
      firework.parentNode.removeChild(firework);
    });
  }

  // 播放声音
  function playSound() {
    var audio = new Audio('sound.mp3');
    audio.play();
  }

  function getRandomNumber(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
  }

  function getRandomColor() {
    var r = getRandomNumber(0, 255);
    var g = getRandomNumber(0, 255);
    var b = getRandomNumber(0, 255);

    return 'rgb(' + r + ', ' + g + ', ' + b + ')';
  }
</script>
</body>
</html>

这个示例加入了播放音频的功能,需要在 HTML 中引入 sound.mp3 文件。除此之外,我们还通过检测事件的目标元素,只在容器区域内生成烟花。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Html+CSS+JS实现手动放烟花效果 - Python技术站

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

相关文章

  • 详解React中的this指向

    当使用React构建应用程序时,使用this来引用组件实例中的属性和方法可能会变得稍微复杂。在React组件中,this的值可能是 null、 undefined 或指向其他对象。这可能会导致执行时错误或行为不一致的情况出现。 为什么this指向会变化? React组件的 this 值会受到许多因素的影响,主要有以下原因: 在类方法中,this 默认指向组件…

    JavaScript 2023年6月10日
    00
  • 如何使用 JavaScript 操作浏览器历史记录 API

    当我们在浏览器上访问网站的时候,浏览器会自动帮我们记录下我们访问的历史记录。浏览器历史记录 API 可以让我们通过 JavaScript 进行控制这些历史记录。下面是如何使用 JavaScript 操作浏览器历史记录的完整攻略。 1. pushState()方法 使用 pushState() 方法可以在当前浏览器历史记录中添加一个新的状态。新的状态包括一个页…

    JavaScript 2023年5月27日
    00
  • JS数组reduce你不得不知道的25个高级用法

    下面我来为你详细讲解“JS数组reduce你不得不知道的25个高级用法”的完整攻略。 1. 什么是reduce? reduce() 方法用于对数组中的所有元素依次执行指定的回调函数,并将其缩减为单个值。这个值就是最后的返回值。reduce() 方法可以接收两个参数:回调函数和初始值。 一个简单的示例如下: let arr = [1, 2, 3, 4, 5];…

    JavaScript 2023年5月27日
    00
  • 一文带你简单封装JS下的异步任务对象

    下面是关于“一文带你简单封装JS下的异步任务对象”的完整攻略。 前言 异步编程到现在已经是一个非常成熟的概念,并且也是前端开发中非常重要的一环。在JavaScript中,常见的异步操作包括网络请求、读写文件等。但是在异步操作中,由于异步事件的不确定性,使得相关代码比同步代码更难以理解、调试以及维护。为了更优雅地解决这个问题,我们可以使用异步任务对象的方式来封…

    JavaScript 2023年6月10日
    00
  • element-ui树形控件后台返回的数据+生成组织树的工具类

    生成树形组织结构需要以下两个步骤: 后台返回的数据必须是一个符合规范的JSON格式的树形结构。 例如,以下是符合规范的树形JSON数据结构示例: [ { "id": 1, "name": "Node1", "children": [ { "id": 2, &q…

    JavaScript 2023年6月10日
    00
  • javascript异步编程

    下面我会来详细讲解“JavaScript 异步编程”的完整攻略,包括基本概念、异步编程方式、回调函数、Promise、async/await 等。 基础概念 在学习异步编程之前,我们需要了解以下几个基础概念: 同步代码 同步代码指的是按照代码的书写顺序,依次执行的代码,一行代码的执行需要等待上一行代码的执行完成。 console.log(‘start’); …

    JavaScript 2023年5月18日
    00
  • JS中的三个循环小结

    JS中有三个循环语句:for循环、while循环和do-while循环。这三个循环语句都能够让我们方便地对数组或对象进行遍历,执行重复的操作。 1. for循环 for循环是JS中最常用的循环语句之一,能够让你重复执行一个操作多次,for循环含有三个表达式:起始表达式、终止表达式和递增表达式。 语法: for (起始表达式; 终止表达式; 递增表达式) { …

    JavaScript 2023年6月10日
    00
  • javascript 用函数实现继承详解

    下面是“javascript 用函数实现继承详解”的完整攻略,内容包括以下几部分: 什么是继承? 原型链继承 借用构造函数实现继承 组合继承 原型式继承 寄生式继承 寄生组合式继承 什么是继承? 继承是 JavaScript 中的一个重要概念,它允许我们可以在已有对象的基础上创建新的对象,并继承已有对象的属性和方法。通过继承,我们可以大大提高代码重用的效率,…

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