(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. Android中通过广播方式调起第三方App

    今天紧急的跟进一个百度视频App无法调起百度贴吧App的问题,当然,这个是只发现是在4.x的android系统下发生,在2.x版本下,一切正常,(其实是3.1及以上的版本都有问题)具体场景为: 1.贴 ...

  2. android menu 开发

    menu 分类: 选项菜单(OptionsMenu) 上下文菜单(ContextMenu) 子菜单(SubMenu) 弹出菜单(Popup)   首先说 选项菜单(OptionsMenu) 一.方法介 ...

  3. Orchard官方文档翻译(五) Dashboard相关

    原文地址:http://docs.orchardproject.net/Documentation/Getting-around-the-dashboard 想要查看文档目录请用力点击这里 最近想要学 ...

  4. 【翻译习作】 Windows Workflow Foundation程序开发

    近期整理硬盘,把09年的翻译习作<Windows Workflow Foundation程序开发>找出来了.现在又把译文过了一遍,做了些修改,贴出来献丑了.原书是<Programmi ...

  5. memcached 学习(一)

    memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件.现在已成为 mixi. hatena. Faceboo ...

  6. QTP动态加载对象库

    Public Function AddObjectRepository(path) On Error Resume Next Dim pos, repath If instr(path,". ...

  7. 虚拟内存和swap分区的关系

    首先,这两个概念分别对应windows和linux,即:windows:虚拟内存linux:swap分区 windows即使物理内存没有用完也会去用到虚拟内存,而Linux不一样 Linux只有当物理 ...

  8. No.001 Two Sum

    Two Sum Total Accepted: 262258 Total Submissions: 1048169 Difficulty: Easy Given an array of integer ...

  9. TCP/IP详解学习笔记(9)-- 广播,多播,IGMP:网际组管理协议

    1.概述      IP有三种地址:单播地址, 广播地址,多播地址.      广播和多播仅应用于UDP.      每个以太网帧包含源主机和目的主机的以太网地址.通常每个以太网帧发往单个目的主机,目 ...

  10. [JFinal 1] JFinal和SSH中使用拦截器的对比

    导读:先前在做.NET项目时,拦截的功能主要是依靠缓存session来实现.当需要跳转到某个页面,使用某个功能查询一些数据时,会根据session中的用户值来判断是否已经正常登录,如果没有,则重定向到 ...