原生JS实现烟花效果

原生JS实现烟花效果的完整攻略如下。

准备工作

首先需要在HTML中创建一个画布Canvas元素,并且需要设置Canvas的宽高以及背景颜色。代码如下:

<canvas id="fireworks"></canvas>
#fireworks {
    width: 100%;
    height: 100%;
    background-color: #111;
}

然后需要在JS中获取Canvas对象和绘制上下文,并设置Canvas的宽高,以便使Canvas适应不同设备的屏幕分辨率。代码如下:

const canvas = document.querySelector('#fireworks');
const ctx = canvas.getContext('2d');
const width = canvas.width = window.innerWidth;
const height = canvas.height = window.innerHeight;

创建烟花

接下来需要创建一个烟花对象,其中包含了烟花的起点、终点、颜色等信息。首先需要定义起点的位置,可以随机生成一个在Canvas中的位置,代码如下:

let particle = {
    x: Math.random() * width,
    y: height,
    color: randomColor(),
    radius: 3,
    speed: 4,
    angle: Math.atan2(height, width) + (Math.random() * Math.PI - Math.PI / 2),
    friction: 0.99,
    gravity: 0.02,
    opacity: 1
};

然后需要定义终点的位置,可以设置一个目标位置,烟花会向这个目标位置飞行。代码如下:

let target = {
    x: Math.random() * width,
    y: Math.random() * height / 2
};

动画效果

接下来需要为烟花创建动画效果。每一帧需要将烟花绘制到Canvas上,并且更新其位置信息,使烟花在Canvas中逐渐飞行和消失。代码如下:

function render() {
    // 清空画布
    ctx.clearRect(0, 0, width, height);

    // 绘制烟花
    ctx.beginPath();
    ctx.arc(particle.x, particle.y, particle.radius, 0, Math.PI * 2);
    ctx.fillStyle = `rgba(${particle.color},${particle.opacity})`;
    ctx.fill();

    // 更新烟花位置信息
    particle.x += Math.cos(particle.angle) * particle.speed;
    particle.y -= Math.sin(particle.angle) * particle.speed;
    particle.speed *= particle.friction;
    particle.angle += Math.random() * 0.2 - 0.1;
    particle.gravity += 0.01;
    particle.y += particle.gravity;

    // 设置烟花透明度
    particle.opacity -= 0.01;

    // 当透明度小于等于0时,创建新的烟花
    if (particle.opacity <= 0) {
        createFirework();
    }

    // 请求动画帧
    requestAnimationFrame(render);
}

创建多个烟花

可以在Canvas点击事件中创建多个烟花,让烟花的起点随机分布在点击位置附近。代码如下:

canvas.addEventListener('click', function() {
    for (let i = 0; i < 5; i++) {
        createFirework(event.clientX, event.clientY);
    }
});

示例说明

示例1

在页面加载完成后,自动创建一个烟花,烟花的颜色为红色。

document.addEventListener('DOMContentLoaded', function() {
    createFirework(null, null, '255,0,0');
});

function createFirework(x, y, color) {
    let particle = {
        x: x || Math.random() * width,
        y: y || height,
        color: color || randomColor(),
        radius: 3,
        speed: 4,
        angle: Math.atan2(height, width) + (Math.random() * Math.PI - Math.PI / 2),
        friction: 0.99,
        gravity: 0.02,
        opacity: 1
    };

    let target = {
        x: Math.random() * width,
        y: Math.random() * height / 2
    };

    render();

    function render() {
        ctx.clearRect(0, 0, width, height);

        ctx.beginPath();
        ctx.arc(particle.x, particle.y, particle.radius, 0, Math.PI * 2);
        ctx.fillStyle = `rgba(${particle.color},${particle.opacity})`;
        ctx.fill();

        particle.x += Math.cos(particle.angle) * particle.speed;
        particle.y -= Math.sin(particle.angle) * particle.speed;
        particle.speed *= particle.friction;
        particle.angle += Math.random() * 0.2 - 0.1;
        particle.gravity += 0.01;
        particle.y += particle.gravity;

        particle.opacity -= 0.01;

        if (particle.opacity <= 0) {
            return;
        }

        requestAnimationFrame(render);
    }
}

示例2

每隔2秒自动在Canvas中随机生成3个烟花。

setInterval(function() {
    for (let i = 0; i < 3; i++) {
        createFirework();
    }
}, 2000);

function createFirework(x, y, color) {
    let particle = {
        x: x || Math.random() * width,
        y: y || height,
        color: color || randomColor(),
        radius: 3,
        speed: 4,
        angle: Math.atan2(height, width) + (Math.random() * Math.PI - Math.PI / 2),
        friction: 0.99,
        gravity: 0.02,
        opacity: 1
    };

    let target = {
        x: Math.random() * width,
        y: Math.random() * height / 2
    };

    render();

    function render() {
        ctx.clearRect(0, 0, width, height);

        ctx.beginPath();
        ctx.arc(particle.x, particle.y, particle.radius, 0, Math.PI * 2);
        ctx.fillStyle = `rgba(${particle.color},${particle.opacity})`;
        ctx.fill();

        particle.x += Math.cos(particle.angle) * particle.speed;
        particle.y -= Math.sin(particle.angle) * particle.speed;
        particle.speed *= particle.friction;
        particle.angle += Math.random() * 0.2 - 0.1;
        particle.gravity += 0.01;
        particle.y += particle.gravity;

        particle.opacity -= 0.01;

        if (particle.opacity <= 0) {
            return;
        }

        requestAnimationFrame(render);
    }
}

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

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

相关文章

  • xmlplus组件设计系列之路由(ViewStack)(7)

    《xmlplus组件设计系列之路由(ViewStack)(7)》是XMLPlus团队所编写关于ViewStack组件的一篇技术文章。该文章中详细介绍了如何设计ViewStack组件,并提供了示例代码和运行演示。下面是该文章的完整攻略: XMLPlus组件设计系列之路由(ViewStack)(7) 什么是ViewStack组件? ViewStack组件是一种可…

    JavaScript 2023年6月11日
    00
  • JavaScript中解决多浏览器兼容性23个问题的快速解决方法

    作为网站作者,我们需要考虑到不同浏览器的兼容性问题。在 JavaScript 中,不同浏览器的兼容性问题比较常见,为了解决这些问题,我们需要使用一些常见的解决方法。下面是解决 JavaScript 中多浏览器兼容性问题的完整攻略: 1. 选择合适的文档模式 文档模式用于指定浏览器在解析网页时所采用的渲染模式,包括“标准模式”和“兼容模式”。在 HTML5 中…

    JavaScript 2023年6月10日
    00
  • JQuery插入DOM节点的方法

    JQuery是一款操作DOM的JavaScript库,提供了很多操作DOM节点的方法,包括插入DOM节点的方法。以下是关于JQuery插入DOM节点的方法的完整攻略: 一、插入DOM节点的方法 在JQuery中,插入DOM节点的方法可以使用以下几种: 1.append()方法 append() 方法向被选元素的结尾(即作为其最后一个子元素)插入指定内容。 /…

    JavaScript 2023年6月10日
    00
  • 用srcElement实现添加效果 原创

    对于“用srcElement实现添加效果 原创”的完整攻略,我准备了以下讲解: 1. 什么是srcElement srcElement是javascript中一个表示事件对象(event)属性的属性,指向触发该事件的对象。通常,我们可以使用srcElement来获取触发当前事件的元素。值得注意的是,srcElement是IE浏览器独有的属性,其他浏览器可能需…

    JavaScript 2023年6月10日
    00
  • CI框架安全类Security.php源码分析

    下面是关于“CI框架安全类Security.php源码分析”的完整攻略。 CI框架安全类Security.php源码分析 简介 CodeIgniter(CI)框架的安全类Security.php提供了许多安全功能。本文将对该源码进行分析,以更好地理解这些功能。 防跨站脚本攻击(XSS攻击) XSS攻击通常使用HTML标记或JavaScript代码在Web页面…

    JavaScript 2023年6月11日
    00
  • 实现JavaScript高性能的数据存储

    当我们在实现JavaScript应用程序时,经常需要存储数据。但是不同的数据存储方式对应的性能也不同。为了实现JavaScript高性能的数据存储,我们需要采用一些优化技巧来提高数据存储的性能。下面就分享一下实现JavaScript高性能的数据存储的攻略: 1. 选择合适的数据结构 常见的JavaScript数据结构包括数组、对象、Map和Set等。不同的数…

    JavaScript 2023年5月28日
    00
  • js获取 gif 的帧数的代码实例

    下面是如何通过JavaScript获取gif图片的帧数的完整攻略: 获取gif的帧数 在JavaScript中获取gif的帧数,可以使用Image对象的onload事件,通过遍历每一帧来获取gif的帧数。具体步骤如下: 创建一个Image对象。 将src属性设置为gif图片的URL地址。 在Image对象上注册onload事件回调函数。 在回调函数中,可以通…

    JavaScript 2023年6月11日
    00
  • vscode 一键规范代码格式的实现

    下面我将为大家讲解“vscode 一键规范代码格式的实现”的完整攻略。 1. 安装插件 要实现一键规范代码格式,需要安装 vscode 的插件 Prettier – Code formatter,可以通过在 vscode 中按下快捷键 Ctrl + Shift + X 打开插件商店,在搜索框中输入 Prettier,然后点击安装即可。 2. 配置插件 在 v…

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