JavaScript canvas实现雪花随机动态飘落


Posted in Javascript onFebruary 08, 2020

用canvas实现雪花随机动态飘落,供大家参考,具体内容如下

JavaScript canvas实现雪花随机动态飘落

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<style>
  body{
    margin: 0;
    padding: 0;
  }
  canvas{
    background: #000;
  }
</style>
<body>
  <canvas id = "snow">

  </canvas>
  <script>
    var canvas = document.getElementById('snow');
    var context = canvas.getContext('2d');
    // 获得可视区的宽高
    canvas.width = window.innerWidth;
    canvas.height = window.innerHeight;
    function snow(){
      context.save();
      // 开启路径
      context.beginPath();
      // 移动画布,确定雪花终点为中心点
      context.translate(100,100);
      //起点
      context.moveTo(-20,0);
      // 终点
      context.lineTo(20,0);
      // 线变成白色
      context.strokeStyle = '#fff';
      // 线变粗
      context.lineWidth = 10;
      // 线变圆头
      context.lineCap = 'round';
      context.stroke();
      // 角度转弧度
      var disX = Math.sin(30*Math.PI/180)*20;
      var disY = Math.sin(60*Math.PI/180)*20;
      // 画第二条线,左下到右上的线
      context.moveTo(-disX,disY);
      context.lineTo(disX,-disY);
      // 画第三条线
      context.moveTo(-disX,-disY);
      context.lineTo(disX,disY);
      context.stroke();
      context.restore();
    }
    // snow();
    //生成雪花的构造函数
    function Snow(x,y,scale,rotate,speedX,speedY,speedR){
           this.x = x;
           this.y = y;
           this.scale = scale;
           this.rotate = rotate;
           this.speedX = speedX;
           this.speedY = speedY;
           this.speedR = speedR;
          // 渲染雪花
          this.render = function(){
            context.save();
            context.beginPath();
            context.translate(this.x,this.y);
            context.scale(this.scale,this.scale);
            context.rotate(this.rotate*Math.PI/180);
            context.moveTo(-20,0);
            context.lineTo(20,0);
            context.strokeStyle = '#fff';
            context.lineWidth = 10;
            context.lineCap = 'round';
            context.stroke();
            var disX = Math.sin(30*Math.PI/180)*20;
            var disY = Math.sin(60*Math.PI/180)*20;
            context.moveTo(-disX,disY);
            context.lineTo(disX,-disY);
            context.moveTo(-disX,-disY);
            context.lineTo(disX,disY);
            context.stroke();
            context.restore();

          }

    }
    // var snow = new Snow(50,50,1,10,10,10,10);
    // snow.render();
    // 存储所有生成的雪花
    var snowArray = [];
    // 生成雪花
      function init(){
        var len = 100;
        for(var i = 0;i<len;i++){
          var x = Math.random()*canvas.width;
          var scale = Math.random()+0.5;
          var rotate = Math.random()*60;
          var speedX = Math.random()+1
          var speedY = Math.random()+5;
          var speedR = Math.random()*4+2;
          // var snow = new Snow(x,0,scale,rotate,speedX,speedY,speedR);
          // snow.render();
          (function(x,y,scale,rotate,speedX,speedY,speedR){
            setTimeout(function(){
            var snow = new Snow(x,0,scale,rotate,speedX,speedY,speedR);
            snow.render();
            snowArray.push(snow);
          },Math.random()*8000);   
          })(x,0,scale,rotate,speedX,speedY,speedR);
      }snowing();
    }init();
      // 动起来
      function snowing(){
        setInterval(function(){
          //先清除
          context.clearRect(0,0,canvas.width,canvas.height);
          for(var i = 0;i < snowArray.length;i++){
            snowArray[i].x = (snowArray[i].x+snowArray[i].speedX)%canvas.width;
            snowArray[i].y = (snowArray[i].y+snowArray[i].speedY)%canvas.height;
            snowArray[i].rotate = (snowArray[i].rotate+snowArray[i].speedR)%60;
            snowArray[i].render();
          }
        },30);
      }
    
    /**
     * sin60 = 对边/斜边 =>  对边 = sin60*斜边  =>  y=sin60*半径(r);
     */
  </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
Oct 06 Javascript
使用Node.js为其他程序编写扩展的基本方法
Jun 23 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
Jun 12 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
Sep 06 Javascript
JavaScript实现简单的日历效果
Sep 25 Javascript
jquery中用jsonp实现搜索框功能
Oct 18 Javascript
vue组件实例解析
Jan 10 Javascript
使用JQ完成表格隔行换色的简单实例
Aug 25 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
Sep 29 Javascript
简单了解JavaScript sort方法
Nov 25 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
Sep 17 Javascript
解决vant-UI库修改样式无效的问题
Nov 03 Javascript
JS实现简易留言板增删功能
Feb 08 #Javascript
原生JS实现留言板功能
Feb 08 #Javascript
javascript实现留言板功能
Feb 08 #Javascript
JavaScript实现PC端横向轮播图
Feb 07 #Javascript
vue更改数组中的值实例代码详解
Feb 07 #Javascript
Vue 一键清空表单的实现方法
Feb 07 #Javascript
Vue中qs插件的使用详解
Feb 07 #Javascript
You might like
PHP数组循环操作详细介绍 附实例代码
2013/02/03 PHP
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
PHP测试框架PHPUnit组织测试操作示例
2018/05/28 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
让回调函数 showResponse 也带上参数的代码
2007/08/13 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
JavaScript 原型链学习总结
2010/10/29 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
ionic 自定义弹框效果
2017/06/27 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
vue+springmvc导出excel数据的实现代码
2018/06/27 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
Nuxt使用Vuex的方法示例
2019/09/06 Javascript
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
Python模块的制作方法实例分析
2019/12/21 Python
Python类和实例的属性机制原理详解
2020/03/21 Python
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
Yahoo-PHP面试题1
2016/07/20 面试题
乐观自信演讲稿范文
2014/05/21 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
考试作弊检讨书范文
2015/01/27 职场文书
2015年依法行政工作总结
2015/04/29 职场文书
学生通报表扬范文
2015/05/04 职场文书
小学生班干部竞选稿
2015/11/20 职场文书
OpenCV-Python实现油画效果的实例
2021/06/08 Python