JavaScript雪花背景动画模板
冬天到了,是否有想过给你的网站也添加一个雪花背景动画,让它更有氛围感呢?
如果你由此需求,那么这个素材模板正好适合你。
下面我是一个优雅的雪花背景动画模板,这个模板可以添加到任何网页中,营造冬季氛围。
实现代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>雪花背景动画模板</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            background: linear-gradient(135deg, #1a2a6c, #2a3a7c, #3a4a8c);
            color: white;
            min-height: 100vh;
            overflow-x: hidden;
            position: relative;
        }
        
        .container {
            max-width: 1200px;
            margin: 0 auto;
            padding: 2rem;
            position: relative;
            z-index: 10;
        }
        
        header {
            text-align: center;
            padding: 2rem 0;
            margin-bottom: 2rem;
        }
        
        h1 {
            font-size: 3rem;
            margin-bottom: 1rem;
            text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
        }
        
        .subtitle {
            font-size: 1.2rem;
            opacity: 0.9;
            max-width: 600px;
            margin: 0 auto;
        }
        
        .content {
            display: flex;
            flex-wrap: wrap;
            gap: 2rem;
            justify-content: center;
        }
        
        .card {
            background: rgba(255, 255, 255, 0.1);
            backdrop-filter: blur(10px);
            border-radius: 15px;
            padding: 1.5rem;
            width: 300px;
            box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
            border: 1px solid rgba(255, 255, 255, 0.1);
            transition: transform 0.3s ease;
        }
        
        .card:hover {
            transform: translateY(-5px);
        }
        
        .card h2 {
            margin-bottom: 1rem;
            color: #a8d8ff;
        }
        
        .controls {
            background: rgba(255, 255, 255, 0.1);
            backdrop-filter: blur(10px);
            border-radius: 15px;
            padding: 1.5rem;
            margin: 2rem auto;
            max-width: 600px;
            box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
            border: 1px solid rgba(255, 255, 255, 0.1);
        }
        
        .control-group {
            display: flex;
            flex-wrap: wrap;
            gap: 1rem;
            justify-content: center;
            margin-top: 1rem;
        }
        
        button {
            background: rgba(168, 216, 255, 0.2);
            border: 1px solid rgba(168, 216, 255, 0.4);
            color: white;
            padding: 0.5rem 1rem;
            border-radius: 5px;
            cursor: pointer;
            transition: all 0.3s ease;
        }
        
        button:hover {
            background: rgba(168, 216, 255, 0.3);
        }
        
        button.active {
            background: rgba(168, 216, 255, 0.5);
        }
        
        #snow-container {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            pointer-events: none;
            z-index: 1;
        }
        
        .snowflake {
            position: absolute;
            background: white;
            border-radius: 50%;
            opacity: 0.8;
            filter: blur(0.5px);
        }
        
        footer {
            text-align: center;
            margin-top: 3rem;
            padding: 1rem;
            font-size: 0.9rem;
            opacity: 0.7;
        }
        
        @media (max-width: 768px) {
            h1 {
                font-size: 2rem;
            }
            
            .card {
                width: 100%;
            }
        }
    </style>
</head>
<body>
    <div id="snow-container"></div>
    
    <div class="container">
        <header>
            <h1>❄️ 雪花背景动画模板 ❄️</h1>
            <p class="subtitle">一个优雅的JavaScript雪花背景效果,可自定义雪花数量、大小和速度</p>
        </header>
        
        <div class="content">
            <div class="card">
                <h2>特性介绍</h2>
                <p>这个模板包含多种雪花效果:</p>
                <ul style="margin-left: 1.5rem; margin-top: 0.5rem;">
                    <li>不同形状和大小的雪花</li>
                    <li>随机飘落速度和方向</li>
                    <li>逼真的旋转动画</li>
                    <li>响应式设计</li>
                    <li>性能优化</li>
                </ul>
            </div>
            
            <div class="card">
                <h2>使用说明</h2>
                <p>您可以通过下方的控制面板调整雪花效果:</p>
                <ul style="margin-left: 1.5rem; margin-top: 0.5rem;">
                    <li>调整雪花数量</li>
                    <li>改变雪花大小</li>
                    <li>控制雪花速度</li>
                    <li>切换雪花样式</li>
                </ul>
            </div>
            
            <div class="card">
                <h2>技术实现</h2>
                <p>这个效果使用纯JavaScript实现:</p>
                <ul style="margin-left: 1.5rem; margin-top: 0.5rem;">
                    <li>Canvas或DOM元素渲染</li>
                    <li>requestAnimationFrame实现流畅动画</li>
                    <li>CSS3变换和过渡效果</li>
                    <li>响应式布局设计</li>
                </ul>
            </div>
        </div>
        
        <div class="controls">
            <h2 style="text-align: center;">雪花效果控制</h2>
            <div class="control-group">
                <button id="snow-density-low">少量雪花</button>
                <button id="snow-density-medium" class="active">中等雪花</button>
                <button id="snow-density-high">大量雪花</button>
            </div>
            <div class="control-group">
                <button id="snow-size-small">小雪花</button>
                <button id="snow-size-medium" class="active">中雪花</button>
                <button id="snow-size-large">大雪花</button>
            </div>
            <div class="control-group">
                <button id="snow-speed-slow">慢速</button>
                <button id="snow-speed-medium" class="active">中速</button>
                <button id="snow-speed-fast">快速</button>
            </div>
            <div class="control-group">
                <button id="snow-style-simple">简单样式</button>
                <button id="snow-style-realistic" class="active">逼真样式</button>
            </div>
        </div>
        
        <footer>
            <p>JavaScript雪花背景模板 © 2023 - 可自由使用和修改</p>
        </footer>
    </div>
    <script>
        // 雪花动画核心代码
        class Snowfall {
            constructor(container) {
                this.container = container;
                this.snowflakes = [];
                this.settings = {
                    density: 'medium', // low, medium, high
                    size: 'medium',    // small, medium, large
                    speed: 'medium',   // slow, medium, fast
                    style: 'realistic' // simple, realistic
                };
                
                this.init();
                this.createSnowflakes();
                this.animate();
                this.setupEventListeners();
            }
            
            init() {
                // 根据设置确定雪花数量
                this.getSnowflakeCount();
            }
            
            getSnowflakeCount() {
                switch(this.settings.density) {
                    case 'low': return 50;
                    case 'medium': return 150;
                    case 'high': return 300;
                    default: return 150;
                }
            }
            
            getSnowflakeSize() {
                switch(this.settings.size) {
                    case 'small': return { min: 1, max: 3 };
                    case 'medium': return { min: 2, max: 5 };
                    case 'large': return { min: 3, max: 8 };
                    default: return { min: 2, max: 5 };
                }
            }
            
            getSnowflakeSpeed() {
                switch(this.settings.speed) {
                    case 'slow': return { min: 0.5, max: 2 };
                    case 'medium': return { min: 1, max: 3 };
                    case 'fast': return { min: 2, max: 5 };
                    default: return { min: 1, max: 3 };
                }
            }
            
            createSnowflakes() {
                // 清除现有雪花
                this.container.innerHTML = '';
                this.snowflakes = [];
                
                const count = this.getSnowflakeCount();
                const sizeRange = this.getSnowflakeSize();
                const speedRange = this.getSnowflakeSpeed();
                
                for (let i = 0; i < count; i++) {
                    this.createSnowflake(sizeRange, speedRange);
                }
            }
            
            createSnowflake(sizeRange, speedRange) {
                const snowflake = document.createElement('div');
                snowflake.classList.add('snowflake');
                
                // 随机大小
                const size = Math.random() * (sizeRange.max - sizeRange.min) + sizeRange.min;
                snowflake.style.width = `${size}px`;
                snowflake.style.height = `${size}px`;
                
                // 随机透明度
                snowflake.style.opacity = Math.random() * 0.5 + 0.5;
                
                // 随机起始位置
                const startX = Math.random() * window.innerWidth;
                snowflake.style.left = `${startX}px`;
                snowflake.style.top = `${-10}px`;
                
                // 雪花数据
                const snowflakeData = {
                    element: snowflake,
                    x: startX,
                    y: -10,
                    speed: Math.random() * (speedRange.max - speedRange.min) + speedRange.min,
                    amplitude: Math.random() * 20 + 10, // 摆动幅度
                    frequency: Math.random() * 0.02 + 0.01, // 摆动频率
                    angle: 0,
                    spin: Math.random() * 2 - 1 // 旋转速度
                };
                
                // 逼真样式添加模糊和阴影
                if (this.settings.style === 'realistic') {
                    snowflake.style.boxShadow = '0 0 5px rgba(255, 255, 255, 0.5)';
                }
                
                this.container.appendChild(snowflake);
                this.snowflakes.push(snowflakeData);
            }
            
            animate() {
                this.snowflakes.forEach(snowflake => {
                    // 更新位置
                    snowflake.y += snowflake.speed;
                    snowflake.angle += snowflake.frequency;
                    snowflake.x += Math.sin(snowflake.angle) * 0.5; // 轻微左右摆动
                    
                    // 旋转雪花
                    snowflake.element.style.transform = `rotate(${snowflake.angle * 20}deg)`;
                    
                    // 如果雪花飘出屏幕,重置到顶部
                    if (snowflake.y > window.innerHeight) {
                        snowflake.y = -10;
                        snowflake.x = Math.random() * window.innerWidth;
                    }
                    
                    // 应用新位置
                    snowflake.element.style.left = `${snowflake.x}px`;
                    snowflake.element.style.top = `${snowflake.y}px`;
                });
                
                requestAnimationFrame(() => this.animate());
            }
            
            updateSettings(setting, value) {
                this.settings[setting] = value;
                this.createSnowflakes();
            }
            
            setupEventListeners() {
                // 雪花数量控制
                document.getElementById('snow-density-low').addEventListener('click', () => {
                    this.updateSettings('density', 'low');
                    this.updateActiveButton('snow-density');
                });
                
                document.getElementById('snow-density-medium').addEventListener('click', () => {
                    this.updateSettings('density', 'medium');
                    this.updateActiveButton('snow-density');
                });
                
                document.getElementById('snow-density-high').addEventListener('click', () => {
                    this.updateSettings('density', 'high');
                    this.updateActiveButton('snow-density');
                });
                
                // 雪花大小控制
                document.getElementById('snow-size-small').addEventListener('click', () => {
                    this.updateSettings('size', 'small');
                    this.updateActiveButton('snow-size');
                });
                
                document.getElementById('snow-size-medium').addEventListener('click', () => {
                    this.updateSettings('size', 'medium');
                    this.updateActiveButton('snow-size');
                });
                
                document.getElementById('snow-size-large').addEventListener('click', () => {
                    this.updateSettings('size', 'large');
                    this.updateActiveButton('snow-size');
                });
                
                // 雪花速度控制
                document.getElementById('snow-speed-slow').addEventListener('click', () => {
                    this.updateSettings('speed', 'slow');
                    this.updateActiveButton('snow-speed');
                });
                
                document.getElementById('snow-speed-medium').addEventListener('click', () => {
                    this.updateSettings('speed', 'medium');
                    this.updateActiveButton('snow-speed');
                });
                
                document.getElementById('snow-speed-fast').addEventListener('click', () => {
                    this.updateSettings('speed', 'fast');
                    this.updateActiveButton('snow-speed');
                });
                
                // 雪花样式控制
                document.getElementById('snow-style-simple').addEventListener('click', () => {
                    this.updateSettings('style', 'simple');
                    this.updateActiveButton('snow-style');
                });
                
                document.getElementById('snow-style-realistic').addEventListener('click', () => {
                    this.updateSettings('style', 'realistic');
                    this.updateActiveButton('snow-style');
                });
                
                // 窗口大小变化时重新创建雪花
                window.addEventListener('resize', () => {
                    this.createSnowflakes();
                });
            }
            
            updateActiveButton(buttonGroup) {
                // 移除同组所有按钮的active类
                const buttons = document.querySelectorAll(`[id^="${buttonGroup}"]`);
                buttons.forEach(btn => btn.classList.remove('active'));
                
                // 为当前点击的按钮添加active类
                event.target.classList.add('active');
            }
        }
        
        // 初始化雪花效果
        document.addEventListener('DOMContentLoaded', () => {
            const snowContainer = document.getElementById('snow-container');
            new Snowfall(snowContainer);
        });
    </script>
</body>
</html>功能特点
- 可自定义的雪花效果:
- 可调整雪花数量(少量/中等/大量)
- 可调整雪花大小(小/中/大)
- 可调整雪花飘落速度(慢/中/快)
- 可选择雪花样式(简单/逼真)
 
- 视觉效果:
- 雪花随机大小和透明度
- 自然飘落路径,带有轻微摆动
- 旋转动画增强真实感
- 响应式设计,适应不同屏幕
 
- 性能优化:
- 使用requestAnimationFrame实现流畅动画
- 控制雪花数量避免性能问题
- 窗口大小变化时自动调整
 
使用方法
直接将上述代码复制到HTML文件中,在浏览器中打开即可看到效果。您可以通过控制面板调整雪花效果,也可以根据需求修改代码中的参数。
这个JavaScript雪花背景动画模板可以轻松集成到任何网页中,为您的网站添加冬季氛围!