位置: 文档库 > JavaScript > 怎样使用原生js做出满天星效果

怎样使用原生js做出满天星效果

一览无余 上传于 2025-02-14 00:50

YPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">

YPE html>

### 怎样使用原生JS做出满天星效果

在网页开发中,通过原生JavaScript实现动态视觉效果不仅能提升用户体验,还能展示开发者对前端技术的掌握能力。本文将详细介绍如何使用纯JavaScript(不依赖任何库)创建“满天星”效果——即通过大量随机分布的动态元素模拟星空场景,包括元素生成、动画控制、交互响应等核心功能。

#### 一、效果分析与需求拆解

满天星效果的核心需求包括:

1. **动态元素生成**:在画布或DOM容器中随机生成大量“星星”元素(如圆形、十字形等)。

2. **随机属性控制**:每个星星的位置、大小、颜色、透明度、移动速度等需随机生成。

3. **动画效果**:星星需持续移动(如直线、曲线或随机方向),并可能伴随闪烁、缩放等效果。

4. **交互响应**:用户可通过鼠标移动、点击等操作影响星星行为(如吸引、排斥)。

5. **性能优化**:大量元素同时动画时需避免卡顿,可通过requestAnimationFrame或Canvas优化。

#### 二、实现方案选择

实现满天星效果有两种主流方案:

1. **DOM方案**:通过JavaScript动态创建和操作DOM元素(如`div`),适合简单场景,但元素过多时性能较差。

2. **Canvas方案**:使用``标签和其2D上下文进行绘制,适合复杂动画和大量元素,性能更优。

本文将分别演示两种方案的实现,并对比其优缺点。

#### 三、DOM方案实现

##### 1. 基础结构搭建

首先创建HTML结构,包含一个容器用于放置星星:


    
    
    满天星效果(DOM版)
    


    

##### 2. 星星生成函数

在`stars.js`中编写生成星星的函数,随机设置位置、大小、颜色等属性:


function createStar(container) {
    const star = document.createElement('div');
    star.className = 'star';
    
    // 随机位置(屏幕范围内)
    const x = Math.random() * window.innerWidth;
    const y = Math.random() * window.innerHeight;
    
    // 随机大小(1-3px)
    const size = Math.random() * 2 + 1;
    
    // 随机颜色(白色到浅蓝色)
    const hue = Math.random() * 60 + 180; // 180-240度(蓝色系)
    const saturation = 100;
    const lightness = Math.random() * 50 + 50; // 50-100%
    star.style.backgroundColor = `hsl(${hue}, ${saturation}%, ${lightness}%)`;
    
    // 随机透明度(0.3-1)
    star.style.opacity = Math.random() * 0.7 + 0.3;
    
    // 设置样式
    star.style.width = `${size}px`;
    star.style.height = `${size}px`;
    star.style.left = `${x}px`;
    star.style.top = `${y}px`;
    
    container.appendChild(star);
    return star;
}

##### 3. 批量生成星星

通过循环生成指定数量的星星:


function initStars(container, count) {
    const stars = [];
    for (let i = 0; i 

##### 4. 动画实现

为每个星星添加动画效果,使其沿随机方向移动:


function animateStars(stars) {
    function updateStar(star) {
        // 随机方向(角度)
        const angle = Math.random() * Math.PI * 2;
        // 随机速度(1-3px/帧)
        const speed = Math.random() * 2 + 1;
        
        // 计算位移
        const dx = Math.cos(angle) * speed;
        const dy = Math.sin(angle) * speed;
        
        // 获取当前位置
        const rect = star.getBoundingClientRect();
        let x = rect.left + dx;
        let y = rect.top + dy;
        
        // 边界检测(从另一侧重新出现)
        if (x  window.innerWidth) x = 0;
        if (y  window.innerHeight) y = 0;
        
        // 更新位置
        star.style.left = `${x}px`;
        star.style.top = `${y}px`;
    }
    
    function animate() {
        stars.forEach(updateStar);
        requestAnimationFrame(animate);
    }
    
    animate();
}

// 启动动画
animateStars(stars);

##### 5. 交互增强(鼠标跟随)

添加鼠标跟随效果,使星星靠近鼠标时改变方向:


let mouseX = 0;
let mouseY = 0;

window.addEventListener('mousemove', (e) => {
    mouseX = e.clientX;
    mouseY = e.clientY;
});

function updateStarWithMouse(star) {
    const rect = star.getBoundingClientRect();
    const starX = rect.left + rect.width / 2;
    const starY = rect.top + rect.height / 2;
    
    // 计算与鼠标的距离
    const dx = mouseX - starX;
    const dy = mouseY - starY;
    const distance = Math.sqrt(dx * dx + dy * dy);
    
    // 如果距离小于200px,则向鼠标方向移动
    if (distance 

#### 四、Canvas方案实现

DOM方案在元素过多时性能下降,Canvas方案通过离屏绘制和批量操作更高效。

##### 1. HTML结构


    
    
    满天星效果(Canvas版)
    


    
    


##### 2. 初始化Canvas


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

// 设置画布大小为窗口大小
function resizeCanvas() {
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
}

resizeCanvas();
window.addEventListener('resize', resizeCanvas);

##### 3. 星星类定义

使用类封装星星的属性和行为:


class Star {
    constructor() {
        this.x = Math.random() * canvas.width;
        this.y = Math.random() * canvas.height;
        this.size = Math.random() * 2 + 1;
        this.color = `hsl(${Math.random() * 60 + 180}, 100%, ${Math.random() * 50 + 50}%)`;
        this.opacity = Math.random() * 0.7 + 0.3;
        this.speedX = (Math.random() - 0.5) * 2;
        this.speedY = (Math.random() - 0.5) * 2;
    }
    
    update() {
        this.x += this.speedX;
        this.y += this.speedY;
        
        // 边界检测
        if (this.x  canvas.width) this.speedX *= -1;
        if (this.y  canvas.height) this.speedY *= -1;
    }
    
    draw(ctx) {
        ctx.save();
        ctx.globalAlpha = this.opacity;
        ctx.fillStyle = this.color;
        ctx.beginPath();
        ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
        ctx.fill();
        ctx.restore();
    }
}

##### 4. 批量生成和动画


let stars = [];
const starCount = 500;

function initStars() {
    stars = [];
    for (let i = 0; i  {
        star.update();
        star.draw(ctx);
    });
    
    requestAnimationFrame(animate);
}

initStars();
animate();

##### 5. 鼠标交互增强


let mouseX = 0;
let mouseY = 0;

window.addEventListener('mousemove', (e) => {
    mouseX = e.clientX;
    mouseY = e.clientY;
});

class InteractiveStar extends Star {
    update() {
        const dx = mouseX - this.x;
        const dy = mouseY - this.y;
        const distance = Math.sqrt(dx * dx + dy * dy);
        
        if (distance  3) {
            this.speedX = (this.speedX / speed) * 3;
            this.speedY = (this.speedY / speed) * 3;
        }
        
        this.x += this.speedX;
        this.y += this.speedY;
        
        // 边界检测
        if (this.x  canvas.width) this.speedX *= -1;
        if (this.y  canvas.height) this.speedY *= -1;
    }
}

// 替换为交互式星星
function initInteractiveStars() {
    stars = [];
    for (let i = 0; i 

#### 五、性能优化技巧

1. **减少重绘**:在DOM方案中,避免频繁修改样式,可使用CSS transform替代top/left。

2. **使用requestAnimationFrame**:确保动画与浏览器刷新率同步。

3. **Canvas分层**:将静态背景和动态星星分开绘制,减少不必要的绘制区域。

4. **对象池**:复用星星对象,避免频繁创建和销毁。

5. **降级处理**:在低端设备上减少星星数量或简化动画。

#### 六、总结与扩展

本文通过DOM和Canvas两种方案实现了满天星效果,DOM方案适合简单场景,Canvas方案适合复杂动画。扩展方向包括:

1. 添加流星效果(长条形星星+尾迹)。

2. 实现星座连线(根据距离连接星星)。

3. 添加触摸屏支持。

4. 结合WebGL实现3D星空。

关键词:原生JavaScript、满天星效果、DOM操作、Canvas动画、requestAnimationFrame、交互设计、性能优化

简介:本文详细介绍了如何使用原生JavaScript通过DOM和Canvas两种方案实现满天星效果,包括星星生成、动画控制、鼠标交互和性能优化,适合前端开发者学习动态视觉效果的实现技巧。