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 相关文章推荐
记录几个javascript有关的小细节
Apr 02 Javascript
改进版通过Json对象实现深复制的方法
Oct 24 Javascript
Javascript动态引用CSS文件的2种方法介绍
Jun 06 Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
Sep 05 Javascript
使用CoffeeScrip优美方式编写javascript代码
Oct 28 Javascript
javascript实现tab切换特效
Nov 12 Javascript
javascript拖拽应用实例
Mar 25 Javascript
老生常谈javascript中逻辑运算符&amp;&amp;和||的返回值问题
Apr 13 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
Apr 18 Javascript
vue初始化动画加载的实例
Sep 01 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
Apr 22 Javascript
JavaScript之Blob对象类型的具体使用方法
Nov 29 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
PHP5 安装方法
2006/10/09 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
2018/05/12 PHP
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
jQuery.extend 函数详解
2012/02/03 Javascript
jquery中加载图片自适应大小主要实现代码
2013/08/23 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
基于vue的换肤功能的示例代码
2017/10/10 Javascript
详解HTML5 使用video标签实现选择摄像头功能
2017/10/25 Javascript
Vue组件和Route的生命周期实例详解
2018/02/10 Javascript
JS实现的小火箭发射动画效果示例
2018/12/08 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
[02:30]联想杯DOTA2完美世界全国高校联赛—北京站现场
2015/11/16 DOTA
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
Python Paramiko模块的安装与使用详解
2016/11/18 Python
python 获取微信好友列表的方法(微信web)
2019/02/21 Python
django 使用全局搜索功能的实例详解
2019/07/18 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
canvas像素画板的实现代码
2018/11/21 HTML / CSS
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
专科文秘应届生求职信
2013/11/18 职场文书
你懂得怎么写自荐信吗?
2013/12/27 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
干部作风建设工作总结
2014/10/29 职场文书
就业导师推荐信范文
2015/03/27 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技