<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了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));
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45