使用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 相关文章推荐
多浏览器支持的右下角浮动窗口
Apr 01 Javascript
jquery中对表单的基本操作代码
Jul 29 Javascript
基于jQuery UI CSS Framework开发Widget的经验
Aug 21 Javascript
jQuery针对各类元素操作基础教程
Aug 29 Javascript
ajax跨域调用webservice的实现代码
May 09 Javascript
js实现固定宽高滑动轮播图效果
Jan 13 Javascript
微信小程序 自定义对话框实例详解
Jan 20 Javascript
vue中计算属性(computed)、methods和watched之间的区别
Jul 27 Javascript
详解Immutable及 React 中实践
Mar 01 Javascript
详解puppeteer使用代理
Dec 27 Javascript
Vue中对iframe实现keep alive无刷新的方法
Jul 23 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
Oct 30 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查询域名状态whois的类
2006/11/25 PHP
PHP一些常用的正则表达式字符的一些转换
2008/07/29 PHP
PHP 透明水印生成代码
2012/08/27 PHP
php文件操作相关类实例
2015/06/18 PHP
PHP单例模式简单用法示例
2017/06/23 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
javascript单引号和双引号的区别和处理
2014/05/14 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
Vue.2.0.5实现Class 与 Style 绑定的实例
2017/06/20 Javascript
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
微信小程序中换行空格(多个空格)写法详解
2018/07/10 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
让Vue响应Map或Set的变化操作
2020/11/11 Javascript
Python中的startswith和endswith函数使用实例
2014/08/25 Python
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
Python Request类源码实现方法及原理解析
2020/08/17 Python
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
大学生思想汇报范文
2013/12/31 职场文书
个人授权委托书样本
2014/09/13 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
会计工作总结范文2014
2014/12/23 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
JavaScript前端面试组合函数
2022/06/21 Javascript