使用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 相关文章推荐
JavaScript入门教程 Cookies
Jan 31 Javascript
javascript 二维数组的实现与应用
Mar 16 Javascript
在javascript中关于节点内容加强
Apr 11 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
Aug 14 Javascript
js获取url中&quot;?&quot;后面的字串方法
May 15 Javascript
原生js结合html5制作简易的双色子游戏
Mar 30 Javascript
javascript实现3D切换焦点图
Oct 16 Javascript
Bootstrap每天必学之导航条(二)
Mar 01 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 jQuery
微信小程序中使用Promise进行异步流程处理的实例详解
Aug 17 Javascript
浅谈 Webpack 如何处理图片(开发、打包、优化)
May 15 Javascript
jqGrid表格底部汇总、合计行footerrow处理
Aug 21 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
php横向重复区域显示二法
2008/09/25 PHP
PHP判断图片格式的七种方法小结
2013/06/03 PHP
php+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
js脚本实现数据去重
2014/11/27 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
9个让JavaScript调试更简单的Console命令
2016/11/14 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
python如何将多个PDF进行合并
2019/08/13 Python
python super的使用方法及实例详解
2019/09/25 Python
pytorch中的transforms模块实例详解
2019/12/31 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
使用Keras 实现查看model weights .h5 文件的内容
2020/06/09 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
人力资源主管岗位职责
2014/01/29 职场文书
职工运动会感言
2014/02/07 职场文书
母亲节感恩寄语
2014/02/21 职场文书
作文评语集锦大全
2014/04/23 职场文书
美术课外活动总结
2014/07/08 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
给校长的建议书范文
2015/09/14 职场文书
Win11更新失败并提示0xc1900101
2022/04/19 数码科技