91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用JavaScript?canvas實現字符雨效果

發布時間:2022-06-20 09:20:28 來源:億速云 閱讀:135 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“怎么使用JavaScript canvas實現字符雨效果”,內容詳細,步驟清晰,細節處理妥當,希望這篇“怎么使用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));

讀到這里,這篇“怎么使用JavaScript canvas實現字符雨效果”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阜新| 浮梁县| 汝南县| 丘北县| 永善县| 灵山县| 三台县| 古交市| 城步| 永康市| 麻栗坡县| 隆林| 马鞍山市| 雷州市| 凌云县| 江阴市| 夏津县| 眉山市| 腾冲县| 盈江县| 修文县| 威远县| 雅安市| 巨野县| 咸丰县| 台州市| 出国| 天祝| 哈密市| 芦山县| 晋江市| 彭泽县| 保山市| 陕西省| 车险| 黔江区| 汉阴县| 桓台县| 砚山县| 奉化市| 龙门县|