仿google 的 let it snow(水雾版)


效果如上图:

1.google 的那个水雾不好看,所以就换了一个效果

2.用鼠标拖拽,水雾会消失

3.有飘雪

4.只支持google chrome15以上。用FF4以上也可以出现水雾效果。


想看效果,源码公布如下,直接copy paste当然是可以的。因为csdn好像不可以直接传rar文件。。。。


文件目录结构为


root(任意文件夹,然后用chrome双击index.html启动)

|_index.html

|_js

     |_snow.js

|_images

     |_b.png

     |_c.png

     |_background.png


或者直接登录我iteye博客下载zip包

http://rainsilence.iteye.com/blog/1325284


snow.js

(function() {
	
	var isIE = /msie/i.test(navigator.userAgent) && !window.opera;
	
	function mousePosition(e) {
		var event = e || window.event;
		if (event.pageX || event.pageY) {
			return {x:event.pageX, y:event.pageY};
		}
		return {
			x:event.clientX + document.body.scrollLeft - document.body.clientLeft,
			y:event.clientY + document.body.scrollTop - document.body.clientTop
		};
	}
	
	function getPosition(target) {
		var left = 0, top = 0;
		do {
			left += target.offsetLeft || 0;
			top += target.offsetTop || 0;
			target = target.offsetParent;
		} while(target);
		return {
			left: left,
			top: top
		};
	}
	
	var Class = (function() {  
      
        /** 
         * Initialze object from class. 
         * @param class object. 
         */  
        var initializeClass = (function() {  
            if (Object.create) {  
                return Object.create;  
            } else {  
                return function(o) {  
                    function F() {}    
                    F.prototype = o;    
                    return new F();  
                };  
            }  
        })();  
  
        /** 
         * The main function of Class. 
         *  
         * @param classContent 
         * @param superClass 
         */  
        return function() {  
  
            var classPrototype = arguments[arguments.length - 1] || {};  
  
            for (var index = 0; index < arguments.length - 1; index++) {  
  
                var superClass = arguments[index];  
                  
                if (typeof superClass["initialize"] == "function") {  
                    classPrototype.superclass = superClass["initialize"];  
                } else {  
                    classPrototype.superclass = function() {};  
                }  
                  
                for (var prop in superClass) {  
  
                    if (prop == "initialize" || prop == "newInstance") {  
                        continue;  
                    }  
                      
                    if (classPrototype.hasOwnProperty(prop)) {  
                        if (typeof superClass[prop] == "function") {  
                            classPrototype.superclass[prop] = superClass[prop];  
                        }  
                    } else {  
                        classPrototype[prop] = superClass[prop];  
                    }  
                }  
            }  
            classPrototype.newInstance = function() {  
                var instance = initializeClass(this);  
                if (instance["initialize"]) {  
                    instance["initialize"].apply(instance, arguments);  
                }  
                return instance;  
            };  
            return classPrototype;  
        };  
    })();  
	
	
	/**
	 * Canvas描绘工具类
	 */
	var GraphHelper = Class({
		container: null,
		width: null,
		height: null,
		ctx: null,
		initialize: function(containerId, width, height) {
			this.container = document.getElementById(containerId);
			this.width = width;
			this.height = height;
		},
		
		/**
		 * 初始化ctx
		 */
		getCtx: function() {
			if (!this.ctx) {
				var cvs = document.createElement('canvas');
				
				// 这里不能用style.width,否则drawImage会有bug
				cvs.width = this.width;
				cvs.height = this.height;
				cvs.style.position = 'absolute';
				
				this.container.appendChild(cvs);
				if (isIE) {
					G_vmlCanvasManager.initElement(cvs);
					cvs = document.getElementById(cvs.id);
				}
				this.canvas = cvs;
				this.ctx = cvs.getContext('2d');
			}
			return this.ctx;
		},
		
		/**
		 * 画圆
		 */
		drawCircle: function(x, y, radius, fillColor, strokeColor) {
			var ctx = this.getCtx();
			ctx.beginPath();
			ctx.moveTo(x, y);
			ctx.arc(x, y, radius, 0, 2 * Math.PI, false);
			ctx.closePath();
			if (strokeColor) {
				ctx.strokeStyle = strokeColor;
				ctx.stroke();
			}
			
			if (fillColor) {
				ctx.fillStyle = fillColor;
				ctx.fill();
			}
		},
		
		drawImage: function(image, dx, dy, dw, dh, angle) {
			var ctx = this.getCtx();
			ctx.save();
			ctx.translate(dx, dy);
			ctx.rotate(angle);
			ctx.drawImage(image, dw / 2, dh / 2, dw, dh);
			ctx.restore();
		},
		
		/**
		 * 清除Canvas
		 */
		clear: function() {
			var ctx = this.getCtx();
			ctx.clearRect(0, 0, this.width, this.height);
		},
		
		/**
		 * 注册事件
		 */
		addEventListener: function(event, fn) {
			this.canvas.addEventListener(event, fn, false);
		},
		
		/**
		 * 注册Canvas Style
		 */
		setStyle: function(props) {
			for (var prop in props) {
				this.canvas.style[prop] = props[prop];
			}
		}
	
	});
	
	var PixelHelper = Class(GraphHelper, {
		
		imageData: null,
		
		initialize: function(containerId, width, height) {
			PixelHelper.superclass.call(this, containerId, width, height);
			
			this.createMask();
		},
		
		createMask: function() {
			var ctx = this.getCtx();
			ctx.globalCompositeOperation = "destination-out";
			this.imageData = ctx.createImageData(this.width, this.height);
			var data = this.imageData.data;
			
			for (var index = 0; index < data.length; index++) {
				
				if ((index + 1) % 4 == 0) {
					data[index] = 0;
				} else {
					data[index] = 255;
				}
			}
			ctx.putImageData(this.imageData, 0, 0);
		},
		
		nextPixel: function() {
			var ctx = this.getCtx();
			var imageData = ctx.getImageData(0, 0, this.width, this.height);
			
			var data = imageData.data;
			for (var index = 0; index < data.length; index++) {
				
				if ((index + 1) % 4 == 0) {
					if (data[index] <= 121) {
						data[index]++;
					}
					
					if (data[index] >=  130) {
						data[index] = 0;
					}
					
				} else {
					data[index] = 255;
				}
			}
			
			ctx.putImageData(imageData, 0, 0);
		}
	});
	
	var Snow = Class({
		photoSrc: null,
		width: null,
		height: null,
		direct: false,
		currentAngle: 0,
		rotation: 0,
		initialize: function(photoSrc, width, height) {
			this.photoSrc = photoSrc;
			this.width = width;
			this.height = height;
			this.initParam();
		},
		initParam: function() {
			this.arcX = this.random(30, this.width - 30);
			this.radius = this.random(200, 400);
			this.arcY = -(this.radius + 80);
			this.maxAngle = this.random(15, 33) * Math.PI / 180;
			this.secondAngle = this.random(4, 10) / 10 / this.radius;
			this.angle = (this.random(-300, 300) % 4) / 10;
			this.scaleNum = this.random(4, 8) / 10;
			this.moveY = this.random(3, 24) /  10;
			this.image = this.photoSrc[this.random(0, 300) % this.photoSrc.length];
		},
		random: function(min, max) {
			return Math.round(Math.random() * (max - min) + min);
		},
		toNextPoint: function() {
			
			this.arcY += this.moveY;
			
			if (this.direct) {
				this.currentAngle += this.secondAngle;
			} else {
				this.currentAngle -= this.secondAngle;
			}
			
			var x = Math.sin(this.currentAngle) * this.radius + this.arcX;
			var y = Math.cos(this.currentAngle) * this.radius + this.arcY;
			
			if (this.currentAngle >= this.maxAngle) {
				this.direct = false;
			} else if (this.currentAngle <= -this.maxAngle) {
				this.direct = true;
			}
			this.rotation += .01;
			this.currentX = x;
			this.currentY = y;
			
			if (this.arcY > this.height) {
				this.initParam();
			}
		}
	});
	
	var SnowCanvas = Class({
		
		photoArr: null,
		snowArr: null,
		initialize: function(containerId, width, height) {
			this.helper = GraphHelper.newInstance(containerId, width, height);
			this.helper.getCtx();
			this.helper.setStyle({
				zIndex: 2
			});
			
			this.loadSource(["images/b.png", "images/c.png"], this.eventWrapper(this.play, this));
			
		},
		
		loadSnow: function(width, height) {
			this.snowList = [];
			
			for (var index = 0; index < 7; index++) {
				var snow = Snow.newInstance(this.photoArr, width, height);
				this.snowList.push(snow);
			}
		},
		
		loadSource: function(sourceArr, handler) {
			
			this.photoArr = [];
			
			var count = 0;
			
			for (var index = 0; index < sourceArr.length; index++) {
				
				var image = new Image();
				
				image.onload = function() {
						
					count++;
					if (count == sourceArr.length) {
						handler();
					}
				};
				image.src = sourceArr[index];
				this.photoArr.push(image);
			}
		},
		
		eventWrapper: function(fn, target) {
			return function(event) {
				fn.call(target, event);
			};
		},
		
		play: function() {
			
			this.loadSnow(this.helper.width, this.helper.height);
			var helper = this.helper;
			var snowList = this.snowList;
			
			setInterval(function() {
				helper.clear();
				
				for (var index = 0; index < snowList.length; index++) {
					var snow = snowList[index];
					var scale = 40 * snow.scaleNum;
					helper.drawImage(snow.image, snow.currentX, snow.currentY, scale, scale, snow.rotation);
					snow.toNextPoint();
				}
			}, 1000 / 60);
		}
	});
	
	var MaskCanvas = Class({
		
		isDragStart:false,
		
		lastX: 0,
		lastY: 0,
		
		initialize: function(containerId, width, height) {
			var helper = PixelHelper.newInstance(containerId, width, height);
			helper.getCtx();
			
			helper.setStyle({
				zIndex: 3,
				cursor: "pointer"
			});
			setInterval(function() {
				helper.nextPixel();
			}, 1000 / 60);
			this.helper = helper;
			helper.addEventListener('mousedown', this.eventWrapper(this.mouseDownHandler, this));
			helper.addEventListener('mousemove', this.eventWrapper(this.mouseMoveHandler, this));
			helper.addEventListener('mouseup', this.eventWrapper(this.mouseUpHandler, this));
		},
		eventWrapper: function(fn, target) {
			return function(event) {
				fn.call(target, event);
			};
		},
		
		getMouseCoord: function(event) {
			var mousePos = mousePosition(event);
			var canvasPos = getPosition(this.helper.container);
			return {
				x: mousePos.x - canvasPos.left,
				y: mousePos.y - canvasPos.top
			};
		},
		mouseDownHandler: function(event) {
			
			var mouseCoord = this.getMouseCoord(event);
			
			this.lastX = mouseCoord.x;
			
			this.lastY = mouseCoord.y;
			
			this.helper.drawCircle(mouseCoord.x, mouseCoord.y, 30, "rgba(255, 255, 255, 136)");
			
			this.isDragStart = true;
		},
		
		mouseMoveHandler: function(event) {
			
			if (this.isDragStart == false) {
				return;
			}
			
			var mouseCoord = this.getMouseCoord(event);
			
			var xDos = mouseCoord.x - this.lastX;
			var yDos = mouseCoord.y - this.lastY;
			
			var dos = Math.max(xDos, yDos);
			var factor = 10;
			if (dos > 200) {
				factor = 30;
			}
			
			var xFactor = xDos / factor;
			
			var yFactor = yDos / factor;
			
			var currentX = 0;
			var currentY = 0;
			for (var i = 0; i < 10; i++) {
				currentX += xFactor;
				currentY += yFactor;
				this.helper.drawCircle(this.lastX + currentX, this.lastY + currentY, 30, "rgba(255, 255, 255, 136)");
			}
			
			this.helper.drawCircle(mouseCoord.x, mouseCoord.y, 30, "rgba(255, 255, 255, 136)");

			event.preventDefault();
			
			this.lastX = mouseCoord.x;
			
			this.lastY = mouseCoord.y;
		},
		
		mouseUpHandler: function(event) {
			this.isDragStart = false;
		}
	});
	
	var Background = Class({
		initialize: function(containerId, imageUrl, handler) {
			var image = new Image();
			var targetThis = this;
			image.onload = function() {
				
				var container = document.getElementById(containerId);
				
				container.style.display = "inline-block";
				
				targetThis.createBackground(container, image);
				
				handler({width: image.width, height: image.height});
			};
			image.src = imageUrl;
		},
		
		createBackground: function(container, image) {
			var imgTag = document.createElement("img");
			imgTag.src = image.src;
			imgTag.width = image.width;
			imgTag.height = image.height;
			imgTag.style.zIndex = 1;
			imgTag.style.position = "absolute";
			container.appendChild(imgTag);
		}
	});
	
	SnowFactory = Class({
		
		initialize: function(containerId, imageUrl) {
			Background.newInstance(containerId, imageUrl, function(imageInfo) {
				SnowCanvas.newInstance(containerId, imageInfo.width, imageInfo.height);
				MaskCanvas.newInstance(containerId, imageInfo.width, imageInfo.height);
			});
		}
	});
})();


index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/snow.js"></script>
<script type="text/javascript">
	window.onload = function() {
		SnowFactory.newInstance("container", "images/background.png");
	}
</script>
</head>
<body>
	<div id="container"></div>
</body>
</html>

b.png


c.png



background.png


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值