效果展示

源代码
| <!DOCTYPE html> |
| <html lang="en"> |
| <script> |
| var _hmt = _hmt || []; |
| (function () { |
| var hm = document.createElement("script"); |
| hm.src = "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34"; |
| var s = document.getElementsByTagName("script")[0]; |
| s.parentNode.insertBefore(hm, s); |
| })(); |
| </script> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>炸弹爆炸和烟花效果</title> |
| <style> |
| |
| body, html { |
| margin: 0; |
| padding: 0; |
| overflow: hidden; |
| background: #000; |
| } |
| |
| |
| .starry-background { |
| position: absolute; |
| width: 100%; |
| height: 100%; |
| background: radial-gradient(circle at bottom, #001025, #000000); |
| z-index: -1; |
| } |
| |
| .stars { |
| position: absolute; |
| width: 100%; |
| height: 100%; |
| background: url('https://i.imgur.com/3Zv2v1m.png') repeat; |
| opacity: 0.5; |
| animation: twinkle 5s infinite alternate; |
| } |
| |
| @keyframes twinkle { |
| from { |
| opacity: 0.3; |
| } |
| to { |
| opacity: 0.7; |
| } |
| } |
| |
| |
| .lantern { |
| position: absolute; |
| width: 30px; |
| height: 45px; |
| background: radial-gradient(circle, #ff8c00, #ff4500); |
| border-radius: 10px; |
| box-shadow: 0 0 10px rgba(255, 140, 0, 0.8); |
| animation: floatUp infinite linear; |
| } |
| |
| @keyframes floatUp { |
| 0% { |
| transform: translateY(100vh); |
| opacity: 0; |
| } |
| 10% { |
| opacity: 1; |
| } |
| 100% { |
| transform: translateY(-200%); |
| opacity: 0; |
| } |
| } |
| |
| |
| .new-year-text { |
| position: absolute; |
| top: 50%; |
| left: 50%; |
| transform: translate(-50%, -50%); |
| font-family: 'Arial', sans-serif; |
| font-size: 100px; |
| font-weight: bold; |
| color: #ff8c00; |
| text-shadow: 2px 2px 10px rgba(255, 140, 0, 0.8); |
| opacity: 0; |
| transition: opacity 3s ease-out; |
| } |
| </style> |
| </head> |
| <body> |
| |
| <div class="starry-background"> |
| <div class="stars"></div> |
| </div> |
| |
| |
| <div class="new-year-text">2025 新春快乐!</div> |
| |
| |
| <div class="lantern-container"></div> |
| |
| |
| <canvas id="fireworks"></canvas> |
| |
| <script> |
| |
| const lanternContainer = document.querySelector('.lantern-container'); |
| |
| |
| let lanternCount = 0; |
| function generateLantern() { |
| const lantern = document.createElement('div'); |
| lantern.classList.add('lantern'); |
| lantern.style.left = Math.random() * 100 + '%'; |
| lantern.style.animationDuration = `${10 + Math.random() * 5}s`; |
| lanternContainer.appendChild(lantern); |
| lanternCount++; |
| if (lanternCount >= 50) clearInterval(lanternInterval); |
| } |
| |
| |
| const lanternInterval = setInterval(generateLantern, 200); |
| |
| |
| const canvas = document.getElementById('fireworks'); |
| const ctx = canvas.getContext('2d'); |
| canvas.width = window.innerWidth; |
| canvas.height = window.innerHeight; |
| |
| let particles = []; |
| function createFirework(x, y) { |
| const particleCount = 150; |
| for (let i = 0; i < particleCount; i++) { |
| particles.push(new Particle(x, y)); |
| } |
| } |
| |
| class Particle { |
| constructor(x, y) { |
| this.x = x; |
| this.y = y; |
| this.size = Math.random() * 3 + 1; |
| this.speedX = Math.random() * 6 - 3; |
| this.speedY = Math.random() * 6 - 3; |
| this.color = `hsl(${Math.random() * 360}, 100%, 50%)`; |
| this.alpha = 1; |
| } |
| |
| update() { |
| this.x += this.speedX; |
| this.y += this.speedY; |
| this.alpha -= 0.01; |
| } |
| |
| draw() { |
| ctx.globalAlpha = this.alpha; |
| ctx.fillStyle = this.color; |
| ctx.beginPath(); |
| ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2); |
| ctx.fill(); |
| } |
| } |
| |
| function animate() { |
| ctx.clearRect(0, 0, canvas.width, canvas.height); |
| particles = particles.filter(particle => particle.alpha > 0); |
| particles.forEach(particle => { |
| particle.update(); |
| particle.draw(); |
| }); |
| requestAnimationFrame(animate); |
| } |
| |
| function autoFireworks() { |
| setInterval(() => { |
| const x = Math.random() * canvas.width; |
| const y = Math.random() * canvas.height / 2; |
| createFirework(x, y); |
| }, 300); |
| } |
| |
| animate(); |
| autoFireworks(); |
| |
| |
| let bombScale = 1; |
| let bombY = window.innerHeight / 2; |
| let bombX = window.innerWidth / 2; |
| let bombTimer = 0; |
| let isExploding = false; |
| let bombActive = true; |
| |
| function drawBomb(x, y, scale) { |
| ctx.save(); |
| ctx.beginPath(); |
| ctx.arc(x, y, 30 * scale, 0, Math.PI * 2, false); |
| ctx.fillStyle = '#ffcc00'; |
| ctx.fill(); |
| ctx.shadowBlur = 15; |
| ctx.shadowColor = 'rgba(255, 204, 0, 0.8)'; |
| ctx.lineWidth = 4; |
| ctx.strokeStyle = '#ff9900'; |
| ctx.stroke(); |
| ctx.restore(); |
| } |
| |
| |
| function animateBomb() { |
| if (bombActive) { |
| |
| if (bombTimer < 200) { |
| bombScale = 1 + Math.sin(bombTimer / 30) * 0.2; |
| } else if (bombTimer >= 200 && !isExploding) { |
| |
| isExploding = true; |
| setTimeout(() => { |
| document.querySelector('.new-year-text').style.opacity = 1; |
| createFirework(bombX, bombY); |
| bombActive = false; |
| }, 500); |
| } |
| |
| drawBomb(bombX, bombY, bombScale); |
| } |
| |
| bombTimer++; |
| requestAnimationFrame(animateBomb); |
| } |
| |
| |
| setTimeout(animateBomb, 5000); |
| </script> |
| </body> |
| </html> |
| |
复制