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 相关文章推荐
CSS和JS标签style属性对照表(方便js开发的朋友)
Nov 11 Javascript
js/jquery获取文本框输入焦点的方法
Mar 04 Javascript
jquery实现文本框textarea自适应高度
Mar 09 Javascript
js模块加载方式浅析
Aug 12 Javascript
详解node服务器中打开html文件的两种方法
Sep 18 Javascript
解决jQuery使用append添加的元素事件无效的问题
Aug 30 jQuery
微信小程序页面缩放式侧滑效果的实现代码
Nov 15 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
Nov 20 jQuery
关于layui时间回显问题的解决方法
Sep 24 Javascript
JQuery发送ajax请求时中文乱码问题解决
Nov 14 jQuery
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
Jan 25 Javascript
JS实现九宫格拼图游戏
Jun 28 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
Zend Framework教程之Zend_Config_Xml用法分析
2016/03/23 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
一个简单安全的PHP验证码类、PHP验证码
2016/09/24 PHP
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
千分位数字格式化(用逗号隔开 代码已做了修改 支持0-9位逗号隔开)的JS代码
2013/12/05 Javascript
js中document.write的那点事
2014/12/12 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
jquery checkbox的相关操作总结
2016/10/17 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
Js中使用正则表达式验证输入是否有特殊字符
2018/09/07 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
2020/03/07 Javascript
JS中锚点链接点击平滑滚动并自由调整到顶部位置
2021/02/06 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
2018/05/08 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
商务英语应届生自我鉴定
2013/12/08 职场文书
教师实习自我鉴定
2013/12/14 职场文书
《珍珠泉》教学反思
2014/02/20 职场文书
幼儿园评语大全
2014/04/17 职场文书
幼儿园托班开学寄语(2015秋季)
2015/05/27 职场文书
加强党性修养心得体会
2016/01/21 职场文书
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS