/** * 雪花 * canvas版 无需依赖jquery */ var configSnowflake = {}; /** * 雪球 * eg: Snowflake(canvasID); * @param {[type]} elementName [description] */ var Snowflake = function (elementName) { configInit(); var snowElement = document.getElementById(elementName); var canvasContext = snowElement.getContext("2d"); var width = configSnowflake.clientWidth; var height = configSnowflake.clientHeight; //canvas尺寸修正 snowElement.width = width; snowElement.height = height; //构建雪球的数量 var snowNumber = 50; //构建雪球对象 var snowArrObjs = initSnow(snowNumber, width, height); var snowArrNum = snowArrObjs.length; /** * 绘制页面 * @return {[type]} [description] */ var render = function () { //清理之前的矩形数据 canvasContext.clearRect(0, 0, width, height); for (var i = 0; i < snowArrNum; ++i) { snowArrObjs[i].render(canvasContext); } }; /** * 更新雪花 * @return {[type]} [description] */ var update = function () { for (var i = 0; i < snowArrNum; ++i) { snowArrObjs[i].update(); } }; /** * 绘制与更新 * @return {[type]} [description] */ var renderAndUpdate = function () { render(); update(); requestAnimationFrame(renderAndUpdate); }; renderAndUpdate(); }; function initSnow(snowNumber, width, height) { //雪球参数 var options = { //雪球的半球距离 minRadius: 3, maxRadius: 10, // 运动的范围区域 maxX: width, maxY: height, //速率 minSpeedY: 0.05, maxSpeedY: 2, speedX: 0.05, //滤镜 minAlpha: 0.5, maxAlpha: 1.0, minMoveX: 4, maxMoveX: 18 }; var snowArr = []; for (var i = 0; i < snowNumber; ++i) { snowArr[i] = new Snow(options); } return snowArr; } function configInit() { //rem设置 (function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', recalc = function() { var clientWidth = docEl.clientWidth; var clientHeight = docEl.clientHeight; if (!clientWidth) return; docEl.style.fontSize = 20 * (clientWidth / 320) + 'px'; //宽与高度 document.body.style.height = clientWidth * (900 / 1440) + "px"; configSnowflake.clientWidth = clientWidth; configSnowflake.clientHeight = clientHeight;//clientWidth * (900 / 1440); }; recalc(); win.addEventListener(resizeEvt, recalc, false); doc.addEventListener('DOMContentLoaded', recalc, false); })(document, window); } /** * 雪球类 */ function Snow(snowSettings) { this.snowSettings = snowSettings; this.radius = randomInRange(snowSettings.minRadius, snowSettings.maxRadius); //初始的x位置 this.initialX = Math.random() * snowSettings.maxX; this.y = -(Math.random() * 500); //运行的速率 this.speedY = randomInRange(snowSettings.minSpeedY, snowSettings.maxSpeedY); this.speedX = snowSettings.speedX; //滤镜 this.alpha = randomInRange(snowSettings.minAlpha, snowSettings.maxAlpha); //角度.默认是360 this.angle = Math.random(Math.PI * 2); //运行的距离 this.x = this.initialX + Math.sin(this.angle); //x移动距离 this.moveX = randomInRange(snowSettings.minMoveX, snowSettings.maxMoveX); } /** * 绘制雪球 * @param {[type]} canvasContext [description] * @return {[type]} [description] */ Snow.prototype.render = function (canvasContext) { //清除路径 //开始一个画布中的一条新路径(或者子路径的一个集合) canvasContext.beginPath(); //用来填充路径的当前的颜色,白色的雪球 canvasContext.fillStyle = "rgba(255, 255, 255, " + this.alpha + ")"; //一个中心点和半径,为一个画布的当前子路径添加一条弧线 //坐标,圆,沿着圆指定弧的开始点和结束点的一个角度 //弧沿着圆周的逆时针方向(TRUE)还是顺时针方向(FALSE)遍历 canvasContext.arc(this.x, this.y, this.radius, 0, Math.PI * 2, true); //关闭子路径 canvasContext.closePath(); //fill() 方法使用 fillStyle 属性所指定的颜色、渐变和模式来填充当前路径 canvasContext.fill(); }; Snow.prototype.update = function () { this.y += this.speedY; if (this.y > this.snowSettings.maxY) { this.y -= this.snowSettings.maxY; } this.angle += this.speedX; if (this.angle > Math.PI * 2) { this.angle -= Math.PI * 2; } //? }; /** * 随机处理 * @param {[type]} min [description] * @param {[type]} max [description] * @return {[type]} [description] */ function randomInRange(min, max) { var random = Math.random() * (max - min) + min; return random; }