原生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 相关文章推荐
ie支持function.bind()方法实现代码
Dec 27 Javascript
JS中实现replaceAll的方法(实例代码)
Nov 12 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
Mar 25 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
Jun 29 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
Jun 23 Javascript
基于Phantomjs生成PDF的实现方法
Nov 07 Javascript
Bootstrap轮播图的使用和理解4
Dec 14 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
Feb 13 jQuery
10行代码实现微信小程序滑动tab切换
Dec 28 Javascript
vue获取时间戳转换为日期格式代码实例
Apr 17 Javascript
JS学习笔记之原型链和利用原型实现继承详解
May 29 Javascript
Vue路由管理器Vue-router的使用方法详解
Feb 05 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实现Socket服务器的代码
2008/04/03 PHP
开源SNS系统-ThinkSNS
2008/05/18 PHP
PHP程序61条面向对象分析设计的经验小结
2008/11/12 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
2014/07/30 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
js实现表格字段排序
2014/02/19 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
小程序实现展开/收起的效果示例
2018/09/22 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
Python3 能振兴 Python的原因分析
2014/11/28 Python
一步步解析Python斗牛游戏的概率
2016/02/12 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Python综合应用名片管理系统案例详解
2020/01/03 Python
如何基于Python + requests实现发送HTTP请求
2020/01/13 Python
python爬虫实现获取下一页代码
2020/03/13 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
教育系统干部作风整顿心得体会
2014/09/09 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
公司总经理岗位职责
2015/04/01 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
土建技术员岗位职责
2015/04/11 职场文书
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏