介绍
点击这里查看效果:传送门
效果如下图,黑客电影里01字符掉落的效果。
动手制作
新建一个HTML文件。
1 |
|
body
设置一下body的样式。背景颜色为黑色,溢出隐藏。
1 |
<style> |
绘制动画
开始绘制动画。在HTML文件的头部添加如下<canvas>
标签,id名随意,宽高设置大一点避免有些设备过宽导致没有全屏显示。
1 |
<canvas id="myCanvas" width="2000px" height="1000px"></canvas> |
script
下边代码在<script>
标签内添加。且在页面加载完成后执行。
1 |
<script> |
首先我们定义几个变量,方便参数调节。
- fontSize,字体大小
- col_show,密集程度(其实是透明程度,绘制一层黑色区域遮挡旧字符时用于指定透明度。透明越低,旧字符显示的就越多,反之则越少)
- c,Canvas元素
- pen,绘制的画笔
- num,计算显示的文字列数,并创建相应的数组(一列对应一个数组)
在进行绘制之前,我们需要确定打开HTML文件的设备是pc还是手机。从而指定不同的fontSize和col_show。(还可以使用CSS中的@media
查询
来实现,具体使用方法参考该博客:传送门)
1 |
var ua = navigator.userAgent.toLowerCase(); |
设置一些变量值。设置Canvas元素。注意id名不要写错了。
1 |
let c = document.querySelector("#myCanvas");//获取Canvas元素 |
现在要让画面动起来。我们使用一个周期定时器,每60毫秒执行一次定义在其内部的函数。想要改变画面速度可以更改该参数。
1 |
setInterval(function (){ |
在这个周期定时器内我们来绘制图像(周期性)。
首先绘制一层黑色,有一定透明度的图像。这个的作用主要是为了遮挡住前边绘制的01字符(在后边。这个是周期性的,要记住这点),营造一种字符掉落过程中慢慢消失的感觉,并遮挡住n个周期前绘制的字符。所以更改参数透明度col_show,可以更改显示字符的密集程度。
1 |
pen.fillStyle = "rgb(0,0,0,"+col_show+")";//画笔颜色,黑色,透明程度 |
绘制01字符前的准备工作。指定画笔颜色,字体大小等等参数。
1 |
pen.fillStyle = "#0f0" ;//设置或返回用于填充绘画的颜色、渐变或模式。(绿色) |
现在绘制01字符。num为前边创建的数组,一列对应一个数组。使用forEach函数遍历每一个数组。forEach循环完之后,就会绘制出一行0、1字符。
()=>{}
,是js中的箭头函数,可以理解为一个匿名函数。y
为forEach返回的数组值i
为forEach返回的数组索引。
pen.fillText(文本,x,y)
用于绘制文本。- x坐标为:
i*fontSize
。索引值剩字体大小, - y坐标为:y(数组的值)
- 第一次绘制时,数组值为0,即y坐标为0
- 通过
num[i] = Math.random()<0.05?0:y+fontSize;
更改下一次绘制该数组对应的列时的y坐标(记住一次forEach绘制一行)。 - 这是一个三目运算符,如果前边的条件成立则返回问号?后边的值否则返回冒号:后边的值。为什么不直接
num[i] = y+fontSize;
,主要是为了营造一种错落感。随机让该列的字符从头开始下落(y突然变成0,下一次绘制将会从头开始),可通过更改参数0.05改变从头开始的概率。
- x坐标为:
parseInt(Math.random()+0.5)
用于获得0或1。可以通过更改参数0.5,改变0、1出现的概率。
1 |
num.forEach((y,i)=>{//forEach()函数,返回的数据为当前元素、当前元素的索引值、当前元素所属的数组对象。 |
至此全部的代码都完成了。下边是全部代码整合:
1 |
|