原生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 相关文章推荐
javascript开发随笔二 动态加载js和文件
Nov 25 Javascript
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
Jun 05 Javascript
JS 排序输出实现table行号自增前端动态生成的tr
Aug 13 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
Sep 17 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
Nov 02 Javascript
js正则表达式replace替换变量方法
May 21 Javascript
js完整倒计时代码分享
Sep 18 Javascript
使用 bootstrap modal遇到的问题小结
Nov 09 Javascript
Bootstrap CSS组件之按钮组(btn-group)
Dec 17 Javascript
canvas实现图片根据滑块放大缩小效果
Feb 24 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
May 16 Javascript
nginx配置域名后的二级目录访问不同项目的配置操作
Nov 06 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 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
php数组的概述及分类与声明代码演示
2013/02/26 PHP
PHP实现简单登录界面
2019/10/23 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
JQuery 写的个性导航菜单
2009/12/24 Javascript
微博@符号的用户名提示效果。(想@到谁?)
2010/11/05 Javascript
框架页面高度自动刷新的Javascript脚本
2013/11/01 Javascript
js验证IP及子网掩码的合法性有效性示例
2014/04/30 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
浅谈Sublime Text 3运行JavaScript控制台
2016/06/06 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
jQuery+ajax的资源回收处理机制分析
2017/01/07 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
layui导航栏实现代码
2017/05/19 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
python中upper是做什么用的
2020/07/20 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
HTML5之WebGL 3D概述(下)—借助类库开发及框架介绍
2013/01/31 HTML / CSS
美国领先的在线邮轮旅游公司:CruiseDirect
2018/06/07 全球购物
爱我中华演讲稿
2014/05/20 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
2015年师德表现自我评价
2015/03/05 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
青少年法制教育心得体会
2016/01/14 职场文书
Python selenium的这三种等待方式一定要会!
2021/06/10 Python
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python