使用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 相关文章推荐
[JSF]使用DataModel处理表行事件的实例代码
Aug 05 Javascript
通过Jquery的Ajax方法读取将table转换为Json
May 31 Javascript
javascript动态创建及删除元素的方法
Dec 22 Javascript
Bootstrap 组件之按钮(二)
May 11 Javascript
pc加载更多功能和移动端下拉刷新加载数据
Nov 07 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
Dec 14 Javascript
Vue.js实战之利用vue-router实现跳转页面
Apr 01 Javascript
微信小程序radio组件使用详解
Jan 31 Javascript
js 图片转base64的方式(两种)
Apr 24 Javascript
vue.js2.0 实现better-scroll的滚动效果实例详解
Aug 13 Javascript
JS+html5实现异步上传图片显示上传文件进度条功能示例
Nov 09 Javascript
通过高德地图API获得某条道路上的所有坐标用于描绘道路的方法
Aug 24 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
图形数字验证代码
2006/10/09 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
PHP中include()与require()的区别说明
2017/02/14 PHP
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
Jquery常用技巧收集整理篇
2010/11/14 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
解决用jquery load加载页面到div时,不执行页面js的问题
2014/02/22 Javascript
jquery实现最简单的滑动菜单效果代码
2015/09/12 Javascript
JavaScript小技巧整理篇(非常全)
2016/01/26 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
如何使用angularJs
2017/05/08 Javascript
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
JS库之Waypoints的用法详解
2017/09/13 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
JS Math对象与Math方法实例小结
2019/07/05 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
Node.js API详解之 repl模块用法实例分析
2020/05/25 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
[50:28]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs KG
2018/04/01 DOTA
Python文档生成工具pydoc使用介绍
2015/06/02 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
python help函数实例用法
2020/12/06 Python
农贸市场管理制度
2014/01/31 职场文书
安全口号大全
2014/06/21 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
导游词之千岛湖
2019/09/23 职场文书
使用python向MongoDB插入时间字段的操作
2021/05/18 Python
PHP正则表达式之RCEService回溯
2022/04/11 PHP