1. 程式人生 > >JS實現雪花飄落特效效果

JS實現雪花飄落特效效果

1、概述:

以任意圖片作為背景,在背景上新增雪花下落的特效效果,此處使用隨機顏色、隨機大小的彩色雪花實現。

2、效果實現功能:

(1)雪花隨機出現並隨機消失;

(2)雪花出現時大小隨機;

(3)雪花顏色隨機;

(4)雪花顏色逐漸變淡並消失;

(5)雪花消失後刪除其物件,減輕系統負擔。

3、實現原理:

採用<canvas></canvas>畫布標籤實現,在畫布上完成背景圖片的新增,使用物件創建出雪花的模型,在定義的畫布上用畫筆功能,根據雪花物件構建的模板畫出所需數量的雪花,並將畫出的雪花的透明度和分別遞減和遞增,任意雪花透明度為小於0時,再隨機位置創建出新的雪花。

4、完整實現程式碼:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>螢幕雪花效果練習</title>

	<style type="text/css">
		*{margin:0;padding:0;}
		canvas{background: url(images/snow.jpg) no-repeat;background-size: 100% 100%;overflow: hidden;}
		
	</style>
</head>
<body>
	<canvas id="canvas"></canvas>
	<script type="text/javascript">
	/**
	 * 定義<canvas>畫布;
	 * @type {[type]}
	 */
		var width=window.innerWidth;//獲取系統顯示寬度;
		var height=window.innerHeight;//獲取系統顯示高度;
		var canvas=document.querySelector("#canvas");
		var context=canvas.getContext("2d");
		var snowArray=[];//宣告一個數組,用於存放創建出來的雪花物件;

		canvas.width=width;//設定畫布的寬度為系統顯示寬度;
		canvas.height=height;//設定畫布的高度為系統顯示高度;

		cartoon();          //呼叫動畫;
		
		/**
		 * 定義雪花類;
		 */
		class Snowflake{
			constructor(){
				this.init();//建構函式,呼叫定義好的init()方法;
			}
			init(){
				this.position={   //雪花物件的位置;
					x:Math.random()*width,//x座標隨機;
					y:Math.random()*height,//y座標隨機;
				}
				this.speed=Math.random()*10;//雪花下落速度為0-10以內的隨機數;
				this.r=Math.random()*6;//雪花的半徑為0-6以內的隨機數;
				this.transparency=Math.random();//設定雪花的透明度為隨機;
				this.color={
					r1:Math.random()*255,//雪花顏色隨機;
					g:Math.random()*255,
					b:Math.random()*255,
				}
			}
			draw(){//雪花繪製方法;
				this.position.y++;//y座標每次遞增1畫素;
				this.transparency-=0.01;//透明度每次遞減0.01;
				if(this.transparency<=0){//透明度小於0,即雪花消失,重新繪製雪花;
					this.init();
				}
				context.beginPath();//開始一個新的圖形繪製;
				context.fillStyle="rgba("+this.color.r1+","+this.color.g+","+this.color.b+","+this.transparency+")";//根據類模型繪製圓形雪花;
				context.arc(this.position.x,this.position.y,this.r,0,Math.PI*2);//填充雪花的顏色;
				context.fill();
			}	
		}

		for(var i=0;i<1000;i++){
			var snow=new Snowflake();//例項化1000個雪花物件;
			snowArray.push(snow);//將雪花物件新增到陣列中;
		}
		// var length=snowArray.length;

		/**
		 * 定義動畫效果;
		 * @return {[type]} [description]
		 */
		function cartoon(){
			context.clearRect(0,0,width,height);動畫完成一次進行清屏操作;
			for(var j=0;j<snowArray.length;j++){
				snowArray[j].draw();//將例項化好的每個雪花物件在畫布上畫出來;
			}
			requestAnimationFrame(cartoon);//遞迴呼叫動畫效果;
		}
	</script>
</body>
</html>

5、注意事項:

動畫效果定義完成後必須在js程式碼塊中進行呼叫,這裡的動畫使用了requestAnimationFrame(cartoon);方法來遞迴反覆呼叫動畫,不需要設定定時器即可隨時重新整理,該方法比定時器 setTimeout/setInterval的優勢在於,在執行時瀏覽器會自動優化方法的呼叫,並且如果頁面不是啟用狀態下的話,動畫會自動暫停,減輕CPU壓力。