原生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 相关文章推荐
jWiard 基于JQuery的强大的向导控件介绍
Oct 28 Javascript
javascript中的绑定与解绑函数应用示例
Jun 24 Javascript
原始的js代码和jquery对比体会
Sep 10 Javascript
巧用js提交表单轻松解决一个页面有多个提交按钮
Nov 17 Javascript
jQuery读取XML文件内容的方法
Mar 09 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
Apr 13 Javascript
node打造微信个人号机器人的方法示例
Apr 26 Javascript
npm 常用命令详解(小结)
Jan 17 Javascript
微信小程序template模板与component组件的区别和使用详解
May 22 Javascript
JavaScript判断对象和数组的两种方法
May 31 Javascript
javascript实现简易数码时钟
Mar 30 Javascript
JavaScript中条件语句的优化技巧总结
Dec 04 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
浅析get与post的一些特殊情况
2014/07/28 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
2016/05/16 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
鼠标移动到一张图片时变为另一张图片
2006/12/05 Javascript
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
统计出现最多的字符次数的js代码
2010/12/03 Javascript
使用vue编写一个点击数字计时小游戏
2016/08/31 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
webpack优化之代码分割与公共代码提取详解
2019/11/22 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
python字符串的方法与操作大全
2018/01/30 Python
Python3.7实现中控考勤机自动连接
2018/08/28 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
2019/01/07 Python
python3.6使用tkinter实现弹跳小球游戏
2019/05/09 Python
python超时重新请求解决方案
2019/10/21 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
numpy.array 操作使用简单总结
2019/11/08 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
python Gabor滤波器讲解
2020/10/26 Python
python编程的核心知识点总结
2021/02/08 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
allbeauty美国:英国在线美容店
2019/03/11 全球购物
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
外贸采购员求职的自我评价
2013/11/26 职场文书
班组长岗位职责
2014/03/03 职场文书
新农村建设汇报材料
2014/08/15 职场文书
最新离婚协议书范本
2014/08/19 职场文书
教师岗位说明书
2015/09/30 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
pytorch Dropout过拟合的操作
2021/05/27 Python
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers