原生JS实现烟花效果

yizhihongxing

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

相关文章

  • JavaScript前端优化策略深入详解

    JavaScript前端优化策略深入详解 在前端开发中,JavaScript无疑是最为重要的语言之一,但是随着项目逐渐变大,JavaScript的性能瓶颈也逐渐显现出来。因此,今天我们要介绍一些JavaScript前端优化的策略,以提高项目的性能。 1. 减少HTTP请求次数 在前端开发中,HTTP请求往往是导致页面性能下降的主要原因之一。因此,在设计网站架…

    JavaScript 2023年5月19日
    00
  • 详解js location.href和window.open的几种用法和区别

    下面是“详解js location.href和window.open的几种用法和区别”的完整攻略。 一、前言 在前端开发中,有时候我们需要通过JS来控制浏览器的跳转或打开新窗口等操作,而其中常用的方法就是location.href和window.open。这两个方法虽然都是用来进行页面跳转或打开新窗口,但它们之间还是存在一些区别的。本文将详细讲解JS中loc…

    JavaScript 2023年6月11日
    00
  • Javascript实现商品秒杀倒计时(时间与服务器时间同步)

    下面我将为您提供“Javascript实现商品秒杀倒计时(时间与服务器时间同步)”的完整攻略。 一、需求分析 商品秒杀倒计时的实现,需要做到倒计时精准,时间与服务器时间同步,同时要求倒计时显示页面美观、易于用户理解操作。 二、解决方案 1.获取当前服务器时间,对服务器时间进行格式化处理,然后通过Ajax把获取到的时间发送给前端,以便前端进行倒计时的对比计算。…

    JavaScript 2023年5月27日
    00
  • JavaScript实现页面定时刷新(定时器,meta)

    下面是JavaScript实现页面定时刷新的完整攻略。 一、使用JavaScript定时器实现页面定时刷新 JavaScript定时器是一个非常常见的JavaScript特性,可以让你重复执行一段JavaScript代码片段。结合定时器和location.reload()方法,可以非常简单地实现页面定时刷新。 以下是使用JavaScript定时器实现页面定时…

    JavaScript 2023年6月11日
    00
  • JavaScript学习笔记之JS函数

    Javascript函数是一种重要的编程元素,用于封装可重用的功能。在本篇学习笔记中,我们将涵盖以下主题: 函数的定义和调用 函数参数的传递与默认值 函数返回值和作用域 1. 函数的定义和调用 JavaScript中函数可以通过函数声明或函数表达式来定义。函数声明使用关键字function定义,如下: function greet(name) { conso…

    JavaScript 2023年5月18日
    00
  • javascript数组克隆简单实现方法

    下面我来讲解“JavaScript数组克隆简单实现方法”的完整攻略。 什么是数组克隆 在 JavaScript 中,数组是一种重要的数据结构,它通常用来存储一组数据。数组克隆是指复制一个数组的内容到一个新数组中。克隆后的数组与原数组相互独立,对其中一个进行操作不会对另外一个产生影响。 数组克隆的原理 JavaScript 数组的克隆可以采用两种方式:浅克隆和…

    JavaScript 2023年5月27日
    00
  • JS课堂笔记(4.11-4.16)

    一、简单了解JS 1. JavaScript(简称JS)是作为开发Web页面的脚本语言。 2. JS是从1995年由网景公司的布兰德开发。 3. JavaScript的标准是ECMAScript。 4. JS代码是从上往下执行的。  二、变量 1. 变量名的值可以重复赋值(值可以修改),变量可以重复声明。 2. JS中“+”号很特殊,只要是和字符串相加都会变…

    JavaScript 2023年4月22日
    00
  • 详解vue-socket.io使用教程与踩坑记录

    详解vue-socket.io使用教程与踩坑记录 什么是vue-socket.io Vue-socket.io是一个适用于Vue.js的Socket.io插件,使得在Vue.js中使用Socket.io变得非常简单。 安装和使用 安装 在你的项目中,通过npm安装vue-socket.io npm install vue-socket.io –save 引…

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