请使用javascript我做一个的HTML动画效果,能够点击屏幕后,放出烟花。要求:代码详细
时间: 2024-05-09 21:21:54 浏览: 9
实现烟花动画效果
以下是利用HTML5和javascript实现的烟花动画效果示例代码:
HTML代码:
```
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>烟花动画效果</title>
<style>
body {
margin: 0;
padding: 0;
background-color: #000;
}
canvas {
display: block;
position: fixed;
top: 0;
left: 0;
z-index: -1;
}
</style>
</head>
<body>
<canvas id="canvas"></canvas>
<script src="firework.js"></script>
</body>
</html>
```
注释:在HTML文档中,我们创建了一个canvas元素,并加上id属性值为"canvas"。我们在<head>标签中加上了一个样式表,设置了body元素的背景颜色为黑色(#000),并将canvas元素定位为fixed固定位置,并位于其最上面(z-index: -1),以防止其覆盖文档中的其他元素。我们还通过<script>标签引入了一个名为"firework.js"的JavaScript文件,用于实现烟花动画效果。
JavaScript代码:
```
//控制台输出欢迎信息
console.log("欢迎使用烟花动画效果!");
//定义变量
var canvas = document.getElementById("canvas"),
ctx = canvas.getContext("2d"),
WIDTH = window.innerWidth,
HEIGHT = window.innerHeight,
mx, my;
//设置画布尺寸
canvas.width = WIDTH;
canvas.height = HEIGHT;
//烟花类
class Firework {
constructor(x, y, vx, vy, size, hue) {
this.x = x;
this.y = y;
this.vx = vx;
this.vy = vy;
this.size = size;
this.hue = hue;
this.alpha = 1;
this.sparks = [];
//生成火花
for (var i = 0; i < 30; i++) {
var speed = (Math.random() * 4) + 2,
direction = (Math.random() * Math.PI * 2),
sparkVX = Math.cos(direction) * speed,
sparkVY = Math.sin(direction) * speed;
this.sparks.push({x: this.x, y: this.y, vx: sparkVX, vy: sparkVY, size: Math.random() * 3 + 1});
}
}
//绘制烟花
draw() {
ctx.beginPath();
ctx.fillStyle = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
ctx.fill();
this.sparks.forEach(spark => {
ctx.beginPath();
ctx.fillStyle = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;
ctx.arc(spark.x, spark.y, spark.size, 0, Math.PI * 2);
ctx.fill();
});
}
//更新烟花
update() {
this.x += this.vx;
this.y += this.vy + 0.08; //加入重力效果
this.alpha -= 0.008; //火花渐隐
this.sparks.forEach(spark => {
spark.x += spark.vx;
spark.y += spark.vy + 0.03; //加入重力效果
spark.size -= 0.03; //火花渐隐
});
}
}
//烟花数组
var fireworks = [];
//鼠标移动事件
function mousemove(e) {
mx = e.clientX - canvas.offsetLeft + document.documentElement.scrollLeft;
my = e.clientY - canvas.offsetTop + document.documentElement.scrollTop;
}
//鼠标点击事件
function click(e) {
var size = Math.random() * 4 + 4,
vx = (mx - WIDTH / 2) * 0.03,
vy = (my - HEIGHT * 0.75) * 0.03,
hue = Math.floor(Math.random() * 360);
fireworks.push(new Firework(WIDTH / 2, HEIGHT * 0.75, vx, vy, size, hue));
}
//循环动画
function loop() {
//清空画布
ctx.fillStyle = "rgba(0,0,0,0.1)";
ctx.fillRect(0, 0, WIDTH, HEIGHT);
//更新和绘制烟花
fireworks.forEach(firework => {
firework.draw();
firework.update();
});
//移除已经燃尽的烟花
fireworks = fireworks.filter(firework => firework.alpha > 0);
//继续动画循环
requestAnimationFrame(loop);
}
//绑定事件
canvas.addEventListener("mousemove", mousemove);
canvas.addEventListener("click", click);
//启动循环动画
loop();
```
注释:JavaScript代码实现了烟花动画效果的核心逻辑。我们定义了一个名为"Firework"的类,用于创建每个烟花对象。在该类中,我们定义了烟花的属性(如x坐标、y坐标、水平速度、垂直速度、烟花大小、颜色等),并在constructor构造函数中使用循环语句生成了烟花涌现时的多个火花(利用随机速度和角度产生多个火花),并存放在一个名为"sparks"数组中。接着,我们定义了Firework类的两个方法分别用于绘制和更新烟花对象。在draw()方法中,我们使用了Canvas API绘制了烟花和其包含的多个火花。在update()方法中,我们更新了烟花和火花的坐标位置、大小和透明度,模拟了烟花消失的效果。接着,我们定义了一个名为"fireworks"的数组,用于存放多个烟花对象。我们还定义了两个函数,分别处理鼠标移动事件和鼠标点击事件。在mousemove()函数中,我们获取了鼠标的坐标位置,并存储在mx和my变量中。在click()函数中,我们利用鼠标的坐标位置、随机速度和随机颜色创建了一个新的烟花对象,并将其添加到fireworks数组中。最后,我们定义了一个名为"loop"的循环函数,用于控制烟花动画的更新和绘制。在该函数中,我们先使用Canvas API清空了画布,然后循环遍历了fireworks数组中的所有烟花对象,调用其draw()和update()方法更新和绘制烟花。接着,我们通过过滤器函数将已经烧完的烟花对象从数组中移除。最后,我们利用requestAnimationFrame()函数继续循环更新和绘制烟花动画。至此,我们就实现了一个简单的烟花动画效果。