(function () {
// 添加事件监听器
function addEvent(a, b, c) {
if (a.addEventListener) a.addEventListener(b, c, false);
else a.attachEvent && a.attachEvent("on" + b, c)
}
// 向window.onload添加执行函数
function addToOnLoad(a) {
if (typeof window.onload != "function") window.onload = a;
else {
var b = window.onload;
window.onload = function () {
b();
a()
}
}
}
// scroll top ,left
function getScrollDis() {
var scroll = {};
for (var type in {
Top: "",
Left: ""
}) {
var b = type == "Top" ? "Y" : "X";
if (typeof window["page" + b + "Offset"] != "undefined") scroll[type.toLowerCase()] = window["page" + b + "Offset"];
else {
// <html>
b = document.documentElement.clientHeight ? document.documentElement : document.body;
scroll[type.toLowerCase()] = b["scroll" + type]
}
}
return scroll;
} // 获取浏览器窗口高度(不包括工具栏/滚动条)
function getWinHeight() { var height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
return height;
} //构造函数 ,模拟雪花类
function SnowDot(a) {
this.parent = document.body;
this.createEl(this.parent, a);
this.size = Math.random() * 5 + 5; // 随机设置雪花的大小
this.el.style.width = Math.round(this.size) + "px";
this.el.style.height = Math.round(this.size) + "px";
this.maxLeft = document.body.offsetWidth - this.size;
this.maxTop = document.body.offsetHeight - this.size;
this.left = Math.random() * this.maxLeft;
this.top = getScrollDis().top + 1;
this.angle = 1.4 + 0.2 * Math.random();
// PI/2 =1.57
this.minAngle = 1.4;
this.maxAngle = 1.6;
// 角度增量
this.angleDelta = 0.01 * Math.random();
this.speed = 2 + Math.random()
}
// 原型 对象实例所共享
SnowDot.prototype = {
createEl: function (a, b) {
this.el = document.createElement("img");
this.el.setAttribute("src", b + "snow" + Math.floor(Math.random() * 4) + ".gif");
this.el.style.position = "absolute";
this.el.style.display = "block";
this.el.style.zIndex = "99999";
this.parent.appendChild(this.el)
},
move: function () {
if (this.angle < this.minAngle || this.angle > this.maxAngle) this.angleDelta = -this.angleDelta;
this.angle += this.angleDelta;
// 利用正弦波 余弦波(注意波形图在 pi/2 附近的取值)
this.left += this.speed * Math.cos(this.angle * Math.PI);
this.top -= this.speed * Math.sin(this.angle * Math.PI);
if (this.left < 0) this.left = this.maxLeft;
else if (this.left > this.maxLeft) this.left = 0
},
draw: function () {
this.el.style.top = Math.round(this.top) + "px";
this.el.style.left = Math.round(this.left) + "px"
},
remove: function () {
this.parent.removeChild(this.el);
this.parent = this.el = null
}
} var j = false;
addToOnLoad(function () {
j = true
}); //开启/关闭 标志
var f = true; // a : 雪花gif图片所在路径
// b : 雪花最大数目
window.createSnow = function (a, b) {
if (j) {
var c = [],
m = setInterval(function () {
// &&前的为false则后边的语句不再执行
f && b > c.length && Math.random() < b * 0.0025 && c.push(new SnowDot(a));
!f && !c.length && clearInterval(m);
for (var e = getScrollDis().top, n = getWinHeight(), d = c.length - 1; d >= 0; d--) {
if (c[d]) {
// 雪花超出指定高度
if (c[d].top > 700 || c[d].top + c[d].size + 1 > e + n) {
c[d].remove();
c[d] = null;
c.splice(d, 1) //移除数组索引d位置开始1个元素
//alert(c[d].top)
} else {
c[d].move();
c[d].draw()
}
}
}
},
40);
// 窗口滚动时 雪花移动相应的距离
addEvent(window, "scroll",
function () {
for (var e = c.length - 1; e >= 0; e--) c[e].draw()
})
} else addToOnLoad(function () {
createSnow(a, b)
})
};
window.removeSnow = function () {
f = false
}; })();  

源代码:snow.zip   页面内容节选自 阿狸-梦之城堡

javascript雪花效果 注释版的更多相关文章

  1. 编写Javascript类库(jQuery版

    编写Javascript类库(jQuery版) - 进阶者系列 - 学习者系列文章 Posted on 2014-11-13 09:29 lzhdim 阅读(653) 评论(1) 编辑 收藏 本系列文 ...

  2. Html页面雪花效果的实现

    简单介绍 昨天修改了一下博客所用的模板,冬天来了,给自己的博客加点雪花,感觉更有意境. 百度找到了非常多的结果,最终还是选用了cfs.snow.js,很赞压缩之后只有1kb左右,而且不会影响页面使用, ...

  3. 《JavaScript实用效果整理》系列分享专栏

    整理一些使用的JavaScript效果,在Web开发中遇到的比较好的动态效果,都收藏在这里,对以后的网站开发增加不少的色彩 <JavaScript实用效果整理>已整理成PDF文档,点击可直 ...

  4. CAEmitterLayer实现雪花效果

    CAEmitterLayer 简介 在iOS5.0中,Apple引入了CAEmitterLayer层,CAEmitterLayer是一个高性能的粒子效果引擎,被用来创建实时粒子动画,如:烟雾,火,雨等 ...

  5. Javascript动画效果(三)

    Javascript动画效果(三) 前面我们已经介绍了速度动画.透明度动画.多物体运动和任意值变化,并且我们在Javascript动画效果(二)中介绍到我们封装了一个简单的插件雏形,接下来我们对前面的 ...

  6. Javascript动画效果(一)

    Javascript动画效果(一) 前面我们介绍了Javascript的回到顶部效果,今天呢,我们对Javascript动画做进一步的研究.在这篇博文中我们只介绍简单的匀速运动.简单的缓冲运动和简单的 ...

  7. Javascript动画效果(二)

    Javascript动画效果(二) 在前面的博客中讲了简单的Javascript动画效果,这篇文章主要介绍我在改变之前代码时发现的一些问题及解决方法. 在前面的多物体宽度变化的例子中,我们给其增加代码 ...

  8. Javascript动画效果(四)

    Javascript动画效果(四) 前面我们自己写了一个小小的关于js动画的插件,下面我们来使用之前的框架来完成我们想要的动画效果.我们经常在淘宝网中看到,鼠标经过某一图片时,该图片有从上滚出而又从下 ...

  9. 仿360手机卫士界面效果android版源码

    仿360手机卫士界面效果android版,这个今天一大早在源码天堂的那个网站上看到了一个那个网站最新更新的一个源码,所以就分享给大学习一下吧,布局还挺不错的,而且也很简单的,我就不把我修改的那个分享出 ...

随机推荐

  1. (转)卸载SQLServer2008 数据库

    1 卸载Microsoft SQL Server 2008主程序 1.1,控制面板-程序中找到“Microsoft SQL Server 2008”,双击卸载 1.2,弹出管理界面中选择“”删除“ 1 ...

  2. framMaker、Velocity模版引擎

    1.一种模板文件,可以自动加载数据到模板里面展现. 类似:Velocity 2.使用场景 1.web开发模式 WEB-INF/view/vm 在互联网公司的开发都是基于vm的开发,其次就是使用JS的框 ...

  3. 一个关于发邮件的类,可以模拟发送对smtp服务器或者是本地文件夹

    namespace SportsStore.Domain.Concrete { public class EmailSettings { public string MailToAddress = & ...

  4. 下载和使用 Open XML PowerTools

    安装 Open XML SDK 2.5 首先,需要安装 Open XML SDK 2.5 ,从这个地址下载安装程序:http://www.microsoft.com/en-in/download/de ...

  5. C++编译错误syntax error : identifier 'THIS_FILE' 解决方法

    你到代码里搜索 THIS_FILE看是不是它定义在别的头文件前面了,如果是,把它们的头文件紧跟到Stdafx.h后面 我遇到过这问题,这样搞定的 今天遇到个编译错误:..\vc98\include\n ...

  6. android Json 解析和生成

    什么是json: JSON即JavaScript Object Natation的简称,它是一种轻量级的数据交换格式,非常适合服务器与JavaScript的交互.JSON易于人阅读和编写.同时也易于机 ...

  7. [ CodeVS冲杯之路 ] P1092

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1092/ 嗯,这道题有一定难度啊,需要先用扩展欧几里得算法求出逆元,然后按照大小构一颗带边权为小时数的树 树链剖分后在树 ...

  8. Swift 学习一函数&函数属性&懒加载

    函数 函数相当于OC中的方法 格式: func 函数名(参数列表) -> 返回值类型 {    代码块    return 返回值} func 函数名(参数列表){  // 返回值为Void 可 ...

  9. ubuntu server unable to resolve host

    cat /etc/resolv.conf (查看resolv.conf中的内容: nameserver 是动态添加的……) #通过添加/etc/resolvconf/resolv.conf.d/bas ...

  10. C# 加密算法

     public static class Common     {         #region MD5加密         /// <summary>            /// M ...