使用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 Math 对象的方法
Sep 01 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
Sep 21 Javascript
JavaScript程序中的流程控制语句用法总结
May 23 Javascript
详解jQuery简单的表单应用
Dec 16 Javascript
Router解决跨模块下的页面跳转示例
Jan 11 Javascript
Vue 源码分析之 Observer实现过程
Mar 29 Javascript
你点的 ES6一些小技巧,请查收
Apr 25 Javascript
vue中使用element-ui进行表单验证的实例代码
Jun 22 Javascript
JQuery中queue方法用法示例
Jan 31 jQuery
Vue的状态管理vuex使用方法详解
Feb 05 Javascript
vue实现计算器功能
Feb 22 Javascript
使用js和canvas实现时钟效果
Sep 08 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
星际流派综述
2020/03/04 星际争霸
PHP中如何调用webservice的实例参考
2013/04/25 PHP
解析php中获取url与物理路径的总结
2013/06/21 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
JQuery 选择器、过滤器介绍
2011/02/14 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
jquery图片不完全按比例自动缩小的简单代码
2013/07/29 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
javascript 分号总结及详细介绍
2016/09/24 Javascript
AngularJS表单基本操作
2017/01/09 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
python实现在sqlite动态创建表的方法
2015/05/08 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
python 实现返回一个列表中出现次数最多的元素方法
2019/06/11 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
Python使用jupyter notebook查看ipynb文件过程解析
2020/06/02 Python
简单了解python关键字global nonlocal区别
2020/09/21 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
美国尼曼百货官网:Neiman Marcus
2019/09/05 全球购物
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
优秀生推荐信范文
2013/11/28 职场文书
计算机专业毕业生自荐信
2013/12/31 职场文书
国际贸易专业个人鉴定
2014/02/22 职场文书
销售活动策划方案
2014/08/26 职场文书
2015年新农合工作总结
2015/03/30 职场文书
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL