当前位置:首页 > JavaScript

js实现星空

2026-04-06 05:45:35JavaScript

以下是使用JavaScript实现星空效果的几种方法,结合HTML5 Canvas和CSS动画技术:

使用Canvas绘制星空

创建Canvas元素并初始化:

<canvas id="starCanvas"></canvas>

JavaScript实现代码:

js实现星空

const canvas = document.getElementById('starCanvas');
const ctx = canvas.getContext('2d');

// 设置Canvas为全屏
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;

// 生成星星数组
const stars = Array(200).fill().map(() => ({
  x: Math.random() * canvas.width,
  y: Math.random() * canvas.height,
  size: Math.random() * 3,
  speed: Math.random() * 0.2
}));

function animate() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  stars.forEach(star => {
    ctx.beginPath();
    ctx.arc(star.x, star.y, star.size, 0, Math.PI * 2);
    ctx.fillStyle = 'white';
    ctx.fill();

    star.y += star.speed;
    if (star.y > canvas.height) {
      star.y = 0;
      star.x = Math.random() * canvas.width;
    }
  });

  requestAnimationFrame(animate);
}

animate();

// 窗口大小改变时重置Canvas
window.addEventListener('resize', () => {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
});

使用CSS动画实现星空

HTML结构:

<div class="stars-container"></div>

CSS样式:

js实现星空

.stars-container {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  overflow: hidden;
  z-index: -1;
}

.star {
  position: absolute;
  background: white;
  border-radius: 50%;
  animation: twinkle var(--duration) infinite ease-in-out;
}

@keyframes twinkle {
  0%, 100% { opacity: 0.2; }
  50% { opacity: 1; }
}

JavaScript生成星星:

const container = document.querySelector('.stars-container');
const starCount = 200;

for (let i = 0; i < starCount; i++) {
  const star = document.createElement('div');
  star.classList.add('star');

  const size = Math.random() * 3;
  star.style.width = `${size}px`;
  star.style.height = `${size}px`;
  star.style.left = `${Math.random() * 100}%`;
  star.style.top = `${Math.random() * 100}%`;
  star.style.setProperty('--duration', `${Math.random() * 5 + 3}s`);

  container.appendChild(star);
}

添加流星效果

在Canvas版本中增加流星:

// 流星对象
const shootingStar = {
  x: 0,
  y: 0,
  size: 3,
  speed: 5,
  angle: Math.PI / 4,
  length: 100,
  active: false
};

function createShootingStar() {
  shootingStar.x = Math.random() * canvas.width;
  shootingStar.y = -20;
  shootingStar.angle = Math.random() * Math.PI / 4 + Math.PI / 8;
  shootingStar.active = true;
}

// 在animate函数中添加
if (shootingStar.active) {
  ctx.beginPath();
  ctx.moveTo(shootingStar.x, shootingStar.y);
  ctx.lineTo(
    shootingStar.x - Math.cos(shootingStar.angle) * shootingStar.length,
    shootingStar.y + Math.sin(shootingStar.angle) * shootingStar.length
  );
  ctx.lineWidth = shootingStar.size;
  ctx.strokeStyle = 'rgba(255, 255, 255, 0.7)';
  ctx.stroke();

  shootingStar.x += Math.cos(shootingStar.angle) * shootingStar.speed;
  shootingStar.y += Math.sin(shootingStar.angle) * shootingStar.speed;

  if (shootingStar.y > canvas.height) {
    shootingStar.active = false;
    setTimeout(createShootingStar, Math.random() * 3000 + 2000);
  }
} else if (Math.random() < 0.001) {
  createShootingStar();
}

这些方法可以单独使用或组合使用,Canvas版本适合需要动态交互的场景,CSS版本性能开销更小适合静态背景。流星效果可以增强视觉冲击力,所有代码都考虑了响应式设计,会自动适应窗口大小变化。

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

相关文章

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现防洪

js实现防洪

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

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 const…

js实现弹框

js实现弹框

使用 alert 实现简单弹框 JavaScript 的 alert 方法可以直接显示一个简单的弹框,内容为纯文本: alert("这是一个简单的弹框"); 使用 confirm 实现确认弹框…