原生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 相关文章推荐
jquery实现每个数字上都带进度条的幻灯片
Feb 20 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
Nov 28 Javascript
jQuery.event兼容各浏览器的event详细解析
Dec 18 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
Sep 09 Javascript
JavaScript中各种引用类型的常用操作方法小结
May 05 Javascript
jquery实现垂直和水平菜单导航栏
Aug 27 Javascript
基于JavaScript实现淘宝商品广告效果
Aug 10 Javascript
js数字滑动时钟的简单实现(示例讲解)
Aug 14 Javascript
jQuery md5加密插件jQuery.md5.js用法示例
Aug 24 jQuery
VUE实现可随意拖动的弹窗组件
Sep 25 Javascript
在微信小程序中使用vant的方法
Jun 07 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
Nov 12 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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
信用卡效验程序
2006/10/09 PHP
php遍历数组的方法分享
2012/03/22 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
php实现微信企业付款到个人零钱功能
2018/10/09 PHP
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
JavaScript中的isXX系列是否继续使用的分析
2011/04/16 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
基于Vue实现图书管理功能
2017/10/17 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
Python中List.count()方法的使用教程
2015/05/20 Python
python生成圆形图片的方法
2020/03/25 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
python求前n个阶乘的和实例
2020/04/02 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
浅析Python 字符编码与文件处理
2020/09/24 Python
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
Oracle中delete,truncate和drop的区别
2016/05/05 面试题
职专应届生求职信
2013/11/16 职场文书
小学教师岗位职责
2013/11/25 职场文书
初婚未育证明
2014/01/15 职场文书
中学劳技课教师的自我评价
2014/02/05 职场文书
《祁黄羊》教学反思
2014/04/22 职场文书
2014年学习厉行节约反对浪费思想汇报
2014/09/10 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏