【HTML】过年不能放烟花,那就放电子烟花


鑫宝Code

🌈个人主页: 鑫宝Code
🔥热门专栏: 闲话杂谈炫酷HTML | JavaScript基础
💫个人格言: "如无必要,勿增实体"


闲谈

大家回家过年可能都多多少少放过些🧨,但是有些在城市上过年的小伙伴可能就没有机会放鞭炮了。不过没关系,我们懂技术,我们用技术自娱自乐,放电子烟花,总不可能被警长叔叔敲门问候吧。

开干

首先,我们先明确一下思路,我觉得可以分解为如下2个步骤。涉及到Canvas+requestAnimationFrame+物理知识,🐶。

  1. 我们先画出一个烟花爆炸出来的粒子,这涉及到技术Canvas + 物理知识
  2. 最后通过动画将多个粒子的运动轨迹连在一起即可。

大家看下,我感觉应该没什么问题了,于是深入细节分析。

初始化粒子

我们先分析一下这个粒子有哪些属性,我罗列如下

  • 粒子的初始坐标(x,y)
  • 粒子的初始速度(Vx,Vy)
  • 粒子的颜色(Color)
  • 粒子的半径(Radius)
  • 粒子的透明度,随着粒子的落下,粒子的亮度会逐渐减小(opacity)

属性分析完了,接下来我们思考一个问题,粒子在爆炸那一刹那,是如何运动的呢?
很显然,是带着初速度的自由落体运动。
image.png
我们将速度分成水平方向Vx以及竖直方向Vy,于是我们可以得到

  • Vx在运动中是不变的
  • Vy的速度为Vy = Vy - gt,也就是每秒会速度下降g,由于g是个定值,在模拟的时候我们就取每帧(屏幕刷新率,大概10ms一次)下降0.15px速度。

注意: Vy的速度在代码里是Vy += 0.15,为什么是加呢,因为对于屏幕而言,右上角的px是(0,0),所以想下的速度是正,向上的速度是负。

于是我们便可撰写如下代码

class Dot {
   
  constructor(x, y, color, Vx, Vy) {
   
    this.x = x;
    this.y = y;
    this.Vx = Vx;
    this.Vy = Vy;
    this.color = color;
    this.radius = 2.5;
    this.opacity = 1;
  }

  update() {
   
    // 每一帧x和y轴移动的距离
    this.x += this.Vx;
    this.y += this.Vy;
    // 每一帧速度变化
    this.Vy += 0.15;
    // 每一帧清晰度较小
    this.opacity = this.opacity - 0.01;
  }

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

粒子聚合成烟花

如何将粒子聚合成烟花呢,我们声明一个烟花类即可。对于一个烟花,我们只需要知道这个研发爆炸在什么位置就可以了,也就是xy的坐标。

  • 粒子的颜色? 为了让粒子的颜色更加饱和一点,我们采用的是HSL颜色,跟RGBHEX记录颜色不同,这个是用色相、饱和度和明度(HSL)来指定颜色。这里我们采用的代码为
// 是JavaScript中动态生成一个随机色相、饱和度为100%、亮度为50%的HSL颜色值。
const color = `hsl(${
     Math
### HTML 网页代码实现过年烟花效果 为了创建具有春节氛围的烟花效果,可以采用HTML5 `Canvas` 和 JavaScript 结合的方式。下面是一个简单版本的烟花爆炸动画示例: #### 完整HTML文件结构如下所示: ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>新年快乐 - 烟花秀</title> <style> body { margin: 0; overflow:hidden;background-color:#000;} canvas { display:block } </style> </head> <body> <canvas id="fireworks"></canvas> <script> class Particle { constructor(x, y) { this.x = x; this.y = y; this.color = 'hsl(' + Math.random() * 360 + ', 100%, 70%)'; this.size = Math.random() * 4 + 1; this.speedX = (Math.random() - .5) * 10; this.speedY = (Math.random() - .5) * 10; this.alpha = 1; } update(ctx) { ctx.globalAlpha = this.alpha -= 0.01; ctx.fillStyle = this.color; ctx.beginPath(); ctx.arc(this.x += this.speedX, this.y += this.speedY, this.size, 0, Math.PI * 2); ctx.fill(); if (this.alpha <= 0) particles.splice(particles.indexOf(this), 1); } } let canvas = document.getElementById('fireworks'); let context = canvas.getContext('2d'); canvas.width = window.innerWidth; canvas.height = window.innerHeight; window.addEventListener('resize', function () { canvas.width = window.innerWidth; canvas.height = window.innerHeight; }); function createFirework(event) { let mouseX = event.clientX || event.touches[0].clientX; let mouseY = event.clientY || event.touches[0].clientY; for (var i = 0; i < 100; i++) { particles.push(new Particle(mouseX, mouseY)); } } document.body.addEventListener('click', createFirework); let particles = []; function animate() { requestAnimationFrame(animate); context.clearRect(0, 0, innerWidth, innerHeight); for (let particle of particles) { particle.update(context); } } animate(); </script> </body> </html> ``` 此段脚本定义了一个名为Particle的对象来表示单个火花粒子,并设置了其属性如位置、颜色、大小以及速度等[^1]。 页面加载完成后会监听窗口尺寸变化事件以便调整画布大小适应不同设备屏幕;同时绑定了鼠标点击事件,在用户点击处生成一组随机分布的小颗粒模拟烟花的过程[^3]。
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鑫宝Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值