使用javascript实现雪花飘落的效果


Posted in Javascript onJanuary 13, 2015

看了javascript网页特效实例大全中的图片飘下的效果实例,觉得值得动手学习下。

就把图片改成雪花图,完成一个雪花飘下的效果。

并且,其中有些内容比较陈旧了,那么就学者改掉吧。

包括:

1.对left和top的操作仅支持IE浏览器,这咋行,必须得支持chrome。
2.控制图片下落的过程还要去检索element,不好吧,那就改成数组维持,直接操作数组中维持的对象,启不更快。
3.向文档中添加元素直接改成通过JS代码创建元素对象的方式。

实现思路:

1.初始化生成10个div,全都采用绝对定位,每个div中放一个雪花图片,设置好宽高,并保存在数组中,便于后面下雪的函数直接操作。
2.初始化每个div的横坐标和纵坐标,总要给雪花一个下落的起始位置吧。
3.初始化为每个雪花都设一个纵向的下落步长,一个横向的摆动步长,这样每个雪花都会以不同的速度下落和摆动。
4.做一个下雪的函数,每10秒调一下该函数,每调一次该函数,就是控制每个雪花在纵向下落一个自身的步长,横向的摆动通过正弦函数算出一个正弦值后乘以幅度,这样雪花下落就是按照正弦波形的方式进行。

图片可以网上随便找。

以下代码兼容IE8+,Chrome。

<BODY>

  <SCRIPT LANGUAGE="JavaScript">

    //图片的过程中,横坐标的轨迹是以一点为中心的正弦曲线

    //利用了setTimeout函数完成了动画的功能

    //图片

    var snowsrc="雪花.png"

    //雪花个数

    var no = 10; 

    //声明变量,xp表示横坐标,yp表示纵坐标>

    var dx, xp, yp;

    //声明变量,am表示左右摆动的幅度,stx表示横坐标的偏移步长,sty表示纵坐标的步长>

    var am, stx, sty;  

    {

      //获取当前窗口的宽度

      clientWidth = document.body.clientWidth;

      //获取当前窗口的高度

      clientHeight = document.body.clientHeight;

    }

    var dx = new Array();

    var xp = new Array();

    var yp = new Array();

    var am = new Array();

    var stx = new Array();

    var sty = new Array();

    var snowFlakes = new Array();

    for (i = 0; i < no; ++ i) {  

      dx[i] = 0;                        

      //第i个图片的横坐标初始值

      xp[i] = Math.random()*(clientWidth-50);  

      yp[i] = Math.random()*clientHeight;//第i个图片的纵坐标初始值

      am[i] = Math.random()*20;         //第i个图片的左右摆动的幅度

      stx[i] = 0.02 + Math.random()/10; //第i个图片x方向的步长

      sty[i] = 0.7 + Math.random();     //第i个图片y方向的步长

      //生成一个容纳雪花图片的div,并设置其绝对坐标

      var snowFlakeDiv = document.createElement('div');

      snowFlakeDiv.setAttribute('id', 'dot'+ i);

      snowFlakeDiv.style.position = 'absolute';

      snowFlakeDiv.style.top = 15;

      snowFlakeDiv.style.left = 15;

      //生成一个雪花图片对象,设置宽高,并加入div

      var snowFlakeImg = document.createElement('img');

      snowFlakeImg.setAttribute('src', snowsrc);

      snowFlakeImg.style.width = 30;

      snowFlakeImg.style.height = 30;

      //将雪花div加入到document中,并通过数组保存

      snowFlakeDiv.appendChild(snowFlakeImg);

      document.body.appendChild(snowFlakeDiv);

      snowFlakes[i] = snowFlakeDiv;

    }

    function snow() {  

      for (i = 0; i < no; ++ i) {  

        //第i个图片的纵坐标加上步长

        yp[i] += sty[i];

        //如果新坐标超过了屏幕下沿,重置该图片的信息,包括横坐标、纵坐标以及x方向的步长和y方向的步长

        if (yp[i] > clientHeight-50) {

          //重新赋值图片的横坐标

          xp[i] = Math.random()*(clientWidth-am[i]-30);

          //重新赋值图片的纵坐标

          yp[i] = 0;

        }

        dx[i] += stx[i];//dx变量加上一个步长

        //直接操作数组中对应的雪花div

        var snowFlakeDiv = snowFlakes[i];

        //更新图片的纵坐标

        snowFlakeDiv.style.top = yp[i];

        //更新图片的横坐标

        snowFlakeDiv.style.left = xp[i] + am[i]*Math.sin(dx[i]);

      }

      //设定动画刷新的时间周期

      setTimeout("snow()", 10);

    }

    //调用snowIE()函数 

    snow();

  </script>

</BODY>

以上就是全部代码了,效果还是挺棒的,具体的解释请看注释,这里就不多废话了,希望对大家能有所帮助。

Javascript 相关文章推荐
5 cool javascript apps
Mar 24 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
Aug 16 Javascript
单击复制文字兼容各浏览器的完美解决方案
Jul 04 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
Sep 01 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
Sep 16 Javascript
深入理解逻辑表达式的用法 与或非的用法
Jun 06 Javascript
AngularJS自定义控件实例详解
Dec 13 Javascript
bootstrap fileinput 上传插件的基础使用
Feb 17 Javascript
JS实现烟花爆炸效果
Mar 10 Javascript
Vue如何将页面导出成PDF文件
Aug 17 Javascript
手把手教你实现 Promise的使用方法
Sep 02 Javascript
node.js文件的复制、创建文件夹等相关操作
Feb 05 Javascript
javascript数组输出的两种方式
Jan 13 #Javascript
仿JQuery输写高效JSLite代码的一些技巧
Jan 13 #Javascript
JS判断客服QQ号在线还是离线状态的方法
Jan 13 #Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
Jan 13 #Javascript
jquery删除指定子元素代码实例
Jan 13 #Javascript
JavaScript删除指定子元素代码实例
Jan 13 #Javascript
JS长整型精度问题实例分析
Jan 13 #Javascript
You might like
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
Discuz批量替换帖子内容的方法(使用SQL更新数据库)
2014/06/23 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
配置Nginx+PHP的正确思路与过程
2016/05/10 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
jQuery实现一个简单的验证码功能
2017/06/26 jQuery
js禁止表单重复提交
2017/08/29 Javascript
详解几十行代码实现一个vue的状态管理
2019/01/28 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
微信小程序开发中var that =this的用法详解
2020/01/18 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
JavaScript实现移动小精灵的案例代码
2020/12/12 Javascript
[50:21]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/19 DOTA
详细介绍Python语言中的按位运算符
2013/11/26 Python
python调用tcpdump抓包过滤的方法
2018/07/18 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
2019/02/12 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
2019/12/18 Python
python实现简单飞行棋
2020/02/06 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
2020/06/02 Python
HTML5制作表格样式
2016/11/15 HTML / CSS
详解如何解决canvas图片getImageData,toDataURL跨域问题
2018/09/17 HTML / CSS
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
给同学的道歉信
2014/01/16 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
2014坚持党风廉政建设思想汇报
2014/09/18 职场文书
2015年小学美术工作总结
2015/05/25 职场文书
2016年教师节特级教师获奖感言
2015/12/09 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
uwsgi+nginx代理Django无法访问静态资源的解决
2021/05/10 Servers