效果展示
源代码
<! 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>