原生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小问题说明
Sep 26 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
Feb 04 Javascript
javascript break指定标签打破多层循环示例
Jan 20 Javascript
js生成的验证码的实现与技术分析
Sep 17 Javascript
兼容主流浏览器的JS复制内容到剪贴板
Dec 12 Javascript
Jquery网页内滑动缓冲导航的实现代码
Apr 05 Javascript
js实现支持手机滑动切换的轮播图片效果实例
Apr 29 Javascript
JavaScript实现实时更新系统时间的实例代码
Apr 04 Javascript
图片懒加载imgLazyLoading.js使用详解
Sep 15 Javascript
JS实现的合并两个有序链表算法示例
Feb 25 Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
Mar 07 Javascript
微信小程序合法域名配置方法
May 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
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
ecshop实现smtp发送邮件
2015/02/03 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
javascript原始值和对象引用实例分析
2015/04/25 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
2017/03/09 Javascript
微信小程序调用PHP后台接口 解析纯html文本
2017/06/13 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
JS库之Three.js 简易入门教程(详解之一)
2017/09/13 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
详解vue的双向绑定原理及实现
2019/05/05 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
2019/08/12 Javascript
微信小程序 wxParse插件显示视频问题
2019/09/27 Javascript
js实现鼠标拖拽div左右滑动
2020/01/15 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
python web框架学习笔记
2016/05/03 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
Python整数对象实现原理详解
2019/07/01 Python
django 类视图的使用方法详解
2019/07/24 Python
Python箱型图绘制与特征值获取过程解析
2019/10/22 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
python3 使用traceback定位异常实例
2020/03/09 Python
详解Scrapy Redis入门实战
2020/11/18 Python
PHP如何自定义函数
2016/09/16 面试题
毕业生幼师求职自荐信
2013/10/01 职场文书
高三自我鉴定范文
2013/10/19 职场文书
材料加工工程求职信
2014/02/19 职场文书
家长对老师的感言
2014/03/11 职场文书
学习雷锋活动总结
2014/04/29 职场文书
女生节标语
2014/06/26 职场文书
中学生教师节演讲稿
2014/09/03 职场文书
房屋所有权证明
2014/10/20 职场文书