canvas下雪效果

Demo: http://7li.github.io/h5/snow.html

<!DOCTYPE html>
<html>
<head>
<style type="text/css">
body {
background-color: #0c91b8;
}
</style>
</head>
<body >
<script type="text/javascript">
	// Cross-browser-compliant
    requestAnimationFrame = window.requestAnimationFrame ||
                            window.mozRequestAnimationFrame ||
                            window.webkitRequestAnimationFrame ||
                            window.msRequestAnimationFrame ||
                            window.oRequestAnimationFrame ||
                            function(callback) { setTimeout(callback, 1000 / 60); };

    /**
     * Snow Class
     * @param {int}   x
     * @param {int}   y
     * @param {int}   radius
     * @param {Function} fn     Formular to calculate x pos and y pos
     */
    function Snow (x, y, radius, fn) {
    	this.x = x;
    	this.y = y;
    	this.r = radius;
    	this.fn = fn;
    }
    Snow.prototype.update = function () {
    	this.x = this.fn.x (this.x, this.y);
    	this.y = this.fn.y (this.y, this.y);

    	if (this.x > window.innerWidth ||
    		this.x < 0 ||
    		this.y > window.innerHeight ||
    		this.y < 0
    	){
    		this.x = getRandom('x');
    		this.y = 0;
    	}
    }
    Snow.prototype.draw = function (cxt) {
    	var grd = cxt.createRadialGradient (this.x, this.y, 0, this.x, this.y, this.r);
	    grd.addColorStop(0, "rgba(255, 255, 255, 0.9)");
		grd.addColorStop(.5, "rgba(255, 255, 255, 0.5)");
		grd.addColorStop(1, "rgba(255, 255, 255, 0)");
	    cxt.fillStyle = grd;
		cxt.fillRect (this.x - this.r, this.y - this.r, this.r * 2, this.r * 2);
    }

    /**
     * Snowlist class
     * Container to hold snow objects
     */
    SnowList = function () {
    	this.list = [];
    }
    SnowList.prototype.push = function (snow) {
    	this.list.push (snow);
    }
    SnowList.prototype.update = function () {
    	for (var i = 0, len = this.list.length; i < len; i++) {
    		this.list[i].update();
    	}
    }
    SnowList.prototype.draw = function (cxt) {
    	for (var i = 0, len = this.list.length; i < len; i++) {
    		this.list[i].draw (cxt);
    	}
    }
    SnowList.prototype.get = function (i) {
    	return this.list[i];
    }
    SnowList.prototype.size = function () {
    	return this.list.length;
    }

    /**
     * Generate random x-pos, y-pos or fn functions
     * @param  {string} option x|y|fnx|fny
     * @return {int|Function}
     */
    function getRandom (option) {
    	var ret, random;
    	switch (option) {
    		case 'x':
    			ret = Math.random () * window.innerWidth;
    			break;
    		case 'y':
    			ret = Math.random () * window.innerHeight;
    			break;
    		case 'r':
    			ret = 2 + (Math.random () * 6);
    			break;
    		case 'fnx':
    			random = 27 + Math.random () * 100;
    			ret = function (x, y) {
    				return x +  0.5 * Math.sin (y / random);
    			};
    			break;
    		case 'fny':
    			random = 0.4 + Math.random () * 1.4
    			ret = function (x, y) {
    				return y + random;
    			};
    			break;
    	}
    	return ret;
    }

    // Start snow
    function startSnow () {
    	// Create canvas
	    var canvas = document.createElement ('canvas'), cxt;
	    canvas.height = window.innerHeight;
	    canvas.width = window.innerWidth;
	    canvas.setAttribute ('style', 'position: fixed;left: 0;top: 0;pointer-events: none;');
	    canvas.setAttribute ('id', 'canvas_snow');
	    document.getElementsByTagName ('body')[0].appendChild (canvas);
	    cxt = canvas.getContext ('2d');
	    // Create snow objects
	    var snowList = new SnowList();
	    for(var i = 0; i < 200; i++){
	    	var snow, randomX, randomY, randomR, randomFnx, randomFny;
	    	randomX = getRandom ('x');
	    	randomY = getRandom ('y');
	    	randomR = getRandom ('r');
	    	randomFnx = getRandom('fnx');
	    	randomFny = getRandom('fny');
	    	snow = new Snow (randomX, randomY, randomR, {
		    	x: randomFnx,
		    	y: randomFny
		    });
		    snow.draw (cxt);
		    snowList.push (snow);
	    }
	    // Update snow position data, and redraw them in each frame
	    requestAnimationFrame (function(){
	    	cxt.clearRect (0, 0, canvas.width, canvas.height);
	    	snowList.update ();
	    	snowList.draw (cxt);
	    	requestAnimationFrame (arguments.callee);
	    })
    }

    // Handle window resize
    window.onresize = function () {
    	var canvasSnow = document.getElementById('canvas_snow');
    	canvasSnow.width = window.innerWidth;
    	canvasSnow.height = window.innerHeight;
    }

    // Let it snow O(∩_∩)0
    startSnow ();
</script>
</body>
</html>

时间: 2024-11-06 11:47:35

canvas下雪效果的相关文章

强大的CSS:模拟下雪效果动画制作教程

下雪效果只是一类效果的名称,可以是红包雨等一些自由落体的运动效果,本文就是用纯css模拟下雪的效果,更多效果大家可以自行发挥. 1.前言 由于公司产品的活动,需要模拟类似下雪的效果.浏览器实现动画无非css3和canvas(还有gif),对比下css3和canvas的优缺点: 动画自由度:canvas胜: 复杂度:canvas胜: 兼容性:canvas胜: 性能:css3胜(requestAnimationFrame和硬件加速). 由于对于性能有一定的要求,canvas对比css3会有更多的计算

CSS:模拟下雪效果动画制作教程

下雪效果只是一类效果的名称,可以是红包雨等一些自由落体的运动效果,本文就是用纯css模拟下雪的效果,更多效果大家可以自行发挥. 1.前言 由于公司产品的活动,需要模拟类似下雪的效果.浏览器实现动画无非css3和canvas(还有gif),对比下css3和canvas的优缺点: 动画自由度:canvas胜: 复杂度:canvas胜: 兼容性:canvas胜: 性能:css3胜(requestAnimationFrame和硬件加速). 由于对于性能有一定的要求,canvas对比css3会有更多的计算

关情纸尾-----Quartz2D定时器CADisplayLink下雪效果

定时器CADisplayLink下雪效果 1.定时器雪花整体思路: 先在控制器View面绘制一个雪花. 在View加载完毕后,添加一个定时器. 在定时器方法当中调用得绘方法. 在绘图方法当不段的去修改雪花的Y值. 当雪花的Y值超过屏幕的高度时,让雪花的Y值重新设为0.从最顶部开始. 2.添加定时器实现方案 第一种采用NSTime 第二种采用CADisplayLink 最终采用CADisplayLink方案. 2.1为什么采用CADisplayLink方案不用NSTime? 首先要了解setNee

再次推荐一款逼真的HTML5下雪效果

再次推荐一款逼真的下雪效果 效果图: 效果描述:之前推荐过一款下雪的jQuery插件之前的那款下降速度比较缓慢,今天推荐的这个下降速度比较快,大雪哇 使用方法:1.将index.html中的样式复制到你的样式表中2.将body中的代码部分拷贝到你需要的地方(注意保持图片.js文件路径的正确性) 查看效果:http://hovertree.com/texiao/jquery/36/ 下载地址 效果二 效果3 更多特效:http://www.cnblogs.com/roucheng/p/texiao

HTML5 Canvas动画效果实现原理

在线演示 使用HTML5画布可以帮助我们高速实现简单的动画效果.基本原理例如以下: 每隔一定时间绘制图形而且清除图形,用来模拟出一个动画过程,能够使用context.clearRect(0, 0, x, y)方法来刷新须要绘制的图形 首先是绘制图形的方法,例如以下: function myAnimation() { ctx.clearRect(0, 0, canvas_size_x, canvas_size_y); if (x_icon < 0 || x_icon > canvas_size_

桌面下雪效果

一个简单的下雪效果 MainWindow: 1.主界面通过DispatcherTimer给Grid生成雪花 2.雪花飘落后再讲雪花从Grid容器中移除 public partial class MainWindow { public MainWindow() { InitializeComponent(); Closing += (s, e) => ViewModelLocator.Cleanup(); Loaded += MainWindow_Loaded; } private void Ma

canvas 让你呼风唤雨,下雨下雪效果

前端如何呼风唤雨 Canvas 等于什么? = html5 =js = 取代flash =  你可以即见即所得向别人装逼!没错 进入 canvas 的权力游戏吧! 起初我创造了canvas . 我说,要有雨,就有了雨: 我说,要有雪,就有了雪. 而对于前端来说,canvas即是天地 在canvas这个天地上,前端可以呼风唤雨,无所不能. ------------------------------------华丽的分割线--------------------------------------

HTML5 Canvas绘制的下雪效果

在HTML页面的HEAD区域直接引入snow.js即可,如下:<script type="text/javascript" src="js/snow.js"></script> snow.js地址:http://pan.baidu.com/s/1gd5XCLd 效果:动态且无规律的雪花

canvas仪表盘效果

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>canvas仪表盘动画效果</title> <style type="text/css"> html, body { width: 100%; height: 100%; margin: 0; } canvas { display: none; border: 1p