使用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 相关文章推荐
JS上传前预览图片实例
Mar 25 Javascript
jquery放大镜效果超漂亮噢
Nov 15 Javascript
jquery中load方法的用法及注意事项说明
Feb 22 Javascript
jquery禁用右键示例
Apr 28 Javascript
jQuery制作简洁的图片轮播效果
Apr 03 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
Sep 17 Javascript
JavaScript的==运算详解
Jul 20 Javascript
给easyui的datebox控件添加清空按钮的实现方法
Nov 09 Javascript
layer实现弹窗提交信息
Dec 12 Javascript
分析JS单线程异步io回调的特性
Dec 01 Javascript
vue-cli+webpack项目 修改项目名称的方法
Feb 28 Javascript
Vue中实现权限控制的方法示例
Jun 07 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后退一页表单内容保存实现方法
2012/06/17 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
Yii2使用表单上传文件的实例代码
2017/08/03 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
JavaScript函数、方法、对象代码
2008/10/29 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
Js+php实现异步拖拽上传文件
2015/06/23 Javascript
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
jquery 一键复制到剪切板的实例
2017/09/20 jQuery
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
小程序图片剪裁加旋转的示例代码
2018/07/10 Javascript
js中的闭包实例展示
2018/11/01 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
javascript如何实现create方法
2019/11/04 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
vue实现循环滚动列表
2020/06/30 Javascript
TensorFlow Session使用的两种方法小结
2018/07/30 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
python如何写try语句
2020/07/14 Python
详解HTML5 data-* 自定义属性
2018/01/24 HTML / CSS
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
初三物理教学反思
2014/01/21 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
养成教育经验材料
2014/05/26 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
异地年检委托书范本
2014/09/24 职场文书
公务员检讨书
2014/11/01 职场文书