数据雨效果如图:

css部分:

.copyright-content {
    display: none !important;
}
body.site-has-matrix-rain #matrix-rain-container {
  position: fixed !important;
  top: 0 !important;
  left: 0 !important;
  width: 100vw !important;
  height: 100vh !important;
  pointer-events: none !important;
  z-index: -2;
  overflow: hidden;
  font-family: 'Courier New', monospace;
}

body.site-has-matrix-rain #matrix-canvas {
  display: block;
  background: transparent;
}

.matrix-char {
  position: absolute;
  font-weight: 500;
  animation-timing-function: linear;
}

.matrix-char.head-char {
  color: #ffffff !important;
  text-shadow: 0 0 15px #ffffff, 0 0 25px #0077ff, 0 0 35px #0077ff !important;
  font-weight: bold !important;
  font-size: 1.2em !important;
}

.matrix-char.body-char {
  color: #80ffff !important;
  text-shadow: 0 0 8px rgba(128, 255, 255, 0.7) !important;
}

.matrix-char.tail-char {
  color: #0080ff !important;
  text-shadow: 0 0 5px rgba(0, 128, 255, 0.5) !important;
}
.full-blog-holder {
    display: flex;
    gap: 20px; 
    max-width: 1400px; 
    margin: 0 auto;
    padding: 0 15px;
}

js部分(需php封装):



function matrix_rain_effect() {
    ?>
    <style type="text/css">
body.site-has-matrix-rain #matrix-rain-container {
    position: fixed;
    top: 0;
    left: 0;
    width: 100vw;
    height: 100vh;
    pointer-events: none;
    z-index: -2;
    overflow: hidden;
    font-family: 'Courier New', monospace;
    font-size: 18px;
    color: #00ffff;
    text-shadow: 0 0 10px rgba(0, 255, 255, 0.8), 0 0 20px rgba(0, 200, 255, 0.6);
    opacity: 0.9;
    filter: brightness(1.2);
}

body.site-has-matrix-rain .matrix-column {
    position: absolute;
    top: 0;
    width: 1.2em;
    text-align: center;
    animation-timing-function: linear;
    animation-iteration-count: infinite;
    transform: translateY(-100%);
    transform: translateZ(0);
    backface-visibility: hidden;
    perspective: 1000;
}

body.site-has-matrix-rain .matrix-char {
    display: block;
    opacity: 0;
    animation: char-fade 2s ease-out forwards;
    font-weight: 500;
    margin-bottom: 2px;
    will-change: opacity, transform;
}

body.site-has-matrix-rain .matrix-char:first-child {
    color: #00ffff; 
    text-shadow: 0 0 15px #00ffff, 0 0 25px #00ffff, 0 0 35px #0077ff;
    font-weight: bold;
    font-size: 1.2em;
}

body.site-has-matrix-rain .matrix-char:nth-child(4n) {
    color: #80ffff;
    text-shadow: 0 0 8px rgba(128, 255, 255, 0.7);
}


@keyframes matrix-fall {
    0% { 
        transform: translateY(-100%);
        opacity: 1;
    }
    90% {
        opacity: 0.9;
    }
    100% { 
        transform: translateY(150vh);
        opacity: 0;
    }
}

@keyframes char-fade {
    0% { 
        opacity: 0;
        transform: translateY(-10px);
    }
    20% { 
        opacity: 1;
        transform: translateY(0);
    }
    80% { 
        opacity: 0.8;
    }
    100% { 
        opacity: 0;
        transform: translateY(5px);
    }
}
</style>

<script type="text/javascript">
(function() {
    'use strict';


    const container = document.createElement('div');
    container.id = 'matrix-rain-container';
    document.body.appendChild(container);
    document.body.classList.add('site-has-matrix-rain');

    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    container.appendChild(canvas);

    const config = {
        fontSize: 18,
        speed: 3, 
        characterChain: '0111001010010111001010100', 
        glowIntensity: 0.6,
        columns: 0,
        density: 0.7, 
        fadeInDuration: 0.3, 
        fadeOutDuration: 0.3 
    };

    let drops = [];
    let animationId = null;
    let lastTime = 0;
    const fixedCharacterChain = config.characterChain.split('');


    function init() {
        resizeCanvas();
        createDrops();
        if (animationId) {
            cancelAnimationFrame(animationId);
        }
        lastTime = performance.now();
        animate();
        window.addEventListener('resize', onResize);
        window.addEventListener('visibilitychange', onVisibilityChange);
    }

    function resizeCanvas() {
        const width = window.innerWidth;
        const height = window.innerHeight;

        if (canvas.width !== width || canvas.height !== height) {
            canvas.width = width;
            canvas.height = height;
          
            config.columns = Math.floor((width / config.fontSize) * config.density);
        }
    }

  
    function createDrops() {
        drops = [];
        const columnWidth = canvas.width / config.columns;
        
        for (let i = 0; i < config.columns; i++) {

            const x = i * columnWidth + Math.random() * columnWidth * 0.5;
            drops.push({
                x: x,
                y: Math.random() * -canvas.height * 2, 
                speed: config.speed * (0.8 + Math.random() * 0.4), 
                characters: [...fixedCharacterChain], 
                charPositions: new Array(fixedCharacterChain.length).fill(0),
                startTime: Date.now() + Math.random() * 5000, 
                currentIndex: 0,
                isActive: false
            });
        }
    }


    function calculateAlpha(drop, charIndex, currentY) {
        const totalChars = drop.characters.length;
        const progress = charIndex / totalChars;
        
 
        if (progress < config.fadeInDuration) {
            return progress / config.fadeInDuration;
        }
      
        else if (progress > (1 - config.fadeOutDuration)) {
            return (1 - progress) / config.fadeOutDuration;
        }

        else {
            return 1;
        }
    }


    function animate(currentTime = 0) {
        const deltaTime = currentTime - lastTime;
        lastTime = currentTime;


        ctx.clearRect(0, 0, canvas.width, canvas.height);

        ctx.font = `bold ${config.fontSize}px 'Courier New', monospace`;
        ctx.textAlign = 'center';

        for (let i = 0; i < drops.length; i++) {
            const drop = drops[i];
            

            if (!drop.isActive && Date.now() > drop.startTime) {
                drop.isActive = true;
            }
            
            if (!drop.isActive) continue;


            drop.y += drop.speed * (deltaTime / 16); // 基于时间增量确保匀速

        
            for (let j = 0; j < drop.characters.length; j++) {
                const charY = drop.y - j * config.fontSize;
                
              
                if (charY > -config.fontSize && charY < canvas.height + config.fontSize) {
                    const alpha = calculateAlpha(drop, j, charY);
                    
                    if (alpha <= 0) continue;

            
                    const blueIntensity = Math.floor(alpha * 255);
                    const color = `rgba(0, ${blueIntensity}, ${blueIntensity}, ${alpha})`;
                    
       
                    ctx.shadowBlur = 10 * alpha;
                    ctx.shadowColor = `rgba(0, 255, 255, ${alpha * config.glowIntensity})`;
                    ctx.fillStyle = color;
                    
                    ctx.fillText(drop.characters[j], drop.x, charY);
                }
            }


            if (drop.y - (drop.characters.length * config.fontSize) > canvas.height) {
                resetDrop(drop);
            }
        }

        animationId = requestAnimationFrame(animate);
    }


    function resetDrop(drop) {
        drop.y = Math.random() * -canvas.height * 2;
        drop.x = Math.random() * canvas.width; // 随机x位置确保均匀
        drop.startTime = Date.now() + Math.random() * 2000; // 随机延迟
        drop.isActive = false;
        drop.speed = config.speed * (0.8 + Math.random() * 0.4);
    }


    function onResize() {
        resizeCanvas();
        createDrops();
    }

 
    function onVisibilityChange() {
        if (document.hidden) {
            if (animationId) {
                cancelAnimationFrame(animationId);
                animationId = null;
            }
        } else {
            if (!animationId) {
                lastTime = performance.now();
                animate();
            }
        }
    }


    init();

})();
</script>
    <?php
}
add_action('wp_footer', 'matrix_rain_effect');

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

作者

2830713648@qq.com

相关文章

云服务器一键部署wordpress个人博客

🚀 安装与配置宝塔面板 宝塔面板是一个可视化...

读出全部

云端部署Tomcat本地查看出现无权访问

无权访问页面翻译: 您无权查看此页面。 默认...

读出全部
公安备案图标 浙公网安备33011302000856号 | 浙ICP备2025203820号