当前位置:首页 > JavaScript

js实现流星划过

2026-02-02 19:43:39JavaScript

实现流星划过效果的方法

使用JavaScript结合CSS可以实现流星划过夜空的动画效果。以下是具体实现步骤:

HTML结构

创建一个基本的HTML结构,包含一个容纳流星的容器:

<div id="sky"></div>

CSS样式

为流星和夜空添加基本样式:

#sky {
  position: relative;
  width: 100%;
  height: 100vh;
  background: #000;
  overflow: hidden;
}

.meteor {
  position: absolute;
  width: 2px;
  height: 2px;
  background: #fff;
  border-radius: 50%;
  box-shadow: 0 0 10px 3px rgba(255, 255, 255, 0.8);
}

JavaScript实现

通过JavaScript动态创建流星并设置动画:

function createMeteor() {
  const sky = document.getElementById('sky');
  const meteor = document.createElement('div');
  meteor.className = 'meteor';

  // 随机位置
  const startX = Math.random() * window.innerWidth;
  const startY = -10;

  // 随机大小
  const size = Math.random() * 3 + 1;
  meteor.style.width = `${size}px`;
  meteor.style.height = `${size}px`;

  // 随机透明度
  const opacity = Math.random() * 0.8 + 0.2;
  meteor.style.opacity = opacity;

  // 随机颜色(可选)
  const hue = Math.random() * 60 + 180; // 蓝白色调
  meteor.style.background = `hsl(${hue}, 100%, 80%)`;
  meteor.style.boxShadow = `0 0 ${size*3}px ${size}px hsla(${hue}, 100%, 80%, 0.5)`;

  // 设置初始位置
  meteor.style.left = `${startX}px`;
  meteor.style.top = `${startY}px`;

  sky.appendChild(meteor);

  // 动画参数
  const duration = Math.random() * 2000 + 1000;
  const angle = Math.random() * 30 + 60; // 60-90度角
  const distance = Math.random() * 300 + 200;

  // 动画
  const animate = () => {
    const progress = performance.now() % duration / duration;
    if (progress >= 1) {
      sky.removeChild(meteor);
      return;
    }

    const x = startX + Math.sin(angle * Math.PI/180) * distance * progress;
    const y = startY + Math.cos(angle * Math.PI/180) * distance * progress;

    meteor.style.left = `${x}px`;
    meteor.style.top = `${y}px`;
    meteor.style.opacity = opacity * (1 - progress);

    requestAnimationFrame(animate);
  };

  requestAnimationFrame(animate);
}

// 定期创建流星
setInterval(createMeteor, 500);

增强效果

可以添加尾迹效果使流星更逼真:

.meteor::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100px;
  height: 1px;
  background: linear-gradient(90deg, rgba(255,255,255,0.8), transparent);
  transform-origin: left center;
}

性能优化

对于大量流星,可以使用canvas实现更高效的渲染:

js实现流星划过

const canvas = document.createElement('canvas');
document.body.appendChild(canvas);
const ctx = canvas.getContext('2d');

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

// 实现canvas版本的流星动画...

以上代码实现了随机位置、大小、角度和持续时间的流星效果,通过调整参数可以改变流星出现的频率和外观。

标签: 流星js
分享给朋友:

相关文章

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js怎么实现异步

js怎么实现异步

异步实现方法 JavaScript中实现异步操作主要通过以下几种方式: Promise Promise是ES6引入的异步解决方案,用于处理异步操作的成功或失败状态。 const promise =…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…