基于HTML 使用星辰拼出爱心,并附带闪烁+流星+点击生成流星

代码文件:「基于html实现流星+星辰」,链接:https://pan.quark.cn/s/59679c01ebc5

核心功能概述

该代码实现了以下主要功能:

  1. 动态星空背景:包含闪烁的随机星星和特定图案(心形)排列的星星
  2. 流星动画效果:随机生成流星划过屏幕,带有轨迹和光晕效果
  3. 交互式体验:点击画布任意位置可生成流星
  4. 响应式设计:自动适应窗口大小变化

技术实现分析

基础设置

代码首先获取 Canvas 元素并设置其上下文,通过 resizeCanvas 函数确保画布尺寸与窗口大小一致:

javascript 复制代码
const canvas = document.getElementById('meteorCanvas');
const ctx = canvas.getContext('2d');

function resizeCanvas() {
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
}

星空系统

星空系统由两部分组成:随机背景星星和图案星星。初始化函数 initStars 创建两种类型的星星:

  1. 图案星星:通过数学公式生成心形图案的点,添加适当随机偏移使分布更自然
  2. 背景星星:随机分布在整个画布上的星星

所有星星都具有闪烁效果,通过改变透明度实现,闪烁速度和方向各不相同,增强视觉层次感。

流星系统

流星系统包含以下关键组件:

  1. 随机生成流星createMeteor 函数从屏幕左侧或上方随机位置生成流星,向右下方飞行
  2. 点击生成流星createMeteorAtPosition 函数允许用户在点击位置创建流星
  3. 定时生成scheduleMeteors 函数以随机间隔(0.5-1.5秒)自动生成流星
  4. 动态渲染drawMeteors 函数处理流星的运动轨迹、透明度渐变和消失逻辑

流星视觉效果通过以下技术实现:

  • 使用线性渐变创建流星头部亮、尾部渐隐的效果
  • 添加光晕效果增强视觉冲击力
  • 流星轨迹通过数学计算确保自然流畅的运动路径

动画循环

动画通过 requestAnimationFrame 实现高效循环渲染:

javascript 复制代码
function animate() {
    // 清空画布
    ctx.fillStyle = 'black';
    ctx.fillRect(0, 0, canvas.width, canvas.height);

    // 绘制星星和流星
    drawStars();
    drawMeteors();

    // 请求下一帧
    requestAnimationFrame(animate);
}

图案生成技术

代码中实现了一个灵活的图案生成系统,通过数学公式计算点坐标:

javascript 复制代码
function getPatternPoints(patternType, centerX, centerY, size) {
    // 使用参数方程生成心形图案点
    for (let t = 0; t <= Math.PI * 2; t += 0.05) {
        const x = 20 * Math.pow(Math.sin(t), 3);
        const y = 15 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t);
        // 缩放并定位点
    }
}

用户交互设计

用户交互通过鼠标点击事件实现,点击后会在点击位置生成1-3个流星,使用 setTimeout 添加延迟使效果更自然。点击事件监听器获取相对于 Canvas 的坐标位置,确保流星在正确位置生成。

相关推荐
佛系打工仔2 小时前
绘制K线第二章:背景网格绘制
android·前端·架构
明天好,会的3 小时前
分形生成实验(五):人机协同破局--30万token揭示Actix-web状态管理的微妙边界
运维·服务器·前端
C_心欲无痕4 小时前
nginx - alias 和 root 的区别详解
运维·前端·nginx
我是苏苏6 小时前
Web开发:C#通过ProcessStartInfo动态调用执行Python脚本
java·服务器·前端
无羡仙6 小时前
Vue插槽
前端·vue.js
用户6387994773057 小时前
每组件(Per-Component)与集中式(Centralized)i18n
前端·javascript
SsunmdayKT7 小时前
React + Ts eslint配置
前端
开始学java7 小时前
useEffect 空依赖 + 定时器 = 闭包陷阱?count 永远停在 1 的坑我踩透了
前端
zerosrat7 小时前
从零实现 React Native(2): 跨平台支持
前端·react native