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自定义图片热区效果
Jul 21 Javascript
jquery ajaxSubmit 异步提交的简单实现
Feb 28 Javascript
innerHTML中标签可以换行的方法汇总
Aug 14 Javascript
js实现select下拉框菜单
Dec 08 Javascript
jQuery实现div横向拖拽排序的简单实例
Jul 13 Javascript
Angular.JS中的指令引用template与指令当做属性详解
Mar 30 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
Aug 24 Javascript
详解如何在angular2中获取节点
Nov 23 Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
Jul 10 Javascript
JavaScript中七种流行的开源机器学习框架
Oct 11 Javascript
javascript简单实现深浅拷贝过程详解
Oct 08 Javascript
vue 遮罩层阻止默认滚动事件操作
Jul 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
PHP与SQL注入攻击[三]
2007/04/17 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
php字符串按照单词进行反转的方法
2015/03/14 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
jQuery Tools tab(幻灯片)
2012/07/14 Javascript
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
jQuery.fn和jQuery.prototype区别介绍
2013/10/05 Javascript
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
DOM基础教程之使用DOM
2015/01/19 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
Javascript 正则表达式实现为数字添加千位分隔符
2015/03/10 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
AngularJS递归指令实现Tree View效果示例
2016/11/07 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
2016/11/24 Javascript
Angular中的$watch、$watchGroup、$watchCollection
2017/06/25 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
Python建立Map写Excel表实例解析
2018/01/17 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
Python调用百度根据经纬度查询地址的示例代码
2019/07/07 Python
python实现一次性封装多条sql语句(begin end)
2020/06/06 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
某同学的自我鉴定范文
2013/12/26 职场文书
高三历史教学反思
2014/01/09 职场文书
大家检讨书5000字
2014/02/03 职场文书
人事经理岗位职责
2014/04/28 职场文书
收款委托书范本
2014/09/11 职场文书
2015重阳节座谈会主持词
2015/07/30 职场文书
在校大学生才艺比赛策划书怎么写?
2019/08/26 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书
CSS中理解层叠性及权重如何分配
2022/12/24 HTML / CSS