一、前言

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

二、应用实例demo

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

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

三、设计思路

第一步:

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

第二步:

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

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

四、组件源码

最初代码:

  1. $.extend({
  2. // 雪花飘落组件
  3. snowflake: function(options) {
  4. var flakeHtmlStr = '',
  5. config = {
  6. length: 26, // 数量
  7. interval: 1000, // 雪花之间出现的时间间隔
  8. duration: 24000 // 雪花的动画时间
  9. };
  10. $.extend(config, options || {});
  11.  
  12. var len = config.length,
  13. $win = $(window),
  14. win_width = $win.width(),
  15. win_height = $win.height(),
  16. timeoutId = null,
  17. $items,
  18. i,
  19. initStyle = {
  20. position: 'absolute',
  21. top: '-50px',
  22. zIndex: 9999,
  23. opacity: 1,
  24. fontSize: 0,
  25. color: '#FFF'
  26. },
  27. endStyle = {
  28. top: win_height + 50 + 'px',
  29. opacity: 0
  30. };
  31.  
  32. // 插入DOM,并初始化其样式
  33. for (i = 0; i < len; i++) {
  34. flakeHtmlStr += '<div class="snow-flake">❄</div>';
  35. }
  36. $(flakeHtmlStr).appendTo('body');
  37. $items = $('.snow-flake').css(initStyle).wrapAll('<div id="snowflake-box"></div>');
  38.  
  39. // 处理单个雪花
  40. function handleItem(idx) {
  41. var $itm = $items.eq(idx).css(initStyle),
  42. w, val;
  43. $itm.css({
  44. fontSize: 20 + Math.ceil(Math.random() * 30, 10) + 'px'
  45. });
  46. w = $itm.width();
  47. val = Math.floor(Math.random() * win_width);
  48. if ((val + w) >= win_width) {
  49. val = val - w;
  50. }
  51. $itm.css({
  52. left: val + 'px'
  53. })
  54. .animate(endStyle, config.duration);
  55. }
  56.  
  57. // 开始运行
  58. function running() {
  59. var i = 0;
  60. setTimeout(function call() {
  61. handleItem(i);
  62. if (i < len-1) {
  63. i++;
  64. }
  65. else {
  66. i = 0;
  67. }
  68. setTimeout(call, config.interval);
  69. }, 0);
  70. }
  71. running();
  72. }
  73. });
  74.  
  75. $.snowflake(); // 调用

更新优化后的代码:

  1. $.extend({
  2. // 雪花飘落组件
  3. snowflake: function(options) {
  4. var $items, len,
  5. win_height = $(window).height(),
  6. maxVal = $(window).width() - 24, // 防止浏览器出现横向滚动条,24px为font-size: 35px;时的宽度
  7.  
  8. options = $.extend({
  9. length: 21, // 数量
  10. interval: 1200, // 雪花之间出现的时间间隔
  11. duration: 24000 // 雪花的动画时间
  12. }, options || {});
  13.  
  14. len = options.length;
  15.  
  16. // 初始化dom
  17. (function(){
  18. var flakeHtmlStr = '', i;
  19.  
  20. // 插入DOM,并初始化其样式
  21. for (i = 0; i < len; i++) {
  22. flakeHtmlStr += '<div class="snow-flake">❄</div>';
  23. }
  24. $(flakeHtmlStr).appendTo('body');
  25. $items = $('.snow-flake').css({
  26. position: 'absolute',
  27. top: '-40px',
  28. color: '#FFF',
  29. zIndex: 999
  30. }).wrapAll('<div id="snowflake-box"></div>');
  31. }());
  32.  
  33. // 处理单个雪花
  34. function handleItem(idx) {
  35. $items.eq(idx)
  36. .css({
  37. top: '-40px',
  38. opacity: 1,
  39. left: Math.random() * maxVal + 'px',
  40. fontSize: [25, 30, 35][(Math.random() * 3).toString().charAt(0)] + 'px'
  41. })
  42. .animate({
  43. top: win_height + 'px',
  44. opacity: 0
  45. }, options.duration);
  46. }
  47.  
  48. // 开始运行
  49. function running() {
  50. var i = 0;
  51. setTimeout(function call() {
  52. handleItem(i);
  53. if (i < len-1) {
  54. i++;
  55. }
  56. else {
  57. i = 0;
  58. }
  59. setTimeout(call, options.interval);
  60. }, 0);
  61. }
  62. running();
  63. }
  64. });
  65.  
  66. $.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. IOS开发之——自定义导航控制器

    BasicNavigationViewController:UINavigationViwController /* 隐藏导航底部线条 */ -(void)viewDidLoad{    [super ...

  2. c#字符串转换为日期,支持任意字符串

    文章关键字: c#字符串转换为日期 c#日期转换字符串   字符串转换日期   字符串转换为date   整数转换为字符串   浮点数转换为字符串 字符串转换为时间   将字符串转换为时间   字符转 ...

  3. 高层次综合(HLS)-简介

    本文是我近段时间的学习总结,主要参考了Xilinx的技术文档以及部分网上其他资料.文档主要包括ug998<Introduction to FPGA Design Using High-Level ...

  4. Android调用系统相册和拍照的Demo

    最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题 ...

  5. [BZOJ1856][SCOI2010]字符串(组合数学)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1856 分析:http://www.cnblogs.com/jianglangcaiji ...

  6. ThinkPHP之MVC与URL访问

    一.初探 我们在apache的www目录下创建一个文件夹,其命名为我们的应用名.然后通过入口文件生成我们的应用. 当我们用ThinkPHP创建好一个应用后,其目录结果如下所示 那么我们如何来访问我们应 ...

  7. Linq表达式开窍

    static IQueryable<T> GetPageList<T,TKey>(Expression<Func<T,bool>> whereLambd ...

  8. NABCD分析java音乐播放器

    程设计题目:java音乐播放器 一.课程设计目的 1.编程设计音乐播放软件,使之实现音乐播放的功能. 2.培养学生用程序解决实际问题的能力和兴趣. 3.加深java中对多媒体编程的应用. 二.课程设计 ...

  9. git for windows 入门随笔

    引言: Git 是当前最流行的集中化的版本控制程序之一(版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统),Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件 ...

  10. Xamarin.Forms——WebView技术研究

    在Xamarin中有一些Forms原生不太好实现的内容可以考虑使用HTML.Javascript.CSS那一套前端技术来实现,使用WebView来承载显示本地或网络上的HTML文件.不像OpenUri ...