赞
踩
电影黑客帝国有个代码雨效果 – 挺酷的,我在网上看到了使用js写的代码雨的代码,我把由函数实现的代码,改为使用类实现代码雨特效。
功能:
1.一块画布 -- 实现代码雨的展示
2. 初始化按钮 -- 让代码回到初始状态
3. 启动/继续按钮 -- 让代码开始或者继续下
4. 停止按钮 -- 让代码雨停止
5. 后续可升级......
<!doctype html> <html> <head> <meta charset="utf-8" /> <title>流星雨</title> <meta name="keywords" content="关键词,关键字"> <meta name="description" content="描述信息"> <style> body { margin: 0; overflow: hidden; } canvas { background:#000000; display: block; } </style> </head> <body> <!-- 在外层套一个大框 --> <div class="main center" > <!-- <canvas>画布 画板 画画的本子 --> <canvas width=600 height=450 class="center" id="canvas"></canvas> <!-- 3个按钮平放在画布下面 --> <div class="center control"> <button type="button" id="init">初始化</button> <button type="button" id="start">启动/继续</button> <button type="button" id="stop">停止</button> </div> </div> </body> </html>
效果图:
<style> body { margin: 0; overflow: hidden; } canvas { background:#000000; display: block; } .main { width: 740px; height: 540px; padding: 30px; border-style:solid; border-width:1px; } .center {margin: 20px auto;} .control { width: 600px; height: 60px; } button { width: 100px; height: 40px; font-size: 18px; display: block; float:left; margin: 10px 50px; } </style>
效果图:
<script> // 名称:代码雨类 class CodeRain { //定义属性 //设置文字大小 fontSize = 14; //计算一行有多少个文字 取整数 向下取整 clos = Math.floor(canvas.width/this.fontSize); //思考每一个字的坐标 //创建数组把clos 个 0 (y坐标存储起来) drops = new Array(this.clos).fill(0); str = "qwertyuiopasdfghjklzxcvbnm"; clear = null; timer = false; init = false; constructor(canvas) { this.canvas = document.getElementById(canvas); this.ctx = this.canvas.getContext("2d"); } //开启流星雨方法 rain = () =>{ if (this.timer === false) { //定义一个定时器,每隔50毫秒执行一次 this.clear = setInterval(this.drawString,50); this.timer = true; this.init = true; } } //绘制文字 drawString = () => { //给矩形设置填充色 this.ctx.fillStyle="rgba(0,0,0,0.05)"; //绘制一个矩形 this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height); //添加文字样式 this.ctx.font = "600 "+this.fontSize+"px 微软雅黑"; //设置文字颜色 this.ctx.fillStyle = "#00ff00"; for(let i = 0;i<this.clos;i++) { //x坐标 let x = i*this.fontSize; //y坐标 let y = this.drops[i]*this.fontSize; //设置绘制文字 this.ctx.fillText(this.str[Math.floor(Math.random()*this.str.length)],x,y); if(y>this.canvas.height&&Math.random()>0.99){ this.drops[i] = 0; } // console.log(y); this.drops[i]++; } } } const coderain = new CodeRain("canvas"); document.getElementById("start").addEventListener("click", coderain.rain); </script>
效果图:
//雨停了的方法
rainStops = () => {
if (this.timer === true){
clearInterval(this.clear);
this.timer = false;
this.init = true;
}
}
效果图:
//初始化
init = () => {
if (this.init === true){
clearInterval(this.clear);
this.timer = false;
this.init = false;
this.ctx.fillStyle="rgba(0,0,0)";
//绘制一个矩形
this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height);
this.drops.fill(0);
}
}
效果图:
<!doctype html> <html> <head> <meta charset="utf-8" /> <title>流星雨</title> <meta name="keywords" content="关键词,关键字"> <meta name="description" content="描述信息"> <style> body { margin: 0; overflow: hidden; } canvas { background:#000000; display: block; } .main { width: 740px; height: 540px; padding: 30px; border-style:solid; border-width:1px; } .center {margin: 20px auto;} .control { width: 600px; height: 60px; } button { width: 100px; height: 40px; font-size: 18px; display: block; float:left; margin: 10px 50px; } </style> </head> <body> <!-- 在外层套一个大框 --> <div class="main center" > <!-- <canvas>画布 画板 画画的本子 --> <canvas width=600 height=450 class="center" id="canvas"></canvas> <!-- 3个按钮平放在画布下面 --> <div class="center control"> <button type="button" id="init">初始化</button> <button type="button" id="start">启动/继续</button> <button type="button" id="stop">停止</button> </div> <script> // 名称:代码雨类 class CodeRain { //定义属性 //设置文字大小 fontSize = 14; //计算一行有多少个文字 取整数 向下取整 clos = Math.floor(canvas.width/this.fontSize); //思考每一个字的坐标 //创建数组把clos 个 0 (y坐标存储起来) drops = new Array(this.clos).fill(0); str = "qwertyuiopasdfghjklzxcvbnm"; clear = null; timer = false; init = false; constructor(canvas) { this.canvas = document.getElementById(canvas); this.ctx = this.canvas.getContext("2d"); } //开启流星雨方法 rain = () =>{ if (this.timer === false) { //定义一个定时器,每隔50毫秒执行一次 this.clear = setInterval(this.drawString,50); this.timer = true; this.init = true; console.log('rain'); } } //雨停了的方法 rainStops = () => { if (this.timer === true){ clearInterval(this.clear); this.timer = false; this.init = true; console.log('rainStops'); console.log(this.clear); } } //初始化 init = () => { if (this.init === true){ clearInterval(this.clear); this.timer = false; this.init = false; this.ctx.fillStyle="rgba(0,0,0)"; //绘制一个矩形 this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height); this.drops.fill(0); console.log('init'); } } //绘制文字 drawString = () => { //给矩形设置填充色 this.ctx.fillStyle="rgba(0,0,0,0.05)"; //绘制一个矩形 this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height); //添加文字样式 this.ctx.font = "600 "+this.fontSize+"px 微软雅黑"; //设置文字颜色 this.ctx.fillStyle = "#00ff00"; for(let i = 0;i<this.clos;i++) { //x坐标 let x = i*this.fontSize; //y坐标 let y = this.drops[i]*this.fontSize; //设置绘制文字 this.ctx.fillText(this.str[Math.floor(Math.random()*this.str.length)],x,y); if(y>this.canvas.height&&Math.random()>0.99){ this.drops[i] = 0; } // console.log(y); this.drops[i]++; } } } const coderain = new CodeRain("canvas"); document.getElementById("init").addEventListener("click", coderain.init); document.getElementById("start").addEventListener("click", coderain.rain); document.getElementById("stop").addEventListener("click", coderain.rainStops); </script> </div> </body> </html>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。