原生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日

相关文章

  • 简单了解Ajax表单序列化的实现方法

    下面是“简单了解Ajax表单序列化的实现方法”的完整攻略。 一、什么是Ajax表单序列化? Ajax表单序列化是AJAX(Asynchronous JavaScript and XML,异步JavaScript和XML)技术中的一种常见用法,它可以将表单中的数据自动转换成一组用于HTTP POST请求或GET请求的字符串。这个字符串可以被传递到服务器端,用于…

    JavaScript 2023年5月19日
    00
  • prettier自动格式化去换行的实现代码

    Prettier 自动格式化去换行的实现 Prettier 是一款代码格式化工具,能够自动为代码添加缩进、格式化代码样式等特性,并且运行速度较快,常用于开发中的自动化构建流程中。Prettier 在格式化代码时会默认去掉多余的换行,本文将详细介绍 Prettier 自动格式化去换行的实现。 安装 Prettier 使用 npm 命令安装 Prettier n…

    JavaScript 2023年6月11日
    00
  • 一文掌握JavaScript数组常用工具函数总结

    一文掌握JavaScript数组常用工具函数总结 前言 JavaScript 是一种非常受欢迎的脚本语言,而数组是 JavaScript 中最常用的数据结构之一。在实际开发中,我们通常使用数组来存储和处理数据。本文将介绍一些常用的 JavaScript 数组工具函数,包括以下内容: 遍历数组 操作数组 搜索数组 遍历数组 forEach() forEach(…

    JavaScript 2023年5月27日
    00
  • Javascript this 函数深入详解

    Javascript this 函数深入详解 什么是this? this 是javascript中一个非常重要和有用的关键字,它代表当前函数执行的上下文,在不同的函数内部指向不同的对象。需要注意的是,this 的指向并不是在定义的时候确定的,而是在运行的时候才确定的。 this 的4中绑定规则 当你在函数里使用 this 时,请先看调用该函数的方式,它式通过…

    JavaScript 2023年5月27日
    00
  • 深入学习JavaScript中的promise

    深入学习 JavaScript 中的 Promise 什么是 Promise Promise 是一种处理异步操作的机制。它将异步操作包装成一个对象,使得我们可以像同步操作一样进行编程。Promise 对象可以表示一个异步操作的“未来结果”,并且提供了一些方法来处理这个“未来结果”的返回值或者错误信息。 Promise 的状态 Promise 有 3 种状态:…

    JavaScript 2023年5月28日
    00
  • 详解Node.js中的事件机制

    详解Node.js中的事件机制 Node.js作为基于事件驱动的后端框架,事件机制非常重要。在Node.js中,事件分为两个主要部分:事件触发器和事件监听器。事件触发器通过emit()函数来触发事件,事件监听器通过on()函数来监听事件。下面将对事件机制进行详细讲解。 事件触发器 事件触发器是指当某个事件发生时,会调用emit()函数来发出一个事件。emit…

    JavaScript 2023年5月28日
    00
  • xmlplus组件设计系列之路由(ViewStack)(7)

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

    JavaScript 2023年6月11日
    00
  • 将JavaScript的jQuery库中表单转化为JSON对象的方法

    将JavaScript的jQuery库中表单转化为JSON对象的方法可以使用jQuery中的serializeArray()方法实现。 第一步:选择表单元素 首先需要使用jQuery的选择器选择表单元素,例如: var $form = $(‘form’); 第二步:使用serializeArray()方法将表单数据序列化为数组 var formArray =…

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