HTML5和JS实现新年礼花效果
2023兔年再见,2024龙年来临了!
祝愿读者朋友们在2024年里,身体健康,心灵愉悦,梦想成真。
下面是用HTML5和JS实现新年礼花效果:
源码如下:
<!DOCTYPE html>
<html>
<head>
<title>新年礼花</title>
<style>
/* 设置画布占满整个窗口 */
body {
margin: 0;
padding: 0;
overflow: hidden;
}
canvas {
display: block;
}
</style>
</head>
<body>
<!-- 创建一个画布 -->
<canvas id="fireworksCanvas"></canvas>
<script>
// 获取canvas和context
const canvas = document.getElementById('fireworksCanvas');
const ctx = canvas.getContext('2d');
// 设置canvas宽高为窗口的宽高
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
// 初始化烟花数组
let fireworks = [];
// 定义产生min到max之间的随机数的函数
function random(min, max) {
return Math.random() * (max - min) + min;
}
// 定义烟花类
class Firework {
constructor(x, y, color) {
this.x = x;
this.y = y;
this.particles = [];
this.exploded = false;
this.life = 0;
this.color = color;
this.explodeHeight = random(canvas.height * 0.3, canvas.height * 0.6);
}
// 更新烟花状态的方法
update() {
// 如果烟花还未爆炸,向上移动,并增加寿命
if (!this.exploded) {
this.y -= random(5, 10);
this.life += 1;
// 如果烟花达到或超过爆炸高度,爆炸
if (this.y <= this.explodeHeight) {
this.explode();
}
} else {
// 如果烟花已经爆炸,更新和绘制粒子
this.particles.forEach((particle, index) => {
particle.update();
if (particle.life < 0) {
this.particles.splice(index, 1);
}
});
}
}
// 绘制烟花的方法
draw() {
if (!this.exploded) {
ctx.fillStyle = this.color;
ctx.beginPath();
ctx.arc(this.x, this.y, 2, 0, Math.PI * 2);
ctx.fill();
} else {
this.particles.forEach((particle) => particle.draw());
}
}
// 烟花爆炸的方法
explode() {
this.exploded = true;
for (let i = 0; i < 100; i++) {
const angle = random(0, Math.PI * 2);
const speed = random(1, 4);
this.particles.push(new Particle(this.x, this.y, angle, speed, this.color));
}
}
}
// 定义粒子类
class Particle {
constructor(x, y, angle, speed, color) {
this.x = x;
this.y = y;
this.angle = angle;
this.speed = speed;
this.life = random(50, 100);
this.color = color;
}
// 更新粒子状态的方法
update() {
this.x += Math.cos(this.angle) * this.speed;
this.y += Math.sin(this.angle) * this.speed;
this.speed *= 0.99;
this.life -= 1;
}
// 绘制粒子的方法
draw() {
ctx.fillStyle = this.color + ', ' + (this.life / 100) + ')';
ctx.beginPath();
ctx.arc(this.x, this.y, 2, 0, Math.PI * 2);
ctx.fill();
}
}
// 动画函数
function animate() {
// 绘制背景
ctx.fillStyle = 'rgba(0, 0, 0, 0.2)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// 以5%的概率添加新烟花
if (Math.random() < 0.05) {
const x = random(0, canvas.width);
const y = canvas.height;
const fireworkColor = 'hsla(' + random(0, 360) + ', 100%, 50%';
fireworks.push(new Firework(x, y, fireworkColor));
}
// 更新和绘制烟花
for (let i = fireworks.length - 1; i >= 0; i--) {
fireworks[i].update();
fireworks[i].draw();
if (fireworks[i].exploded && fireworks[i].particles.length === 0) {
fireworks.splice(i, 1);
}
}
// 显示文字
ctx.font = "50px Arial";
ctx.fillStyle = "pink";
ctx.textAlign = "center";
ctx.fillText("2024年龙年快乐", canvas.width / 2, canvas.height / 2);
// 继续下一帧动画
requestAnimationFrame(animate);
}
// 启动动画
animate();
// 监听窗口大小变化,重新设置画布大小
window.addEventListener('resize', function() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
});
</script>
</body>
</html>
修改1:加入新年贺词文字,让文字居中从下往往滚动,效果如下:
源码如下:
<!DOCTYPE html>
<html>
<head>
<title>新年礼花</title>
<style>
/* 设置画布占满整个窗口 */
body {
margin: 0;
padding: 0;
overflow: hidden;
}
canvas {
display: block;
}
.scrolling-text {
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
font-size: 24px;
text-align: center;
color: red;
animation: scrollText 10s linear infinite;
}
@keyframes scrollText {
0% {
top: 100%;
}
100% {
top: -100%;
}
}
</style>
</head>
<body>
<!-- 创建一个画布 -->
<canvas id="fireworksCanvas"></canvas>
<div class="scrolling-text">
<p>《元日》</p>
<p>宋·王安石</p>
<p>爆竹声中一岁除,</p>
<p>春风送暖入屠苏。</p>
<p>千门万户曈曈日,</p>
<p>总把新桃换旧符。</p>
</div>
<script>
// 获取canvas和context
const canvas = document.getElementById('fireworksCanvas');
const ctx = canvas.getContext('2d');
// 设置canvas宽高为窗口的宽高
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
// 初始化烟花数组
let fireworks = [];
// 定义产生min到max之间的随机数的函数
function random(min, max) {
return Math.random() * (max - min) + min;
}
// 定义烟花类
class Firework {
constructor(x, y, color) {
this.x = x;
this.y = y;
this.particles = [];
this.exploded = false;
this.life = 0;
this.color = color;
this.explodeHeight = random(canvas.height * 0.3, canvas.height * 0.6);
}
// 更新烟花状态的方法
update() {
// 如果烟花还未爆炸,向上移动,并增加寿命
if (!this.exploded) {
this.y -= random(5, 10);
this.life += 1;
// 如果烟花达到或超过爆炸高度,爆炸
if (this.y <= this.explodeHeight) {
this.explode();
}
} else {
// 如果烟花已经爆炸,更新和绘制粒子
this.particles.forEach((particle, index) => {
particle.update();
if (particle.life < 0) {
this.particles.splice(index, 1);
}
});
}
}
// 绘制烟花的方法
draw() {
if (!this.exploded) {
ctx.fillStyle = this.color;
ctx.beginPath();
ctx.arc(this.x, this.y, 2, 0, Math.PI * 2);
ctx.fill();
} else {
this.particles.forEach((particle) => particle.draw());
}
}
// 烟花爆炸的方法
explode() {
this.exploded = true;
for (let i = 0; i < 100; i++) {
const angle = random(0, Math.PI * 2);
const speed = random(1, 4);
this.particles.push(new Particle(this.x, this.y, angle, speed, this.color));
}
}
}
// 定义粒子类
class Particle {
constructor(x, y, angle, speed, color) {
this.x = x;
this.y = y;
this.angle = angle;
this.speed = speed;
this.life = random(50, 100);
this.color = color;
}
// 更新粒子状态的方法
update() {
this.x += Math.cos(this.angle) * this.speed;
this.y += Math.sin(this.angle) * this.speed;
this.speed *= 0.99;
this.life -= 1;
}
// 绘制粒子的方法
draw() {
ctx.fillStyle = this.color + ', ' + (this.life / 100) + ')';
ctx.beginPath();
ctx.arc(this.x, this.y, 2, 0, Math.PI * 2);
ctx.fill();
}
}
// 动画函数
function animate() {
// 绘制背景
ctx.fillStyle = 'rgba(0, 0, 0, 0.2)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// 以5%的概率添加新烟花
if (Math.random() < 0.05) {
const x = random(0, canvas.width);
const y = canvas.height;
const fireworkColor = 'hsla(' + random(0, 360) + ', 100%, 50%';
fireworks.push(new Firework(x, y, fireworkColor));
}
// 更新和绘制烟花
for (let i = fireworks.length - 1; i >= 0; i--) {
fireworks[i].update();
fireworks[i].draw();
if (fireworks[i].exploded && fireworks[i].particles.length === 0) {
fireworks.splice(i, 1);
}
}
// 显示文字
ctx.font = "50px Arial";
ctx.fillStyle = "pink";
ctx.textAlign = "center";
ctx.fillText("2024年龙年快乐", canvas.width / 2, canvas.height / 2);
// 继续下一帧动画
requestAnimationFrame(animate);
}
// 启动动画
animate();
// 监听窗口大小变化,重新设置画布大小
window.addEventListener('resize', function() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
});
</script>
</body>
</html>
修改2:加入背景音乐,确保将音乐文件(我这里命名为"background_music.mp3")与HTML文件放在同一目录中。音乐控制按钮应该能够显示在左上角了。效果如下:
源码如下:
<!DOCTYPE html>
<html>
<head>
<title>新年礼花</title>
<style>
/* 设置画布占满整个窗口 */
body {
margin: 0;
padding: 0;
overflow: hidden;
}
canvas {
display: block;
}
.scrolling-text {
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
font-size: 24px;
text-align: center;
color: red;
animation: scrollText 10s linear infinite;
}
@keyframes scrollText {
0% {
top: 100%;
}
100% {
top: -100%;
}
}
.button-container {
position: absolute;
top: 10px;
left: 10px;
}
.button-container button {
padding: 10px 20px;
font-size: 16px;
}
</style>
</head>
<body>
<!-- 创建一个画布 -->
<canvas id="fireworksCanvas"></canvas>
<div class="scrolling-text">
<p>《元日》</p>
<p>宋·王安石</p>
<p>爆竹声中一岁除,</p>
<p>春风送暖入屠苏。</p>
<p>千门万户曈曈日,</p>
<p>总把新桃换旧符。</p>
</div>
<div class="button-container">
<button id="playButton">播放音乐</button>
</div>
<script>
// 获取canvas和context
const canvas = document.getElementById('fireworksCanvas');
const ctx = canvas.getContext('2d');
// 设置canvas宽高为窗口的宽高
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
// 初始化烟花数组
let fireworks = [];
// 定义产生min到max之间的随机数的函数
function random(min, max) {
return Math.random() * (max - min) + min;
}
// 定义烟花类
class Firework {
constructor(x, y, color) {
this.x = x;
this.y = y;
this.particles = [];
this.exploded = false;
this.life = 0;
this.color = color;
this.explodeHeight = random(canvas.height * 0.3, canvas.height * 0.6);
}
// 更新烟花状态的方法
update() {
// 如果烟花还未爆炸,向上移动,并增加寿命
if (!this.exploded) {
this.y -= random(5, 10);
this.life += 1;
// 如果烟花达到或超过爆炸高度,爆炸
if (this.y <= this.explodeHeight) {
this.explode();
}
} else {
// 如果烟花已经爆炸,更新和绘制粒子
this.particles.forEach((particle, index) => {
particle.update();
if (particle.life < 0) {
this.particles.splice(index, 1);
}
});
}
}
// 绘制烟花的方法
draw() {
if (!this.exploded) {
ctx.fillStyle = this.color;
ctx.beginPath();
ctx.arc(this.x, this.y, 2, 0, Math.PI * 2);
ctx.fill();
} else {
this.particles.forEach((particle) => particle.draw());
}
}
// 烟花爆炸的方法
explode() {
this.exploded = true;
for (let i = 0; i < 100; i++) {
const angle = random(0, Math.PI * 2);
const speed = random(1, 4);
this.particles.push(new Particle(this.x, this.y, angle, speed, this.color));
}
}
}
// 定义粒子类
class Particle {
constructor(x, y, angle, speed, color) {
this.x = x;
this.y = y;
this.angle = angle;
this.speed = speed;
this.life = random(50, 100);
this.color = color;
}
// 更新粒子状态的方法
update() {
this.x += Math.cos(this.angle) * this.speed;
this.y += Math.sin(this.angle) * this.speed;
this.speed *= 0.99;
this.life -= 1;
}
// 绘制粒子的方法
draw() {
ctx.fillStyle = this.color + ', ' + (this.life / 100) + ')';
ctx.beginPath();
ctx.arc(this.x, this.y, 2, 0, Math.PI * 2);
ctx.fill();
}
}
// 动画函数
function animate() {
// 绘制背景
ctx.fillStyle = 'rgba(0, 0, 0, 0.2)';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// 以5%的概率添加新烟花
if (Math.random() < 0.05) {
const x = random(0, canvas.width);
const y = canvas.height;
const fireworkColor = 'hsla(' + random(0, 360) + ', 100%, 50%';
fireworks.push(new Firework(x, y, fireworkColor));
}
// 更新和绘制烟花
for (let i = fireworks.length - 1; i >= 0; i--) {
fireworks[i].update();
fireworks[i].draw();
if (fireworks[i].exploded && fireworks[i].particles.length === 0) {
fireworks.splice(i, 1);
}
}
// 显示文字
ctx.font = "50px Arial";
ctx.fillStyle = "pink";
ctx.textAlign = "center";
ctx.fillText("2024年龙年快乐", canvas.width / 2, canvas.height / 2);
// 继续下一帧动画
requestAnimationFrame(animate);
}
// 启动动画
animate();
// 监听窗口大小变化,重新设置画布大小
window.addEventListener('resize', function() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
});
// 播放音乐的按钮点击事件
const playButton = document.getElementById('playButton');
const bgm = new Audio('background_music.mp3');
playButton.addEventListener('click', function() {
if (bgm.paused) {
bgm.play();
playButton.textContent = '暂停音乐';
} else {
bgm.pause();
playButton.textContent = '播放音乐';
}
});
</script>
</body>
</html>
OK!