当前位置:首页 > 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 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现下拉菜单

js实现下拉菜单

使用HTML和CSS创建基础结构 HTML部分需要包含一个触发下拉的按钮和隐藏的下拉菜单内容: <div class="dropdown"> <button class="dr…

js实现滑动

js实现滑动

实现滑动效果的方法 在JavaScript中实现滑动效果可以通过多种方式完成,以下是几种常见的实现方法: 使用CSS过渡和JavaScript触发 通过CSS定义过渡效果,JavaScript控制触…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…

js实现按钮点击

js实现按钮点击

实现按钮点击的JavaScript方法 HTML按钮元素 在HTML中创建按钮元素,为其添加id或class以便JavaScript选择: <button id="myButton">点…

js 实现全选

js 实现全选

实现全选功能的方法 使用 JavaScript 实现全选功能通常需要操作复选框(checkbox)的状态。以下是几种常见的实现方式。 通过 DOM 操作实现全选 // 获取全选复选框和子复选框 co…