【H5】 canvas绘出喷泉告白效果

2023-10-31

【H5】 canvas绘出喷泉告白效果

效果图如下:

在这里插入图片描述

代码如下:

代码内有详解哦!

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    *{margin:0;padding:0;}
    body{background-color: #000;overflow: hidden;}
  </style>
</head>
<body>
  <canvas></canvas>

  <script>
    let anim = {
      //1.初始化  (序号表示执行步骤)
      init(){
        this.oC = document.querySelector('canvas');
        this.ctx = this.oC.getContext('2d');
        this.maxParticle = 100; //规定的最大粒子数
        this.particle = []; //存储粒子

        this.letters  = "我喜欢你我爱你";
        this.resize() //设置canvas的宽高
        //自适应宽高 给window绑定监听触发函数resize  //通过箭头函数执行外面的resize
        window.addEventListener('resize', ()=>this.resize())

        this.loop();  //不断的调用
      },
      //自适应宽高 
      resize(){ //设置canvas的宽高
        //获取浏览器窗口的宽高
        this.oC.width = window.innerWidth;
        this.oC.height = window.innerHeight;
        //页面的宽高
        this.w = window.innerWidth;
        this.h = window.innerHeight;
      },
      //2不停渲染粒子
      loop(){ 
        this.render();  //不停执行render方法
        requestAnimationFrame(this.loop.bind(this))
      },
      //3渲染 //之后就是一直 3 - 4 - 5 - 6 循环执行
      render() {  //不停执行render方法
        this.fade();  //给画布来一层透明度覆盖
        this.particle.push({  //给粒子存放数组particle内添加粒子 每个粒子都是一个许多变量组成的对象
          x:this.w/2, //粒子起始位置
          y:this.h,
          xSpeed:(Math.random()*20)-10,  //例子的x方向数度[-10,10]
          ySpeed:(Math.random()*20)-10,  //例子的y方向数度[-10,10]
          //在letters数组内随机获取喷出的字   Math.foor向下取整
          font:this.letters[Math.floor(Math.random()*this.letters.length)],
          //[色相0~360, 饱和度0%~100%, 亮度0~100%, 透明度0~1]
          color:[0,90,80,0.8]
        })
        this.drawParticles()  //画粒子
        this.clearParticle(); //删除旧粒子
      },
      //5.画粒子
      drawParticles(){
        for(let i=0; i<this.particle.length; i++){
          let particle = this.particle[i];  //获取每一个字
          //h色相0~360, s饱和度0%~100%, l亮度0~100%, a透明度0~1
          let h = particle.color[0],
              s = particle.color[1] + "%",
              l = particle.color[2] + "%",
              a = particle.color[3];
          let hsla = `hsla(${h},${s},${l},${a})`;
          this.ctx.font = "20px 宋体";   //字体大小
          this.ctx.fillStyle = hsla;  //渲染颜色

          //给canvas画布添加字体   (字体类型, 字体在画布上的x,y位置)
          this.ctx.fillText( particle.font, particle.x-10, particle.y )
          //改变字体位置
          particle.x += particle.xSpeed;  //字体的位置通过每次的+=数度值从而改变
          particle.y += particle.ySpeed;
          particle.y *=0.98;  //字体在y方向的衰减值

          particle.color[0] +=1;  //颜色的变化
          particle.color[2] *=0.99; //

          if(particle.color[0] > 299){  //当色相值达到299时
            particle.color[2] =100; //亮度最大
            particle.color[3] =1;   //透明度为1
          }
        }
      },
      //4.每次都给cnavas覆盖上一层淡淡的透明层,给文字降低透明度
      fade(){ 
        this.ctx.fillStyle = "rgba( 0,0,0,0.1 )"
        this.ctx.fillRect( 0,0,this.w,this.h )  //覆盖整个画布
      },
      //6.清除旧文字
      clearParticle(){
        //判断是否大于最大值
        if( this.particle.length >this.maxParticle ){
          //将前面生成的文字删除
          this.particle.shift();  //shift清除数组的第一个元素
        }
      }

    }

    anim.init();  //开始程序
  
  </script>
  
</body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【H5】 canvas绘出喷泉告白效果 的相关文章

  • 如何计算 VU 仪表刻度的对数标签?

    我使用画布编写一个仪表小部件 需要计算刻度的标签值 没问题 除非我尝试重新创建 VU 表的刻度 我知道它是对数的 但在这种类型的仪表上 这些值不是 10 的幂 see https en wikipedia org wiki VU meter
  • 在 JavaFX 中使用 MouseEvent 和 MouseClicked 选择并移动 Canvas 图像

    我有一个应用程序的示例 用于绘制图片GraphicsContext并如下图所示工作 问题是select and move只有blue circle水平地与Canvas MouseEvent and MouseClicked public c
  • 有像 Blend 这样的 HTML5 画布动画软件吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有没有像 Blend 这样的软件可以使用 HTML5 尤其是做动画相关的东西 就像是http raphaeljs com http raphaeljs
  • 在画布元素中使用 SVG Evenodd 填充规则

    有谁知道是否可以通过 JavaScript 原生或数学方式实现evenodd fill rule来自 HTML5 canvas 元素中的 SVG 执行此操作的项目的链接会很有帮助 是的 应该可以globalCompositeOperatio
  • 画布已被跨源数据本地图像污染

    这个问题已经被问了很多次 但我只是不明白为什么这种情况会发生在我身上 基本上 我有一个画布和一个图像 当我尝试这样做时 var canvas document getElementById somecanvas var ctx canvas
  • html5中的canvas元素是否硬件加速?

    我对 Web 开发还很陌生 事实上我正在考虑深入研究 html 和 js 来进行游戏开发 因此 在做任何事情之前 我需要知道 html5 中的 canvas 元素是否是硬件加速的 如果不是 那么我需要使用像 webgl 这样的东西 我不知道
  • 如何在fabricJS中通过鼠标选择被覆盖的对象?

    我正在尝试开发一种方法来选择分层在下面并 完全 被其他对象覆盖的对象 一种想法是选择顶部对象 然后通过doubleclick向下穿过层层 这就是我现在得到的 var canvas new fabric Canvas c fabric uti
  • 如何使用画布应用 alpha 图层蒙版以使某些图像透明

    有人可以帮我解决这个问题吗 我想使用画布应用 alpha 图层蒙版以使某些图像透明 多谢 var redImageData redCanvas getContext 2d getImageData 0 0 200 200 overlay v
  • 在 ReportLab 中向画布元素添加超链接的最简单方法是什么?

    我正在使用 ReportLab 使用 Python 制作 pdf 我想向画布添加一个形状 并让该形状充当超链接 使以下示例中的矩形链接到 google com 的最简单方法是什么 from reportlab pdfgen import c
  • Fabric.js canvas.toDataURL() 通过 Ajax 发送到 PHP

    当我需要创建具有透明背景的图像时 我遇到了问题 我还是不知道问题出在fabricjs还是php 当我发送带有彩色背景的图像时 一切正常 当我发送具有透明背景的图像时会出现问题 生成的图像是用黑色背景创建的 那么 让我更好地解释一下 当用户单
  • 在 SVG 中使用变换模拟枢轴旋转

    我在 SVG 中有一个矩形 需要从特定点绕轴旋转 我能想到的最好方法是变换到枢轴的 xy 旋转角度 然后再次变换 问题是第二个变换的 xy 我认为它会在某种程度上采用 cos 和 sin 只是不确定在哪里或为什么 会旋转 90度到 也许我以
  • 在 HTML 画布上绘制线宽连续变化的线条

    我试图画一条线 从一条细线开始 然后逐渐加宽直到结束 我需要绘制半平滑曲线 由几条直线合成 并且在寻找解决此任务的方法时遇到问题 这个小提琴显示了我的问题 http jsfiddle net ZvuQG 1 http jsfiddle ne
  • HTML Canvas:如何绘制翻转/镜像图像?

    当我在 HTML 画布上绘制图像时 我试图翻转 镜像图像 我发现一个游戏教程显示了角色必须面对的每个方向的精灵表 但这对我来说似乎不太正确 特别是因为每个框架都有不同的尺寸 实现这一目标的最佳技术是什么 我尝试致电setScale 1 1
  • 在画布中的鼠标位置放大/缩小

    我正在尝试使用 p5 js 实现缩放功能 当前缩放级别以及 x 和 y 位置存储在controls view目的 默认位置或 0 0 位置位于左上角 问题是调整放大 缩小时的 x 和 y 位置值 以便无论视图的当前位置是什么 它都会停留在缩
  • 是否可以强制 html canvas 标签显示子项?

    基本上和我问的一模一样 我希望以下工作能够发挥作用
  • HTML5 Canvas 性能:加载图像与绘图

    我正计划使用 javascript canvas 编写一个游戏 我只有一个问题 在加载图像与仅使用 canvas 的方法进行绘图方面 我应该考虑什么样的性能考虑因素 因为我的游戏将使用非常简单的几何图形 圆形 正方形 直线 所以任何一种方法
  • 获取画布上下文的最后一个点的坐标

    我想创建一个arrowTo功能与CanvasRenderingContext2D prototype 为此 我需要获取最后一个点的坐标 例如 var ctx someCanvas getContext 2d ctx moveTo 10 40
  • 使用 javascript 调整图像大小以在画布 createPattern 中使用

    我见过一些关于如何调整图像大小的技巧 在 IMG 标签内使用 但我想在里面有一个图像变量 一个 Javascript 调整它的大小 然后使用 a 中的图像 context createPattern 图像 重复 我还没有找到任何提示 关于如
  • Arbor Js - 节点 Onclick?

    我在用着arbor js http arborjs org 创建图表 我如何创建一个onclick节点的事件 或者在单击时在某处创建节点链接 Arborjs org 主页的节点在单击时链接到外部页面 我如何复制它 或者使节点在单击时调用 j
  • Android:我可以创建一个不是矩形的视图/画布吗?圆形的?

    我有一个圆形视图 悬停在主要内容上方 gt 从屏幕出来的 z 轴方向 当有人点击屏幕时 我希望选择主要内容或悬停在上方的视图 当它覆盖主视图时 到目前为止效果很好 我在透明画布上有一个圆形物品 这意味着您可以看到该圆圈之外的背景的所有内容

随机推荐