使用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 相关文章推荐
php对mongodb的扩展(小试牛刀)
Nov 11 Javascript
Window.Open打开窗体和if嵌套代码
Apr 15 Javascript
原生js实现addClass,removeClass,hasClass方法
Apr 27 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
May 25 Javascript
原生js实现淘宝购物车功能
Jun 23 Javascript
常用jQuery选择器汇总
Feb 02 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
Sep 22 Javascript
微信小程序实现图片上传
May 23 Javascript
JavaScript中如何对多维数组(矩阵)去重的实现
Dec 04 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
Feb 09 Javascript
vue实现从外部修改组件内部的变量的值
Jul 30 Javascript
Vue+Java+Base64实现条码解析的示例
Sep 23 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编程中字符串处理的5个技巧小结
2007/11/13 PHP
php 数组二分法查找函数代码
2010/02/16 PHP
初品cakephp 入门基础
2012/02/16 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
javascript 表格排序和表头浮动效果(扩展SortTable)
2009/04/07 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
js监听鼠标事件控制textarea输入字符串的个数
2014/09/29 Javascript
让JavaScript中setTimeout支持链式操作的方法
2015/06/19 Javascript
JS原型、原型链深入理解
2016/02/27 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
图文详解JavaScript的原型对象及原型链
2016/08/02 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
2019/06/10 Javascript
从零开始在vue-cli4配置自适应vw布局的实现
2020/06/08 Javascript
Python中的面向对象编程详解(下)
2015/04/13 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
幼儿园长自我鉴定
2013/10/17 职场文书
四年的个人工作自我评价
2013/12/10 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
十佳标兵事迹材料
2014/08/18 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript