使用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 相关文章推荐
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
Dec 05 Javascript
javascript实现别踩白块儿小游戏程序
Nov 22 Javascript
js阻止浏览器默认行为触发的通用方法(推荐)
May 15 Javascript
js+css3制作时钟特效
Oct 16 Javascript
jQuery用FormData实现文件上传的方法
Nov 21 Javascript
js仿新浪微博消息发布功能
Feb 17 Javascript
JavaScript字符串检索字符的方法
Jun 23 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
Nov 05 Javascript
详解Vuex下Store的模块化拆分实践
Jul 31 Javascript
原生javascript中this几种常见用法总结
Feb 24 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
Feb 27 Javascript
请求时token过期自动刷新token操作
Sep 11 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脚本的10个技巧(8)
2006/10/09 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
jquery 元素相对定位代码
2010/10/15 Javascript
jquery基础教程之数组使用详解
2014/03/10 Javascript
关于JavaScript命名空间的一些心得
2014/06/07 Javascript
js图片卷帘门导航菜单特效代码分享
2015/09/10 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
JavaScript数组方法总结分析
2016/05/06 Javascript
JS如何判断json是否为空
2016/07/06 Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
2016/10/28 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
vue2.0 实现页面导航提示引导的方法
2018/03/13 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
Python环境下搭建属于自己的pip源的教程
2016/05/05 Python
Python 字符串大小写转换的简单实例
2017/01/21 Python
PyQt5主窗口动态加载Widget实例代码
2018/02/07 Python
Python 学习教程之networkx
2019/04/15 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
2019/11/15 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
2020/07/13 Python
详解python datetime模块
2020/08/17 Python
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
美国知名眼镜网站:Target Optical
2020/04/04 全球购物
《三顾茅庐》教学反思
2014/04/10 职场文书
《与朱元思书》的教学反思
2014/04/17 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
新店开张活动方案
2014/08/24 职场文书
免职通知
2015/04/23 职场文书
《藏戏》教学反思
2016/02/23 职场文书
python利用pandas分析学生期末成绩实例代码
2021/07/09 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技