免费全功能教育版本下载 - 玩转Shapr3D系列 - iPad 3D打印建模 - 孤独二进制出品
html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>3D Parallax — 主场数据</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=Noto+Sans+SC:wght@300;700;900&family=DM+Mono:wght@300;500&display=swap" rel="stylesheet"> <style> *,*::before,*::after{margin:0;padding:0;box-sizing:border-box} :root{ --bg:#05080d; --deep:#0a1018; --accent:#ff3c3c; --accent-glow:#ff3c3c44; --gold:#f0c040; --text:#e8e4dc; --muted:#5a6578; --layer-speed-1:0.02; --layer-speed-2:0.04; --layer-speed-3:0.07; --layer-speed-4:0.12; } html,body{ width:100%;height:100%;overflow:hidden; background:var(--bg);color:var(--text); font-family:'Noto Sans SC',sans-serif; } .scene{ position:fixed;inset:0; perspective:1200px; perspective-origin:50% 50%; overflow:hidden; } /* ── Atmospheric gradient mesh ── */ .scene::before{ content:'';position:absolute;inset:-20%; background: radial-gradient(ellipse 60% 50% at 15% 80%,#1a0a0a 0%,transparent 70%), radial-gradient(ellipse 50% 60% at 85% 20%,#0a0f1e 0%,transparent 60%), radial-gradient(ellipse 80% 40% at 50% 50%,#0d0808 0%,transparent 80%), var(--bg); z-index:0; transition:transform .1s ease-out; } /* ── Grain overlay ── */ .scene::after{ content:'';position:absolute;inset:0; background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.5'/%3E%3C/svg%3E"); opacity:0.035;pointer-events:none;z-index:999; mix-blend-mode:overlay; } /* ── Parallax layers ── */ .layer{ position:absolute;inset:0; display:flex;align-items:center;justify-content:center; will-change:transform; transition:transform .15s cubic-bezier(.22,.61,.36,1); } /* Layer 0 — deep grid lines */ .layer--grid{ z-index:1; } .grid-pattern{ width:160%;height:160%; position:absolute; background-image: linear-gradient(rgba(255,60,60,0.03) 1px,transparent 1px), linear-gradient(90deg,rgba(255,60,60,0.03) 1px,transparent 1px); background-size:80px 80px; transform:rotateX(60deg) translateY(-200px); transform-origin:center top; mask-image:radial-gradient(ellipse 80% 60% at 50% 40%,black,transparent); } /* Layer 1 — floating geometric shapes */ .layer--shapes{z-index:2} .shape{ position:absolute; border:1px solid rgba(255,60,60,0.08); border-radius:2px; } .shape--1{width:180px;height:180px;top:10%;left:8%;transform:rotate(15deg);border-color:rgba(255,60,60,0.06)} .shape--2{width:300px;height:300px;bottom:5%;right:5%;transform:rotate(-8deg);border-color:rgba(240,192,64,0.05);border-radius:50%} .shape--3{width:120px;height:120px;top:20%;right:15%;transform:rotate(45deg);background:rgba(255,60,60,0.015);border-color:rgba(255,60,60,0.04)} .shape--4{width:220px;height:1px;top:55%;left:10%;background:linear-gradient(90deg,transparent,rgba(255,60,60,0.08),transparent);border:none} .shape--5{width:1px;height:200px;top:20%;left:30%;background:linear-gradient(180deg,transparent,rgba(255,60,60,0.06),transparent);border:none} .shape--6{width:260px;height:260px;bottom:15%;left:20%;transform:rotate(30deg);border-color:rgba(255,255,255,0.02);border-radius:50%} /* Layer 2 — scan lines & atmosphere */ .layer--atmosphere{z-index:3} .scanline{ position:absolute;width:100%;height:2px; background:linear-gradient(90deg,transparent 5%,rgba(255,60,60,0.04) 30%,rgba(255,60,60,0.06) 50%,rgba(255,60,60,0.04) 70%,transparent 95%); animation:scanDrift 8s ease-in-out infinite; } .scanline--1{top:30%;animation-delay:0s} .scanline--2{top:55%;animation-delay:2s;width:70%;left:15%} .scanline--3{top:78%;animation-delay:4.5s;width:50%;left:25%} @keyframes scanDrift{ 0%,100%{opacity:0;transform:translateX(-30px)} 20%{opacity:1} 80%{opacity:1} 100%{opacity:0;transform:translateX(30px)} } /* Vignette ring */ .vignette{ position:absolute;inset:0; background:radial-gradient(ellipse 70% 65% at 50% 48%,transparent 40%,rgba(5,8,13,0.85) 100%); } /* Layer 3 — main content */ .layer--content{z-index:10;flex-direction:column;gap:0} .content-wrap{ text-align:center; position:relative; animation:contentReveal 1.2s cubic-bezier(.16,1,.3,1) forwards; opacity:0; } @keyframes contentReveal{ 0%{opacity:0;transform:translateY(40px) scale(.96);filter:blur(8px)} 100%{opacity:1;transform:translateY(0) scale(1);filter:blur(0)} } /* Top label */ .label-top{ font-family:'DM Mono',monospace; font-size:clamp(11px,1.2vw,14px); font-weight:300; letter-spacing:0.35em; text-transform:uppercase; color:var(--muted); margin-bottom:12px; animation:contentReveal 1s .3s cubic-bezier(.16,1,.3,1) forwards; opacity:0; } /* Score number */ .score-container{ position:relative; display:inline-block; animation:contentReveal 1s .15s cubic-bezier(.16,1,.3,1) forwards; opacity:0; } .score{ font-family:'Bebas Neue',sans-serif; font-size:clamp(120px,18vw,280px); line-height:0.85; letter-spacing:-0.02em; color:var(--text); position:relative; z-index:2; text-shadow: 0 0 60px rgba(255,60,60,0.25), 0 0 120px rgba(255,60,60,0.1); } .score .decimal{ color:var(--accent); position:relative; } .score .decimal::after{ content:''; position:absolute; bottom:0.05em;left:-10%;right:-10%; height:3px; background:var(--accent); box-shadow:0 0 20px var(--accent-glow),0 0 60px var(--accent-glow); animation:pulseLine 2.5s ease-in-out infinite; } @keyframes pulseLine{ 0%,100%{opacity:0.6;transform:scaleX(0.95)} 50%{opacity:1;transform:scaleX(1.05)} } /* Unit label on the score */ .score-unit{ font-family:'Noto Sans SC',sans-serif; font-size:clamp(28px,4vw,56px); font-weight:300; color:var(--accent); vertical-align:top; margin-left:8px; letter-spacing:0.05em; text-shadow:0 0 40px var(--accent-glow); } /* Glow behind the number */ .score-glow{ position:absolute; top:50%;left:50%; transform:translate(-50%,-50%); width:400px;height:200px; background:radial-gradient(ellipse,rgba(255,60,60,0.12) 0%,transparent 70%); filter:blur(40px); z-index:1; animation:glowPulse 4s ease-in-out infinite; } @keyframes glowPulse{ 0%,100%{opacity:0.5;transform:translate(-50%,-50%) scale(1)} 50%{opacity:1;transform:translate(-50%,-50%) scale(1.15)} } /* Description line */ .desc{ font-family:'Noto Sans SC',sans-serif; font-size:clamp(14px,2vw,22px); font-weight:300; color:var(--muted); margin-top:20px; letter-spacing:0.12em; animation:contentReveal 1s .5s cubic-bezier(.16,1,.3,1) forwards; opacity:0; } .desc em{ font-style:normal; color:var(--gold); font-weight:700; position:relative; } .desc em::after{ content:''; position:absolute;bottom:-2px;left:0;right:0; height:1px; background:linear-gradient(90deg,transparent,var(--gold),transparent); opacity:0.4; } /* Bottom bar / ticker */ .ticker{ position:fixed;bottom:0;left:0;right:0; height:48px;z-index:20; display:flex;align-items:center; background:linear-gradient(180deg,transparent,rgba(5,8,13,0.9)); padding:0 32px; font-family:'DM Mono',monospace; font-size:12px; color:var(--muted); letter-spacing:0.15em; animation:tickerReveal 1s .8s ease forwards; opacity:0; overflow:hidden; } .ticker::before{ content:'';position:absolute;top:0;left:0;right:0; height:1px; background:linear-gradient(90deg,transparent 10%,rgba(255,60,60,0.15) 50%,transparent 90%); } @keyframes tickerReveal{ 0%{opacity:0;transform:translateY(100%)} 100%{opacity:1;transform:translateY(0)} } .ticker span{margin-right:40px;white-space:nowrap} .ticker .dot{color:var(--accent);margin-right:6px} /* ── Floating particles ── */ .particles{ position:fixed;inset:0;z-index:4;pointer-events:none; } .particle{ position:absolute; width:2px;height:2px; background:var(--accent); border-radius:50%; opacity:0; animation:float linear infinite; } @keyframes float{ 0%{opacity:0;transform:translateY(0) scale(0)} 10%{opacity:0.6} 90%{opacity:0.6} 100%{opacity:0;transform:translateY(-100vh) scale(1)} } /* ── Corner decorations ── */ .corner{ position:fixed;z-index:15; width:60px;height:60px; opacity:0;animation:cornerReveal 1s 1s ease forwards; } .corner--tl{top:24px;left:24px;border-top:1px solid rgba(255,60,60,0.2);border-left:1px solid rgba(255,60,60,0.2)} .corner--tr{top:24px;right:24px;border-top:1px solid rgba(255,60,60,0.2);border-right:1px solid rgba(255,60,60,0.2)} .corner--bl{bottom:60px;left:24px;border-bottom:1px solid rgba(255,60,60,0.2);border-left:1px solid rgba(255,60,60,0.2)} .corner--br{bottom:60px;right:24px;border-bottom:1px solid rgba(255,60,60,0.2);border-right:1px solid rgba(255,60,60,0.2)} @keyframes cornerReveal{ 0%{opacity:0}100%{opacity:1} } /* ── Side data points ── */ .side-data{ position:fixed;z-index:15; font-family:'DM Mono',monospace; font-size:11px; letter-spacing:0.1em; color:var(--muted); opacity:0;animation:contentReveal 1s .9s ease forwards; } .side-data--left{left:32px;top:50%;transform:translateY(-50%);writing-mode:vertical-rl;text-orientation:mixed} .side-data--right{right:32px;top:50%;transform:translateY(-50%);writing-mode:vertical-rl;text-orientation:mixed;direction:rtl} .side-data .highlight{color:var(--accent)} </style> </head> <body> <div class="scene" id="scene"> <!-- Layer 0: Grid --> <div class="layer layer--grid" data-depth="0.02"> <div class="grid-pattern"></div> </div> <!-- Layer 1: Geometric shapes --> <div class="layer layer--shapes" data-depth="0.05"> <div class="shape shape--1"></div> <div class="shape shape--2"></div> <div class="shape shape--3"></div> <div class="shape shape--4"></div> <div class="shape shape--5"></div> <div class="shape shape--6"></div> </div> <!-- Layer 2: Atmosphere --> <div class="layer layer--atmosphere" data-depth="0.08"> <div class="scanline scanline--1"></div> <div class="scanline scanline--2"></div> <div class="scanline scanline--3"></div> <div class="vignette"></div> </div> <!-- Layer 3: Main content --> <div class="layer layer--content" data-depth="0.14"> <div class="content-wrap"> <div class="label-top">HOME PERFORMANCE INDEX</div> <div class="score-container"> <div class="score-glow"></div> <div class="score">3<span class="decimal">.2</span><span class="score-unit">分</span></div> </div> <div class="desc">主队近<em>5年</em>主场最低评分</div> </div> </div> </div> <!-- Particles --> <div class="particles" id="particles"></div> <!-- Corner decorations --> <div class="corner corner--tl"></div> <div class="corner corner--tr"></div> <div class="corner corner--bl"></div> <div class="corner corner--br"></div> <!-- Side data --> <div class="side-data side-data--left"> <span>SEASON <span class="highlight">2024-25</span> · HOME</span> </div> <div class="side-data side-data--right"> <span>LOWEST IN <span class="highlight">5</span> YEARS</span> </div> <!-- Ticker --> <div class="ticker"> <span><span class="dot">●</span>主队近5年主场最低</span> <span><span class="dot">●</span>3.2分 — 触底信号</span> <span><span class="dot">●</span>SEASON LOW</span> <span><span class="dot">●</span>数据更新中...</span> </div> <script> // ── Parallax Engine ── const scene = document.getElementById('scene'); const layers = document.querySelectorAll('.layer'); let mouseX = 0, mouseY = 0; let currentX = 0, currentY = 0; const ease = 0.06; document.addEventListener('mousemove', (e) => { mouseX = (e.clientX / window.innerWidth - 0.5) * 2; mouseY = (e.clientY / window.innerHeight - 0.5) * 2; }); // Gyroscope support for mobile if (window.DeviceOrientationEvent) { window.addEventListener('deviceorientation', (e) => { if (e.gamma !== null && e.beta !== null) { mouseX = Math.max(-1, Math.min(1, e.gamma / 30)); mouseY = Math.max(-1, Math.min(1, (e.beta - 45) / 30)); } }); } function animate() { currentX += (mouseX - currentX) * ease; currentY += (mouseY - currentY) * ease; layers.forEach(layer => { const depth = parseFloat(layer.dataset.depth) || 0; const moveX = currentX * depth * 80; const moveY = currentY * depth * 60; const rotateY = currentX * depth * 5; const rotateX = -currentY * depth * 3; layer.style.transform = `translate3d(${moveX}px, ${moveY}px, 0) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`; }); // Move gradient mesh slightly const mesh = document.querySelector('.scene'); if (mesh) { const meshX = currentX * 15; const meshY = currentY * 10; mesh.style.setProperty('--mesh-x', meshX + 'px'); mesh.style.setProperty('--mesh-y', meshY + 'px'); } requestAnimationFrame(animate); } animate(); // ── Particle System ── const particleContainer = document.getElementById('particles'); const PARTICLE_COUNT = 30; for (let i = 0; i < PARTICLE_COUNT; i++) { const p = document.createElement('div'); p.className = 'particle'; p.style.left = Math.random() * 100 + '%'; p.style.top = (60 + Math.random() * 40) + '%'; p.style.width = (1 + Math.random() * 2) + 'px'; p.style.height = p.style.width; p.style.animationDuration = (8 + Math.random() * 12) + 's'; p.style.animationDelay = (Math.random() * 10) + 's'; p.style.opacity = 0; particleContainer.appendChild(p); } // ── Auto subtle drift when no mouse ── let lastMove = Date.now(); let idleTimer; document.addEventListener('mousemove', () => { lastMove = Date.now(); }); setInterval(() => { if (Date.now() - lastMove > 3000) { mouseX = Math.sin(Date.now() * 0.0005) * 0.3; mouseY = Math.cos(Date.now() * 0.0003) * 0.2; } }, 50); </script> </body> </html>