原生JS实现的雪花飘落动画效果


Posted in Javascript onMay 03, 2018

本文实例讲述了原生JS实现的雪花飘落动画效果。分享给大家供大家参考,具体如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>3water.com JS下雪动画</title>
  <meta name="description" content="">
  <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<style>
  .masthead {
    background-color:#333;
    display:block;
    width:100%;
    height:400px;
  }
</style>
<body>
<div class="masthead"></div>
<script>
  (function () {
    var COUNT = 300;
    var masthead = document.querySelector('.masthead');
    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d');
    var width = masthead.clientWidth;
    var height = masthead.clientHeight;
    var i = 0;
    var active = false;
    function onResize() {
      width = masthead.clientWidth;
      height = masthead.clientHeight;
      canvas.width = width;
      canvas.height = height;
      ctx.fillStyle = '#FFF';
      var wasActive = active;
      active = width > 600;
      if (!wasActive && active)
        requestAnimFrame(update);
    }
    var Snowflake = function () {
      this.x = 0;
      this.y = 0;
      this.vy = 0;
      this.vx = 0;
      this.r = 0;
      this.reset();
    };
    Snowflake.prototype.reset = function() {
      this.x = Math.random() * width;
      this.y = Math.random() * -height;
      this.vy = 1 + Math.random() * 3;
      this.vx = 0.5 - Math.random();
      this.r = 1 + Math.random() * 2;
      this.o = 0.5 + Math.random() * 0.5;
    };
    canvas.style.position = 'absolute';
    canvas.style.left = canvas.style.top = '0';
    var snowflakes = [], snowflake;
    for (i = 0; i < COUNT; i++) {
      snowflake = new Snowflake();
      snowflakes.push(snowflake);
    }
    function update() {
      ctx.clearRect(0, 0, width, height);
      if (!active)
        return;
      for (i = 0; i < COUNT; i++) {
        snowflake = snowflakes[i];
        snowflake.y += snowflake.vy;
        snowflake.x += snowflake.vx;
        ctx.globalAlpha = snowflake.o;
        ctx.beginPath();
        ctx.arc(snowflake.x, snowflake.y, snowflake.r, 0, Math.PI * 2, false);
        ctx.closePath();
        ctx.fill();
        if (snowflake.y > height) {
          snowflake.reset();
        }
      }
      requestAnimFrame(update);
    }
    // shim layer with setTimeout fallback
    window.requestAnimFrame = (function(){
      return window.requestAnimationFrame    ||
          window.webkitRequestAnimationFrame ||
          window.mozRequestAnimationFrame  ||
          function( callback ){
            window.setTimeout(callback, 1000 / 60);
          };
    })();
    onResize();
    window.addEventListener('resize', onResize, false);
    masthead.appendChild(canvas);
  })();
</script></body></html>

使用本站HTML/CSS/JS在线运行测试工具:http://tools.3water.com/code/HtmlJsRun,可得到如下测试运行效果:

原生JS实现的雪花飘落动画效果

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
对google个性主页的拖拽效果的js的完整注释[转]
Apr 10 Javascript
JavaScript游戏之优化篇
Nov 08 Javascript
JS仿flash上传头像效果实现代码
Jul 18 Javascript
解决json日期格式问题的3种方法
Feb 02 Javascript
JS实现图片产生波纹一样flash效果的方法
Feb 27 Javascript
使用AOP改善javascript代码
May 01 Javascript
学习使用AngularJS文件上传控件
Feb 16 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
May 19 Javascript
vue几个常用跨域处理方式介绍
Feb 07 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
Feb 16 Javascript
开发Node CLI构建微信小程序脚手架的示例
Mar 27 Javascript
JS内置对象和Math对象知识点详解
Apr 03 Javascript
详解vuex结合localstorage动态监听storage的变化
May 03 #Javascript
React为 Vue 引入容器组件和展示组件的教程详解
May 03 #Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
May 03 #Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
May 03 #Javascript
Angular学习教程之RouterLink花式跳转
May 03 #Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
May 03 #Javascript
Vue表单类的父子组件数据传递示例
May 03 #Javascript
You might like
使用PHP获取网络文件的实现代码
2010/01/01 PHP
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
jQuery.extend 函数详解
2012/02/03 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
js模仿hover的具体实现代码
2013/12/30 Javascript
JavaScript日期类型的一些用法介绍
2015/03/02 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
vue如何使用async、await实现同步请求
2019/12/09 Javascript
《Python学习手册》学习总结
2018/01/17 Python
python Spyder界面无法打开的解决方法
2018/04/27 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
python实现UDP协议下的文件传输
2020/03/20 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
python 实现控制鼠标键盘
2020/11/27 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
台湾线上百货零售购物平台:friDay购物
2017/08/18 全球购物
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
留学顾问岗位职责
2014/04/14 职场文书
产品推广策划方案
2014/05/10 职场文书
预备党员综合考察材料
2014/05/31 职场文书
单位活动策划方案
2014/08/17 职场文书
司法局群众路线教育实践活动整改措施
2014/09/17 职场文书
大学拉赞助协议书范文
2014/09/26 职场文书
人才市场接收函
2015/01/30 职场文书
开场白怎么写
2015/06/01 职场文书
超市店长竞聘书
2015/09/15 职场文书
关于Python中*args和**kwargs的深入理解
2021/08/07 Python