JavaScript canvas实现字符雨效果

本文实例为大家分享了JavaScript canvas实现字符雨效果的具体代码,供大家参考,具体内容如下

字符雨效果

分析如何实现

  • 字符雨从上往下逐渐消失: 这是canvas每次画字符的时候就画一遍黑色背景,但是这个背景是有透明度的,并且这个黑色背景的透明度还比较小,只有零点零八(经过测试,0.08比较合适,也可以更改查看效果);字符是从上往下落,上面的字符先出现,下面的字符后出现,程序重复地画黑色背景,就算有透明度,叠加起来,上面的字符就会先被覆盖,下面的后出现的字符还是还比较明显,就形成了逐渐消失的效果。
  • 只有其中一些列出现了字符: 如果不加以控制的话,那么canvas中每一列都会出现字符,不会出现参差不齐的效果。所以用一个代表出现机率的数来控制,当字符落到canvas的底部,并且拿一个随机数和出现机率进行比较,如果随机数大于其,那么这一列就可以从顶部再次出现字符,否则这一列在本次循环就不会出现字符,只有等待下次循环再次拿随机数来比较。这样就实现了有一些列出现字符,而另一些不出现字符的效果。

创建实例

let charRain = new CharRain("canvas_id");

HTML结构

<canvas id="canvas"></canvas>

CSS代码

body{
      margin: 0;
      padding: 0;
      overflow: hidden;
}
#canvas{
  background-color: #111;
}

JS源码

;(function(win){

    /**
     * 创造字符雨
     */
    class CharRain
    {
      /**
       * @description CharRain 类的构造函数
       * @constructs
       * @param {string} canvas_id - canvas 元素的 id
      */
      constructor(canvas_id){
        this.canvas = document.getElementById(canvas_id);
        this.context = this.canvas.getContext("2d");
        this.bg_alpha = 0.08;    // canvas背景的透明度,也是字符消失的速度;取值范围:0 - 1
        this.appearRate = 0.95;  // canvas中每一列字符下落到底部后再次出现字符的机率;取值范围:0 - 1
        this.dropSpeed = 30;     // 字符下落速度
        this.fontSize = 17;     // 字符大小;也确定了字符列的数目,列之间的间距
        this.colunm = 0;        // 画布中的字符列的数目
        this.isColorful = false; // 是否呈现彩色字符雨,默认为经典黑底绿字
        this.drops = [];        // 记录每一列的字符下落的 y 值
        this.timer = null;      // 定时器
        this.chars = "abcdefghijklmnopqrstuvwxyz0123456789";  // 可选字符
        this.init();
      }

      /**
       * @description 初始化类
       */
      init(){
        let _this = this;
        this.setAttr();
        win.addEventListener("resize", function (){ // 添加浏览器窗口变化监听,重新设置相关属性
          _this.setAttr();
        });
        this.timer = setInterval(function (){       // 添加定时器,下落
          _this.draw();
        }, _this.dropSpeed);
      }

      /**
       * @description 设置类的一些属性
      */
      setAttr(){
        this.canvas.width = win.innerWidth;
        this.canvas.height = win.innerHeight;                     // 重新设置 canvas 的宽度和高度
        this.colunm = Math.ceil(win.innerWidth / this.fontSize); // 重新设置列数
        for (let i=0; i<this.colunm; i++) {
          if(!this.drops[i]) {                                    // 已经存在下落字符的列不用设置
            this.drops[i] = win.innerHeight;                      // 字符瀑布流直接开始下落
          }
        }
      }

      /**
       * @description 随机一个颜色
       * @return {string} rgba 颜色值
      */
      randomColor(){
        let r = Math.floor(Math.random()*256);
        let g = Math.floor(Math.random()*256);
        let b = Math.floor(Math.random()*256);
        return "rgba("+r+","+g+","+b+", 1)";
      }

      /**
       * @description 在画布上画出下落的字符
      */
      draw(){
        this.context.fillStyle = "rgba(1,1,1," + this.bg_alpha + ")";    // 叠加画黑色背景,通过不透明度,形成字符逐渐消失的效果
        this.context.fillRect(0, 0, win.innerWidth, win.innerHeight);    // 画矩形以清除之前画的字符
        this.context.font = this.fontSize + "px Consolas";               // 设置字符的大小、样式
        if(this.isColorful) {
          this.context.fillStyle = this.randomColor();                   // 呈现彩色字符雨
        } else {
          this.context.fillStyle = "#00cc33";                             // 经典黑底绿字
        }

        for(let i=0; i<this.colunm; i++) {                               // 在每一列上画出字符
          let index = Math.floor(Math.random() * this.chars.length);    // 随机一个字符
          let x = i * this.fontSize;
          let y = this.drops[i] * this.fontSize;                        // 字符在 y 轴方向上的距离
          this.context.fillText(this.chars[index], x, y);               // 画字符
          if (y>=this.canvas.height && Math.random()>this.appearRate) { // 字符落到底部 && 有再次出现的机率
            this.drops[i] = 0;                                          // 0 代表每一列的字符位置回到顶部
          } else {
              this.drops[i]++;                                            // 字符逐渐下落,字符在 y 轴上的距离增加一
          }
        } 
      }
    }

    win.CharRain = CharRain;
  }(window));

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

(0)

相关推荐

  • JavaScript实现字符雨效果

    本文实例为大家分享了JavaScript实现字符雨效果的具体代码,供大家参考,具体内容如下 <html>     <head>         <meta charset="utf8"/>         <title>字符雨</title>         <style>             body {                 color:white;                 backgro

  • JavaScript canvas实现字符雨效果

    本文实例为大家分享了JavaScript canvas实现字符雨效果的具体代码,供大家参考,具体内容如下 字符雨效果 分析如何实现 字符雨从上往下逐渐消失: 这是canvas每次画字符的时候就画一遍黑色背景,但是这个背景是有透明度的,并且这个黑色背景的透明度还比较小,只有零点零八(经过测试,0.08比较合适,也可以更改查看效果):字符是从上往下落,上面的字符先出现,下面的字符后出现,程序重复地画黑色背景,就算有透明度,叠加起来,上面的字符就会先被覆盖,下面的后出现的字符还是还比较明显,就形成了逐

  • JavaScript canvas实现代码雨效果

    本文实例为大家分享了canvas实现代码雨效果的具体代码,供大家参考,具体内容如下 先看效果图 这个效果图是不是像极了以前电影里面的黑客技术,看起来蛮难的,其实操作起来还是挺简单的. canvas其实就是画布的意思 首先我们得有一个画布 <body> <canvas id="canvas"></canvas> </body> 再设这样一个背景 HTML部分 <body> <canvas id="canvas&q

  • JavaScript canvas实现镜像图片效果

    本文实例为大家分享了JavaScript canvas实现镜像图片效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Using image</title> <style type="text/css"> * { /* margin: 0; padding: 0; */ bo

  • JavaScript Canvas绘制动态线框效果

    本文实例为大家分享了JavaScript Canvas绘制动态线框效果的具体代码,供大家参考,具体内容如下 本周项目,移动端页面开发,要求丰富的动效,主要技术实现 Canvas :其中绘制动态线框,走了点弯路,所谓的弯路是逻辑问题,非技术实现方式. 一.涉及技术点,具体如下: 1.html 中引入canvas 标签,设置宽高: <canvas id="canvas" width=xx height=xx>您的浏览器不支持canvas,请更换版本</canvas>

  • JavaScript+Canvas实现带跳动效果的粒子动画

    目录 前言 实现过程 运行效果 总结 前言 用 HTML5 的 Canvas 元素实现一个带有跳动效果的粒子动画.会用到 Canvas 的2D渲染上下文,通过 JavaScript 编写绘图代码,实现画布上一系列粒子的随机运动和相互作用.还会使用 CSS3 动画属性,使得画布背景颜色和粒子颜色能够流畅地过渡,达到更加自然的效果. 代码运行效果在底部 实现过程 1.创建 Canvas 元素,并获取其上下文 在实现粒子跳动动画的过程中,第一步需要创建一个 Canvas 元素,并获取其上下文.Canv

  • js+canvas实现代码雨效果

    本文实例为大家分享了js+canvas代码雨效果的具体代码,供大家参考,具体内容如下 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <style type="text/css"> *{ margin: 0px; padding: 0px; } html,body{ height:

  • JavaScript canvas动画实现时钟效果

    本文实例为大家分享了canvas动画实现时钟效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta

  • JavaScript Canvas绘制圆形时钟效果

    本文实例为大家分享了Canvas时钟效果展示的具体代码,供大家参考,具体内容如下 <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> canvas{ display: block; margin: 0 auto; background-color: #fdffad; border: 1px solid #0

  • JavaScript canvas实现七彩时钟效果

    利用canvas写七彩时钟! 1.题目 (1).拿到一个时钟案例要求在页面上画出一个时钟,获取当前电脑的系统时间?(样式不限利用h5实现) 2.思路 (1).首先我们要充分了解到canvas画布元素里面的图形以及线段的画法,圆的画法,时针.分针.秒针的画法: (2).其次,是要在页面布局渲染出一个时钟的图形,画出刻度的位置,以及时针分针秒针的位置的静态效果,方便后面定时器来实现动态效果: (3).做好这些工作后,最难的地方是如何将时针分针和秒针与刻度一一对应,那么我们就要用到圆的弧度制,让定时器

随机推荐