使用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 checkbox全选/取消全选实现代码
Nov 14 Javascript
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
Dec 27 Javascript
JS的事件绑定深入认识
Jun 26 Javascript
express的中间件basicAuth详解
Dec 04 Javascript
基于vue 开发中出现警告问题去除方法
Jan 25 Javascript
JS中双击和单击事件冲突的解决方法
Apr 09 Javascript
微信公众号生成新浪短网址的实现(快速生成)
Aug 18 Javascript
Vue分页插件的前后端配置与使用
Oct 09 Javascript
JS数组方法reduce的用法实例分析
Mar 03 Javascript
详解JavaScript匿名函数和闭包
Jul 10 Javascript
Vue自定义表单内容检查rules实例
Oct 30 Javascript
video.js添加自定义组件的方法
Dec 09 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
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
PHP 地址栏信息的获取代码
2009/01/07 PHP
php中批量替换文件名的实现代码
2011/07/20 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
php分页函数示例代码分享
2014/02/24 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
html数组字符串拼接的最快方法
2009/09/16 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
js倒计时抢购实例
2015/12/20 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
详解vue axios用post提交的数据格式
2018/08/07 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
在Mac OS上搭建Python的开发环境
2015/12/24 Python
谈谈Python进行验证码识别的一些想法
2016/01/25 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
Python Selenium Cookie 绕过验证码实现登录示例代码
2018/04/10 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
2018/07/11 Python
通过cmd进入python的实例操作
2019/06/26 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
2021/02/16 Python
canvas需要在标签里直接定义宽高
2014/12/17 HTML / CSS
应届毕业生就业自荐信
2013/10/26 职场文书
毕业生就业自荐书
2013/12/15 职场文书
家长学校工作方案
2014/05/07 职场文书
物流管理专业求职信
2014/05/29 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
中学综治宣传月活动总结
2015/05/07 职场文书
保密法制宣传月活动总结
2015/05/07 职场文书
2015民办小学年度工作总结
2015/05/26 职场文书
《植树问题》教学反思
2016/03/03 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
2021/06/05 Python
Python使用openpyxl模块处理Excel文件
2022/06/05 Python