当前位置: 首页 > article >正文

生日主题的烟花特效HTML,CSS,JS

目录

图片展示

完整代码

关键点解释


图片展示

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>生日烟花特效</title>
    <style>
        body {
            margin: 0;
            overflow: hidden;
            background: #000;
            color: white;
            font-family: 'Arial', sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            flex-direction: column;
        }
        #fireworksCanvas {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
        }
        .happy-birthday {
            position: relative;
            z-index: 10;
            font-size: 3rem;
            font-weight: bold;
            text-align: center;
            color: #fff;
            text-shadow: 0 0 20px rgba(255, 255, 255, 0.8),
                         0 0 30px rgba(255, 255, 0, 0.8),
                         0 0 40px rgba(255, 0, 0, 0.8);
            animation: glow 2s infinite alternate;
        }
        @keyframes glow {
            from {
                text-shadow: 0 0 10px rgba(255, 255, 255, 0.6),
                             0 0 20px rgba(255, 255, 0, 0.6),
                             0 0 30px rgba(255, 0, 0, 0.6);
            }
            to {
                text-shadow: 0 0 20px rgba(255, 255, 255, 0.8),
                             0 0 40px rgba(255, 255, 0, 0.8),
                             0 0 60px rgba(255, 0, 0, 0.8);
            }
        }
    </style>
</head>
<body>
    <canvas id="fireworksCanvas"></canvas>
    <div class="happy-birthday">🎉 生日快乐!🎉</div>

    <script>
        // 初始化画布
        const canvas = document.getElementById('fireworksCanvas');
        const ctx = canvas.getContext('2d');
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;

        // 烟花类
        class Firework {
            constructor(x, y, colors) {
                this.x = x;
                this.y = y;
                this.colors = colors;
                this.particles = [];
                this.createParticles();
            }

            createParticles() {
                for (let i = 0; i < 100; i++) {
                    const angle = Math.random() * 2 * Math.PI;
                    const speed = Math.random() * 4 + 2;
                    const color = this.colors[Math.floor(Math.random() * this.colors.length)];
                    this.particles.push({
                        x: this.x,
                        y: this.y,
                        vx: Math.cos(angle) * speed,
                        vy: Math.sin(angle) * speed,
                        alpha: 1,
                        color: color
                    });
                }
            }

            update() {
                this.particles.forEach(p => {
                    p.x += p.vx;
                    p.y += p.vy;
                    p.alpha -= 0.02;
                });
                this.particles = this.particles.filter(p => p.alpha > 0);
            }

            draw() {
                this.particles.forEach(p => {
                    ctx.save();
                    ctx.globalAlpha = p.alpha;
                    ctx.fillStyle = p.color;
                    ctx.beginPath();
                    ctx.arc(p.x, p.y, 3, 0, Math.PI * 2);
                    ctx.fill();
                    ctx.restore();
                });
            }

            isDone() {
                return this.particles.length === 0;
            }
        }

        // 声明 fireworks 为 let
        let fireworks = [];
        const colors = ['#ff3d3d', '#ff9c3d', '#ffe03d', '#3dff83', '#3db9ff', '#9c3dff', '#ff3de8'];

        // 添加烟花
        function addFirework() {
            const x = Math.random() * canvas.width;
            const y = Math.random() * canvas.height / 2;
            fireworks.push(new Firework(x, y, colors));
        }

        // 主循环
        function loop() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            if (Math.random() < 0.05) addFirework();

            fireworks.forEach(firework => {
                firework.update();
                firework.draw();
            });

            // 重新赋值,确保 fireworks 变量可变
            fireworks = fireworks.filter(firework => !firework.isDone());
            requestAnimationFrame(loop);
        }

        loop();

        // 窗口大小调整
        window.addEventListener('resize', () => {
            canvas.width = window.innerWidth;
            canvas.height = window.innerHeight;
        });
    </script>
</body>
</html>

关键点解释

  1. 修复错误

    • fireworks 声明改为 let,确保可以在循环中通过 fireworks = fireworks.filter(...) 重新赋值。
  2. 烟花功能

    • 每个烟花是由 Firework 类生成的粒子组成,模拟了绚丽的散开效果。
  3. 生日主题

    • 中心的文字动画通过 @keyframes glow 实现,配合文字 🎉 生日快乐!🎉 增加了节日氛围。
  4. 响应式设计

    • 监听 resize 事件,确保画布随窗口调整大小。

嗨,我是命运之光。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉 ,获取最新动态,⚡️ 让信息传递更加迅速。


http://www.kler.cn/a/405290.html

相关文章:

  • Vscode写markdown快速插入python代码
  • 本地部署与外部部署有何不同?
  • java 并发编程 (1)java中如何实现并发编程
  • 【Three.js基础学习】28.Coffee Smoke
  • 工程师 - 智能家居方案介绍
  • Elasticsearch-Elasticsearch-Rest-Client(三)
  • 20241121 android中树结构列表(使用recyclerView实现)
  • 【K8S系列】imagePullSecrets配置正确,但docker pull仍然失败,进一步排查详细步骤
  • java: spire.pdf.free 9.12.3 create pdf
  • Android 应用添加系统签名权限介绍
  • reactflow 中 useOnViewportChange 模块作用
  • 异构网络,赋能企业的智能连接
  • Next.js 入门指南:深入构建服务器渲染的现代 Web 应用
  • SpringBoot(二十七)SpringBoot集成XRebel实现异常定位
  • VMware 中 虚拟机【Linux系统】固定 ip 访问
  • 【Docker】Docker介绍|部署|简单使用|镜像操作|容器操作|自动构建镜像
  • 通过vite+vue3+pinia从0到1搭建一个uniapp应用
  • Element UI 组件库详解【Vue】
  • Ubuntu查看磁盘IO情况常用方法
  • Shell脚本2 -- 永久环境变量与字符串操作
  • 以太坊交易处理全流程:数据采集、价格查询与问题解决
  • Ubuntu问题 -- 设置ubuntu的IP为静态IP (图形化界面设置) 小白友好
  • 测试实项中的偶必现难测bug之模糊匹配逻辑
  • 基于IPMI_SSH的服务器硬件监控指标解读
  • Leetcode 完全二叉树的节点个数
  • application/json 和 application/x-www-form-urlencoded 区别