Cách tạo hiệu ứng tuyết rơi giáng sinh cho Web WordPress

539 lượt xem
-
13/12/2025
Zoom text
Zoom text

Mùa Giáng sinh đang đến gần, và không gì tuyệt vời hơn việc thêm hiệu ứng tuyết rơi lãng mạn cho website WordPress của bạn. Trong bài viết này, ToanWeb sẽ hướng dẫn bạn cách tạo hiệu ứng tuyết rơi giáng sinh cho Web WordPress chuyên nghiệp bằng JavaScript thuần, không cần plugin, chỉ cần copy code vào file functions.php.

Tại Sao Nên Tạo Hiệu Ứng Tuyết Bằng JavaScript Thuần?

Sử dụng JavaScript thuần mang lại nhiều lợi ích vượt trội so với việc cài đặt plugin:

Hiệu suất tối ưu: Không phải tải thêm plugin nặng nề, code được tối ưu hóa cho từng website cụ thể.

Kiểm soát hoàn toàn: Bạn có thể tùy chỉnh mọi chi tiết từ số lượng bông tuyết, kích thước, tốc độ rơi đến màu sắc.

Không phụ thuộc bên thứ ba: Không lo plugin ngừng cập nhật hoặc xung đột với các plugin khác.

Hướng Dẫn Chi Tiết Tạo Hiệu Ứng Tuyết Rơi

Bước 1: Backup Website

Trước khi thực hiện bất kỳ thay đổi nào với file functions.php, hãy backup toàn bộ website. Bạn có thể sử dụng plugin backup như UpdraftPlus hoặc tải file về máy qua FTP.

Bước 2: Truy Cập File Functions.php

Có hai cách để truy cập file functions.php:

Cách 1 – Qua Dashboard WordPress:

  • Vào Appearance > Theme File Editor
  • Chọn file functions.php ở cột bên phải
  • Lưu ý: Một số hosting có thể tắt tính năng này vì lý do bảo mật

Cách 2 – Qua FTP/File Manager:

  • Truy cập hosting qua FTP hoặc File Manager trong cPanel
  • Điều hướng đến wp-content/themes/[tên-theme-của-bạn]/
  • Mở file functions.php

Bước 3: Copy Code Vào Functions.php

Sao chép toàn bộ đoạn code sau và dán vào cuối file functions.php (trước thẻ đóng ?> nếu có):

function toanweb_snow_effect_css() {
    // Chỉ hiển thị ở frontend, không hiển thị trong admin
    if (is_admin()) {
        return;
    }
    
    // Tùy chọn: Chỉ hiển thị trong tháng 12 và tháng 1
    $current_month = date('n');
    if ($current_month != 12 && $current_month != 1) {
        return;
    }
    
    ?>
    <style id="toanweb-snow-css">
        /* Container tuyết */
        .toanweb-snowflakes {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            pointer-events: none;
            z-index: 9999;
            overflow: hidden;
        }
        
        /* Hidden state */
        .toanweb-snowflakes.hidden {
            display: none;
        }
        
        /* Bông tuyết - Hình tròn trắng */
        .toanweb-snowflake {
            position: absolute;
            top: -10px;
            width: 8px;
            height: 8px;
            background: #fff;
            border-radius: 50%;
            opacity: 0.8;
            animation: toanweb-fall linear infinite;
            will-change: transform;
            box-shadow: 0 0 10px rgba(255, 255, 255, 0.8);
        }
        
        /* Animation rơi */
        @keyframes toanweb-fall {
            to {
                transform: translateY(100vh) rotate(360deg);
            }
        }
        
        /* Tắt trên mobile để tối ưu */
        @media (max-width: 768px) {
            .toanweb-snowflakes {
                display: none;
            }
        }
        
        /* Toggle button */
        .toanweb-snow-toggle {
            position: fixed;
            bottom: 20px;
            right: 20px;
            z-index: 10000;
            background: rgba(255, 255, 255, 0.9);
            border: none;
            border-radius: 50%;
            width: 50px;
            height: 50px;
            cursor: pointer;
            box-shadow: 0 2px 10px rgba(0,0,0,0.2);
            font-size: 20px;
            transition: transform 0.3s ease;
        }
        
        .toanweb-snow-toggle:hover {
            transform: scale(1.1);
        }
        
        @media (max-width: 768px) {
            .toanweb-snow-toggle {
                display: none;
            }
        }
    </style>
    
    <script>
    (function() {
        'use strict';
        
        // Cấu hình
        const CONFIG = {
            snowflakeCount: 50, // Số lượng bông tuyết
            minSize: 2,  // Kích thước nhỏ nhất (px)
            maxSize: 6,  // Kích thước lớn nhất (px)
            minDuration: 10, // Thời gian rơi nhanh nhất (giây)
            maxDuration: 20  // Thời gian rơi chậm nhất (giây)
        };
        
        // Kiểm tra localStorage
        const isSnowHidden = localStorage.getItem('toanwebSnowHidden') === 'true';
        
        // Tạo container
        const container = document.createElement('div');
        container.className = 'toanweb-snowflakes' + (isSnowHidden ? ' hidden' : '');
        
        // Tạo bông tuyết
        function createSnowflake() {
            const snowflake = document.createElement('div');
            snowflake.className = 'toanweb-snowflake';
            
            // Random vị trí và thuộc tính
            const size = CONFIG.minSize + Math.random() * (CONFIG.maxSize - CONFIG.minSize);
            const duration = CONFIG.minDuration + Math.random() * (CONFIG.maxDuration - CONFIG.minDuration);
            const delay = Math.random() * duration;
            const left = Math.random() * 100;
            const opacity = 0.5 + Math.random() * 0.5; // Random opacity 0.5-1
            
            snowflake.style.left = left + '%';
            snowflake.style.width = size + 'px';
            snowflake.style.height = size + 'px';
            snowflake.style.opacity = opacity;
            snowflake.style.animationDuration = duration + 's';
            snowflake.style.animationDelay = -delay + 's';
            
            return snowflake;
        }
        
        // Thêm bông tuyết vào container
        for (let i = 0; i < CONFIG.snowflakeCount; i++) {
            container.appendChild(createSnowflake());
        }
        
        // Tạo toggle button
        const toggleBtn = document.createElement('button');
        toggleBtn.className = 'toanweb-snow-toggle';
        toggleBtn.innerHTML = isSnowHidden ? '❄️' : '🚫';
        toggleBtn.setAttribute('aria-label', 'Toggle snow effect');
        toggleBtn.title = isSnowHidden ? 'Bật tuyết rơi' : 'Tắt tuyết rơi';
        
        toggleBtn.addEventListener('click', function() {
            const isHidden = container.classList.toggle('hidden');
            localStorage.setItem('toanwebSnowHidden', isHidden);
            this.innerHTML = isHidden ? '❄️' : '🚫';
            this.title = isHidden ? 'Bật tuyết rơi' : 'Tắt tuyết rơi';
        });
        
        // Thêm vào DOM khi trang load xong
        if (document.readyState === 'loading') {
            document.addEventListener('DOMContentLoaded', function() {
                document.body.appendChild(container);
                document.body.appendChild(toggleBtn);
            });
        } else {
            document.body.appendChild(container);
            document.body.appendChild(toggleBtn);
        }
    })();
    </script>
    <?php
}
add_action('wp_footer', 'toanweb_snow_effect_css', 100);

Câu Hỏi Thường Gặp (FAQ)

Code này có hoạt động với mọi theme WordPress không?

Có, code hoạt động với 100% theme WordPress vì nó được thêm qua hook wp_footer là hook chuẩn của WordPress. Không quan trọng bạn dùng theme miễn phí hay premium, Elementor hay Gutenberg.

Hiệu ứng tuyết có làm chậm website không?

Không đáng kể. Code được tối ưu với CSS3 animation và GPU acceleration, chỉ nặng khoảng 3-4KB. Trên hosting tốt, tác động đến tốc độ gần như bằng 0. Code cũng tự động tắt trên mobile để đảm bảo hiệu suất.

Code có tương thích với các builder như Elementor, Divi không?

Hoàn toàn tương thích. Code được inject vào footer của WordPress, không can thiệp vào cấu trúc của page builder nào.

Kết Luận

Hiệu ứng tuyết rơi là cách tuyệt vời để tạo không khí Giáng sinh cho website WordPress của bạn. Với code JavaScript thuần được tối ưu hóa, bạn có thể dễ dàng tạo hiệu ứng chuyên nghiệp mà không cần cài đặt plugin nặng nề.

Nếu bạn có nhu cầu làm Website hãy liên hệ với ToanWeb để được tư vấn miễn phí

0 Bình luận
Viết bình luận

Bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

0 Comments

Hãy là người đầu tiên bình luận nào.