js实现烟花特效

下面是JS实现烟花特效的完整攻略:

1.实现思路

  • 实现Canvas画布,用于绘制烟花效果;
  • 生成烟花粒子,通过动画实现烟花特效。

2.代码实现

2.1 创建Canvas画布

创建一个id为firework的画布,用于绘制烟花特效。

<canvas id="firework"></canvas>
// 获取画布元素
var canvas = document.getElementById("firework");

// 获取画布上下文,设置画布宽高
var ctx = canvas.getContext("2d");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

2.2 生成烟花粒子

通过动画循环生成烟花粒子,包括烟花弹和爆炸效果。

// 定义粒子类
function Particle() {
  // 弹出初始化坐标点
  this.x = Math.random() * canvas.width;
  this.y = Math.random() * canvas.height;
  // 控制速度和方向
  this.speed = 2;
  this.directionX = Math.random() * 1 - 0.5;
  this.directionY = Math.random() * 1 - 0.5;
  // 定义粒子颜色
  this.color = "#ffffff";
  // 定义粒子半径
  this.radius = Math.random() * 3;
}

// 定义绘制粒子方法
Particle.prototype.draw = function () {
  ctx.beginPath();
  ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);
  ctx.fillStyle = this.color;
  ctx.fill();
};

// 定义更新粒子方法
Particle.prototype.update = function () {
  // 控制粒子速度和方向
  this.x += this.directionX * this.speed;
  this.y += this.directionY * this.speed;
  // 控制烟花爆炸效果
  if (this.radius > 0.1) {
    this.radius -= 0.1;
  } else {
    this.radius = 0;
  }
};

// 定义烟花爆炸方法
function explode() {
  // 初始化粒子数组,生成爆炸后的粒子
  var particles = [];
  for (var i = 0; i < 30; i++) {
    var particle = new Particle();
    particles.push(particle);
  }

  // 循环执行粒子更新方法
  function loop() {
    ctx.fillStyle = "rgba(0, 0, 0, 0.05)";
    ctx.fillRect(0, 0, canvas.width, canvas.height);

    for (var i = 0; i < particles.length; i++) {
      particles[i].draw();
      particles[i].update();
    }

    requestAnimationFrame(loop);
  }

  // 执行动画循环
  loop();
}

// 定义烟花弹生成方法
function firework() {
  // 初始化烟花弹坐标
  var x = Math.random() * canvas.width;
  var y = canvas.height;

  // 循环执行烟花弹更新方法
  function loop() {
    ctx.fillStyle = "rgba(0, 0, 0, 0.05)";
    ctx.fillRect(0, 0, canvas.width, canvas.height);

    var particle = new Particle();
    particle.x = x;
    particle.y = y;
    particle.color = "#"+((1<<24)*Math.random()|0).toString(16);

    particle.draw();
    particle.update();

    if (particle.radius == 0) {
      explode();
    } else {
      requestAnimationFrame(loop);
    }
  }

  // 执行动画循环
  loop();
}

2.3 初始化并执行烟花特效

初始化烟花特效,并执行动画循环,随机生成不同颜色的烟花弹效果。

// 初始化播放烟花特效,每隔1秒执行一次
function playFirework() {
  window.setInterval(firework, 1000);  
}
playFirework();

3. 示例说明

下面是两条示例说明:

3.1 示例1

这个示例是通过烟花特效实现一个简单的动态背景,不同的颜色和大小的烟花弹交替出现,让页面更加生动有趣。

<html>
  <head>
    <title>烟花特效示例</title>
    <style>
      body {
        margin: 0;
        padding: 0;
      }
      canvas {
        position: fixed;
        top: 0;
        left: 0;
        z-index: -1;
      }
    </style>
  </head>
  <body>
    <canvas id="firework"></canvas>
    <script>
      var canvas = document.getElementById("firework");
      var ctx = canvas.getContext("2d");
      canvas.width = window.innerWidth;
      canvas.height = window.innerHeight;

      function Particle() {
        this.x = Math.random() * canvas.width;
        this.y = Math.random() * canvas.height;

        this.speed = 2;
        this.directionX = Math.random() * 1 - 0.5;
        this.directionY = Math.random() * 1 - 0.5;

        this.color = "#ffffff";
        this.radius = Math.random() * 3;
      }

      Particle.prototype.draw = function () {
        ctx.beginPath();
        ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);
        ctx.fillStyle = this.color;
        ctx.fill();
      };

      Particle.prototype.update = function () {
        this.x += this.directionX * this.speed;
        this.y += this.directionY * this.speed;

        if (this.radius > 0.1) {
          this.radius -= 0.1;
        } else {
          this.radius = 0;
        }
      };

      function explode() {
        var particles = [];
        for (var i = 0; i < 30; i++) {
          var particle = new Particle();
          particles.push(particle);
        }

        function loop() {
          ctx.fillStyle = "rgba(0, 0, 0, 0.05)";
          ctx.fillRect(0, 0, canvas.width, canvas.height);

          for (var i = 0; i < particles.length; i++) {
            particles[i].draw();
            particles[i].update();
          }

          requestAnimationFrame(loop);
        }

        loop();
      }

      function firework() {
        var x = Math.random() * canvas.width;
        var y = canvas.height;

        function loop() {
          ctx.fillStyle = "rgba(0, 0, 0, 0.05)";
          ctx.fillRect(0, 0, canvas.width, canvas.height);

          var particle = new Particle();
          particle.x = x;
          particle.y = y;
          particle.color = "#"+((1<<24)*Math.random()|0).toString(16);

          particle.draw();
          particle.update();

          if (particle.radius == 0) {
            explode();
          } else {
            requestAnimationFrame(loop);
          }
        }

        loop();
      }

      function playFirework() {
        window.setInterval(firework, 1000);  
      }

      playFirework();
    </script>
  </body>
</html>

3.2 示例2

这个示例是在Vue.js框架中嵌入烟花特效,当点击页面上的按钮时,才会出现烟花特效,提供更好的用户体验。

<template>
  <div>
    <button @click="playFirework()">点击播放</button>
    <canvas id="firework"></canvas>
  </div>
</template>

<script>
export default {
  name: "Firework",
  data() {
    return {};
  },
  methods: {
    playFirework() {
      var canvas = document.getElementById("firework");
      var ctx = canvas.getContext("2d");
      canvas.width = window.innerWidth;
      canvas.height = window.innerHeight;

      function Particle() {
        this.x = Math.random() * canvas.width;
        this.y = Math.random() * canvas.height;

        this.speed = 2;
        this.directionX = Math.random() * 1 - 0.5;
        this.directionY = Math.random() * 1 - 0.5;

        this.color = "#ffffff";
        this.radius = Math.random() * 3;
      }

      Particle.prototype.draw = function () {
        ctx.beginPath();
        ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);
        ctx.fillStyle = this.color;
        ctx.fill();
      };

      Particle.prototype.update = function () {
        this.x += this.directionX * this.speed;
        this.y += this.directionY * this.speed;

        if (this.radius > 0.1) {
          this.radius -= 0.1;
        } else {
          this.radius = 0;
        }
      };

      function explode() {
        var particles = [];
        for (var i = 0; i < 30; i++) {
          var particle = new Particle();
          particles.push(particle);
        }

        function loop() {
          ctx.fillStyle = "rgba(0, 0, 0, 0.05)";
          ctx.fillRect(0, 0, canvas.width, canvas.height);

          for (var i = 0; i < particles.length; i++) {
            particles[i].draw();
            particles[i].update();
          }

          requestAnimationFrame(loop);
        }

        loop();
      }

      function firework() {
        var x = Math.random() * canvas.width;
        var y = canvas.height;

        function loop() {
          ctx.fillStyle = "rgba(0, 0, 0, 0.05)";
          ctx.fillRect(0, 0, canvas.width, canvas.height);

          var particle = new Particle();
          particle.x = x;
          particle.y = y;
          particle.color = "#"+((1<<24)*Math.random()|0).toString(16);

          particle.draw();
          particle.update();

          if (particle.radius == 0) {
            explode();
          } else {
            requestAnimationFrame(loop);
          }
        }

        loop();
      }

      window.setInterval(firework, 1000);
    },
  },
};
</script>

<style>
canvas {
  position: fixed;
  top: 0;
  left: 0;
  z-index: -1;
}
</style>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现烟花特效 - Python技术站

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

相关文章

  • 惰性函数定义模式 使用方法

    惰性函数定义模式指的是,函数在执行时并不会立即返回结果,而是通过一些技巧延迟了函数的执行,让函数具有了更高的灵活性和重复使用性。 下面是使用惰性函数定义模式的方法: 1. 简单的惰性函数定义模式 function addEvent(elem, type, handler) { if (elem.addEventListener) { elem.addEven…

    JavaScript 2023年6月11日
    00
  • JS字符串函数扩展代码

    JS字符串函数扩展代码可以让我们在字符串处理中更加轻松灵活。下面将详细讲解该功能的实现方法和使用技巧。 如何实现字符串函数扩展 JS提供了在String原型中扩展函数的方法,可以通过给String.prototype添加新的方法来实现字符串函数的扩展。比如,我们可以为String.prototype添加名为reverse的方法: String.prototy…

    JavaScript 2023年5月27日
    00
  • 深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域

    深入理解JavaScript中的匿名函数((function() {})();)与变量的作用域攻略。在JavaScript中,函数是一等公民,具有与其他数据类型相同的地位。变量的作用域是JavaScript函数特有的概念。这个攻略将会详细解释匿名函数和JavaScript变量作用域的相关知识点。 匿名函数 概念 匿名函数是一种没有名称的函数。在JavaScr…

    JavaScript 2023年5月27日
    00
  • js对图片base64编码字符串进行解码并输出图像示例

    解码图片base64编码字符串并输出图像一般需要以下步骤: 从DOM中获取到base64编码图片字符串。 将base64编码图片字符串转换为Blob类型数据。 使用FileReader对象将Blob类型数据读取为图像对象的URL地址。 将URL地址赋值给img标签的src属性,以此输出图像。 下面我们来一步一步详细讲解这个过程,并提供两个示例。 示例1: 先…

    JavaScript 2023年5月19日
    00
  • 用js进行url编码后用php反解以及用php实现js的escape功能函数总结

    以下是使用 JavaScript 进行 URL 编码并在 PHP 中进行反解码的攻略: JS 中的 URL 编码 在 JavaScript 中,可以使用 encodeURIComponent() 函数来对 URL 进行编码。 举例来说,如果想将以下字符串进行编码: var str = "hello world"; 可以使用以下代码进行编码…

    JavaScript 2023年5月19日
    00
  • JS正则表达式替换字符串replace()方法实例代码

    下面是关于JS正则表达式替换字符串replace()方法的详细攻略: 什么是JS正则表达式替换字符串replace()方法? 在JavaScript中,字符串replace() 方法可以将一个字符串中的指定内容替换成新的内容,这有很多应用场景。其中,JS正则表达式替换字符串replace()方法,可以让开发者使用正则表达式来进行替换操作,更加高效和灵活。 J…

    JavaScript 2023年5月28日
    00
  • jQuery is not defined 错误原因与解决方法小结

    以下是 “jQuery is not defined 错误原因与解决方法小结” 的完整攻略。 1. jQuery is not defined错误原因 当在代码中使用jQuery库时,经常会出现”jQuery is not defined” 的错误提示。这种情况通常是由以下原因引起的: jQuery库没有被正确加载。 jQuery库加载顺序不正确。 jQue…

    JavaScript 2023年5月18日
    00
  • JavaScript中Function()函数的使用教程

    下面就为大家详细讲解JavaScript中Function()函数的使用教程。 一、什么是Function()函数 Function()函数是JavaScript中的一种内置函数,它用来创建一个函数对象。在JavaScript中,函数也是对象,因此它们可以像其他对象一样传递、存储和处理。 二、Function()函数的基本语法 function functi…

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