一、前言

前言:最近圣诞节来临,需要在页面上应用一个雪花飘落的效果,做之前产品经理给了我网络上的一个demo,地址是
http://demo.lanrenzhijia.com/demo/1225/sd/,预览了一下,效果不错,但是性能可以再优化,源码中使用setInterval重复定时器,
dom在不停地插入移除,这里主要优化这两个地方,使用setTimeout替换setInterval,减少页面dom的重排,其他地方可以自己调整。

二、应用实例demo

/**
* component: jQuery.snowflake 2013/12/19 华子yjh
* invoking: jQuery.snowflake(options)
*
// 配置对象
options = {
length: 26, // 数量
interval: 1000, // 雪花之间出现的时间间隔
duration: 24000 // 雪花的动画时间
}
*
*/

demo地址1:http://miiee.taobao.com/activity/shengdan.htm
demo地址2:http://miiee.taobao.com/

三、设计思路

第一步:

用HTML实体代表雪花外形,雪花出现的位置,大小都是随机的

第二步:

保持相邻雪花之间出现的时间间隔(或者它们之间的距离)永远一致; 就必须使用重复定时器,使用双setTimeout,而非setInterval,这一步很重要

setTimeout(function call() {
// do something
setTimeout(call, interval);
},0); // 使用双setTimeout模拟重复定时器对于对于自动轮播等其他应用非常有用,
// 推荐阅读javascript高级程序设计一书有关setInterval的缺点及解决办法

四、组件源码

最初代码:

$.extend({
// 雪花飘落组件
snowflake: function(options) {
var flakeHtmlStr = '',
config = {
length: 26, // 数量
interval: 1000, // 雪花之间出现的时间间隔
duration: 24000 // 雪花的动画时间
};
$.extend(config, options || {}); var len = config.length,
$win = $(window),
win_width = $win.width(),
win_height = $win.height(),
timeoutId = null,
$items,
i,
initStyle = {
position: 'absolute',
top: '-50px',
zIndex: 9999,
opacity: 1,
fontSize: 0,
color: '#FFF'
},
endStyle = {
top: win_height + 50 + 'px',
opacity: 0
}; // 插入DOM,并初始化其样式
for (i = 0; i < len; i++) {
flakeHtmlStr += '<div class="snow-flake">❄</div>';
}
$(flakeHtmlStr).appendTo('body');
$items = $('.snow-flake').css(initStyle).wrapAll('<div id="snowflake-box"></div>'); // 处理单个雪花
function handleItem(idx) {
var $itm = $items.eq(idx).css(initStyle),
w, val;
$itm.css({
fontSize: 20 + Math.ceil(Math.random() * 30, 10) + 'px'
});
w = $itm.width();
val = Math.floor(Math.random() * win_width);
if ((val + w) >= win_width) {
val = val - w;
}
$itm.css({
left: val + 'px'
})
.animate(endStyle, config.duration);
} // 开始运行
function running() {
var i = 0;
setTimeout(function call() {
handleItem(i);
if (i < len-1) {
i++;
}
else {
i = 0;
}
setTimeout(call, config.interval);
}, 0);
}
running();
}
}); $.snowflake(); // 调用

更新优化后的代码:

$.extend({
// 雪花飘落组件
snowflake: function(options) {
var $items, len,
win_height = $(window).height(),
maxVal = $(window).width() - 24, // 防止浏览器出现横向滚动条,24px为font-size: 35px;时的宽度 options = $.extend({
length: 21, // 数量
interval: 1200, // 雪花之间出现的时间间隔
duration: 24000 // 雪花的动画时间
}, options || {}); len = options.length; // 初始化dom
(function(){
var flakeHtmlStr = '', i; // 插入DOM,并初始化其样式
for (i = 0; i < len; i++) {
flakeHtmlStr += '<div class="snow-flake">❄</div>';
}
$(flakeHtmlStr).appendTo('body');
$items = $('.snow-flake').css({
position: 'absolute',
top: '-40px',
color: '#FFF',
zIndex: 999
}).wrapAll('<div id="snowflake-box"></div>');
}()); // 处理单个雪花
function handleItem(idx) {
$items.eq(idx)
.css({
top: '-40px',
opacity: 1,
left: Math.random() * maxVal + 'px',
fontSize: [25, 30, 35][(Math.random() * 3).toString().charAt(0)] + 'px'
})
.animate({
top: win_height + 'px',
opacity: 0
}, options.duration);
} // 开始运行
function running() {
var i = 0;
setTimeout(function call() {
handleItem(i);
if (i < len-1) {
i++;
}
else {
i = 0;
}
setTimeout(call, options.interval);
}, 0);
}
running();
}
}); $.snowflake(); // 调用

转载请注明出处:博客园华子yjh

jQuery.snowflake雪花飘落插件的更多相关文章

  1. jquery的浪漫(跑马灯 + 雪花飘落)

    jquery的浪漫 主要用到知识点: 鼠标事件onmousedown() onmousemove() onmouseup() jquery的运用,对dom元素的增删改查 css3 3d 功能的灵活运用 ...

  2. Qt实现桌面动态背景雪花飘落程序

            曾经收到过一份礼物,一个雪花飘落的程序,觉得效果很炫,通过前几篇的学习,我们已经掌握了贴图的一些技巧了,那么现在就可以自己实现了(当然你必须先拥有qt信号与槽的基础知识),这里先看效果 ...

  3. HTML5 canvas绘制雪花飘落

    Canvas是HTML5新增的组件,它就像一块幕布,可以用JavaScript在上面绘制各种图表.动画等. 没有Canvas的年代,绘图只能借助Flash插件实现,页面不得不用JavaScript和F ...

  4. .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块

    .Net Core ORM选择之路,哪个才适合你   因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...

  5. 个人网站html5雪花飘落代码JS特效下载

    如何给自己的网站/页面添加雪花代码.特效呢?有的网站配合自己的主题模板添加雪花飘落效果挺好看的.特别是与冬天季节相关的主题,很多的博客空间都加了雪花的效果.在网上搜索了几种雪花效果,做了简单的修改,在 ...

  6. 简单说 JavaScript实现雪花飘落效果

    说明 这次实现的雪花飘落的效果很简单,主要是为了练习练习JavaScript中的定时器,setTimeout 和 setInterval. 效果图 解释setTimeout() setTimeout函 ...

  7. 16款最佳的 jQuery Time Picker 时间选择插件

    jQuery 插件可以为你做许多事情,你可以很容易地把这些插件集成到您的网站.网络上的 jQuery 日期选择器和日历插件很多,但找不到很满意的时间选择器插件. 在这里,我们收集了最好的一组 jQue ...

  8. 强大的支持多文件上传的jQuery文件上传插件Uploadify

    支持多文件上传的jQuery文件上传插件Uploadify,目前此插件有两种版本即Flash版本和HTML5版本,对于HTML5版本会比较好的支持手机浏览器,避免苹果手机Safari浏览器不支持Fla ...

  9. jQuery文件上传插件Uploadify(转)

    一款基于flash的文件上传,有进度条和支持大文件上传,且可以多文件上传队列. 这款在flash的基础上增加了html5的支持,所以在移动端也可以使用. 由于官方提供的版本是flash免费,html5 ...

随机推荐

  1. 信息安全系统设计基础_exp2

    北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础 班级:1353 姓名:吴子怡.郑伟 学号:20135313.20135322 指导教师: 娄嘉鹏 实验 ...

  2. 20155301-滕树晨 第二次随笔作业--从现有技能获取的经验应用于JAVA中

    第二次随笔--从现有技能获取的经验应用于JAVA中 你有什么技能比大多人(超过90%以上)更好? 这个想了半天,有一个是我乒乓球还是比较擅长的,在学校里可能比百分之90的人要强,在外面肯定是不如了.再 ...

  3. sublime文档

    英文http://docs.sublimetext.info/en/latest/index.html 翻译http://feliving.github.io/Sublime-Text-3-Docum ...

  4. linux中的数值运算

    一.declare 作用:声明变量类型,bash默认变量为字符串类型的,并且字符串在拼接时直接拼接,不需要加号 使用方法: 二.数值运算 加法运算 a= b= c=$(($a+$b)) echo $c

  5. ACL权限的学习

    ACL ACL:访问控制列表,其主要作用是将一些"用户"加到表中,并对这些用户的行为进行控制. 案例: 有个文件夹project是root用户创建,并且关于这个文件夹有以下权限 d ...

  6. WCF 入门 (17)

    前言 看的是入门视频,就希望培养一个学习的习惯吧. 前段时间看了微软的SurfaceBook的视频,被惊艳到了,但是我没钱买啊... 第17集 WCF中未经处理的异常 Unhandled except ...

  7. JavaScript表单处理(上)

    为了分担服务器处理表单的压力,JavaScript提供了一些解决方案,从而大大打破了处处依赖服务器的局面.  发文不易,转载请亲注明出处,谢谢! 一.表单介绍 在HTML中,表单是由<form& ...

  8. Intelli IDEA 14.04开发版+注册码

    Idea,一款比较出色的IDE开发工具,懂她的人,自然懂得. 本版本-14.04+注册码 注册界面  注册码:               Name:happy                KEY: ...

  9. 用form表单实现Ajax---post提交

    实例讲解:新闻发布实现无刷新上传,显示 html代码: 注意:文本框中并没有id  ,,只有name.jquery获取每个文本框的值还要在拼写提交格式(id=value&name=value& ...

  10. 【poj3159】 Candies

    http://poj.org/problem?id=3159 (题目链接) 题意 有n个小朋友,班长要给每个小朋友发糖果.m种限制条件,小朋友A不允许小朋友B比自己多C个糖果.问第n个小朋友最多比第1 ...