客制化里面加ccs:
ccs展开代码.snow-container { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: -1; overflow: hidden; } .snowflake { position: absolute; will-change: transform; user-select: none; text-shadow: 0 0 6px rgba(255, 255, 255, 0.7); /* 确保GPU加速 */ transform: translate3d(0, 0, 0); backface-visibility: hidden; }
客制化里面加js:
js展开代码class SnowflakeSystem {
  constructor() {
    this.snowflakes = [];
    this.snowflakeChars = ['❄', '❅', '❆', '✻', '✼', '❄️'];
    this.snowflakeCount = Math.min(120, Math.floor(window.innerWidth * window.innerHeight / 4000)); // 增加雪花数量
    this.isRunning = false;
    this.lastUpdateTime = 0;
    this.init();
  }
  init() {
    // 创建雪花容器
    this.container = document.createElement('div');
    this.container.className = 'snow-container';
    this.container.style.position = 'fixed';
    this.container.style.top = '0';
    this.container.style.left = '0';
    this.container.style.width = '100%';
    this.container.style.height = '100%';
    this.container.style.pointerEvents = 'none';
    this.container.style.zIndex = '-1';
    this.container.style.overflow = 'hidden';
    document.body.appendChild(this.container);
    // 创建雪花 - 主要分布在两侧
    for (let i = 0; i < this.snowflakeCount; i++) {
      this.addSnowflake();
    }
    
    this.start();
  }
  addSnowflake() {
    const snowflake = this.createSnowflake();
    this.snowflakes.push(snowflake);
    this.container.appendChild(snowflake.element);
    return snowflake;
  }
  createSnowflake() {
    const element = document.createElement('div');
    element.className = 'snowflake';
    element.style.position = 'absolute';
    element.style.willChange = 'transform';
    element.style.userSelect = 'none';
    
    // 随机选择雪花字符
    const char = this.snowflakeChars[Math.floor(Math.random() * this.snowflakeChars.length)];
    element.textContent = char;
    
    // 随机大小
    const size = 0.3 + Math.random() * 0.7;
    element.style.fontSize = `${size}em`;
    
    // 随机透明度
    const opacity = 0.2 + Math.random() * 0.5;
    element.style.opacity = opacity;
    
    // 随机颜色(白色或浅蓝色)
    const colors = ['#ffffff', '#e6f7ff', '#d1f0ff'];
    element.style.color = colors[Math.floor(Math.random() * colors.length)];
    
    // 初始位置 - 主要分布在屏幕两侧
    let x;
    const screenThird = window.innerWidth / 3;
    
    // 70%的雪花分布在两侧区域
    if (Math.random() < 0.7) {
      // 左侧区域 (0-1/3宽度)
      if (Math.random() < 0.5) {
        x = Math.random() * screenThird;
      } 
      // 右侧区域 (2/3-全宽)
      else {
        x = screenThird * 2 + Math.random() * screenThird;
      }
    } 
    // 30%的雪花分布在中间区域
    else {
      x = screenThird + Math.random() * screenThird;
    }
    
    const y = -50 - Math.random() * 100;
    
    // 应用初始位置
    element.style.transform = `translate3d(${x}px, ${y}px, 0)`;
    
    return {
      element: element,
      x: x,
      y: y,
      speed: 0.5 + Math.random() * 1.5,
      drift: (Math.random() - 0.5) * 0.8,
      size: size,
      // 添加区域标识:0=左侧, 1=中间, 2=右侧
      zone: x < screenThird ? 0 : (x > screenThird * 2 ? 2 : 1)
    };
  }
  resetSnowflake(snowflake) {
    const screenThird = window.innerWidth / 3;
    
    // 根据当前区域决定重置位置
    if (snowflake.zone === 0) {
      // 左侧区域重置
      snowflake.x = Math.random() * screenThird;
    } else if (snowflake.zone === 2) {
      // 右侧区域重置
      snowflake.x = screenThird * 2 + Math.random() * screenThird;
    } else {
      // 中间区域重置
      snowflake.x = screenThird + Math.random() * screenThird;
    }
    
    snowflake.y = -50 - Math.random() * 100;
    snowflake.speed = 0.5 + Math.random() * 1.5;
    snowflake.drift = (Math.random() - 0.5) * 0.8;
  }
  update(timestamp) {
    if (!this.lastUpdateTime) this.lastUpdateTime = timestamp;
    const deltaTime = timestamp - this.lastUpdateTime;
    this.lastUpdateTime = timestamp;
    
    // 确保最小时间间隔
    if (deltaTime > 100) return;
    
    // 基于时间差更新位置
    const deltaFactor = Math.min(deltaTime / 16, 2.5);
    
    this.snowflakes.forEach(snowflake => {
      // 更新位置
      snowflake.y += snowflake.speed * deltaFactor;
      
      // 两侧区域的雪花漂移幅度更大
      if (snowflake.zone === 0 || snowflake.zone === 2) {
        snowflake.x += snowflake.drift * deltaFactor * 1.5;
      } else {
        snowflake.x += snowflake.drift * deltaFactor * 0.5;
      }
      
      // 边界检查
      if (snowflake.y > window.innerHeight + 50) {
        this.resetSnowflake(snowflake);
      }
      
      // 水平边界处理 - 只在两侧区域循环
      if (snowflake.zone !== 1) {
        if (snowflake.x > window.innerWidth + 50) {
          snowflake.x = -50;
        } else if (snowflake.x < -50) {
          snowflake.x = window.innerWidth + 50;
        }
      }
      
      // 应用位置
      snowflake.element.style.transform = `translate3d(${snowflake.x}px, ${snowflake.y}px, 0)`;
    });
  }
  start() {
    if (this.isRunning) return;
    this.isRunning = true;
    this.lastUpdateTime = 0;
    
    const animate = (timestamp) => {
      if (!this.isRunning) return;
      this.update(timestamp);
      requestAnimationFrame(animate);
    };
    
    requestAnimationFrame(animate);
  }
  stop() {
    this.isRunning = false;
  }
  handleResize() {
    // 更新容器尺寸
    this.container.style.width = `${window.innerWidth}px`;
    this.container.style.height = `${window.innerHeight}px`;
    
    // 调整现有雪花位置
    const screenThird = window.innerWidth / 3;
    
    this.snowflakes.forEach(snowflake => {
      // 重新计算区域
      snowflake.zone = snowflake.x < screenThird ? 0 : (snowflake.x > screenThird * 2 ? 2 : 1);
      
      // 如果雪花在中间区域,稍微调整位置
      if (snowflake.zone === 1 && Math.random() < 0.3) {
        // 30%概率将中间区域的雪花移到两侧
        if (Math.random() < 0.5) {
          snowflake.x = Math.random() * screenThird;
          snowflake.zone = 0;
        } else {
          snowflake.x = screenThird * 2 + Math.random() * screenThird;
          snowflake.zone = 2;
        }
      }
      
      snowflake.element.style.transform = `translate3d(${snowflake.x}px, ${snowflake.y}px, 0)`;
    });
  }
}
// 创建雪花系统实例
let snowSystem;
window.addEventListener('DOMContentLoaded', () => {
  snowSystem = new SnowflakeSystem();
});
// 防抖的resize处理
let resizeTimeout;
window.addEventListener('resize', () => {
  clearTimeout(resizeTimeout);
  resizeTimeout = setTimeout(() => {
    if (snowSystem) snowSystem.handleResize();
  }, 100);
});
// 页面可见性控制
document.addEventListener('visibilitychange', () => {
  if (snowSystem) {
    document.hidden ? snowSystem.stop() : snowSystem.start();
  }
});


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!