故障艺术,英文名称叫glitch,在很多赛博朋克作品中经常看到,其实就是故意表现一种显示设备的小故障效果,抖音的图标其实就是这种的效果,我们看下这个图标
这个图标中的红色和蓝色的偏移其实就是一种故障艺术,看到这个,我就能想到早年我家还没有有线电视时,摇天线对电视信号的场景,信号一差就是对着电视一阵拳打脚踢,现在看到这种艺术效果颇为怀念。
某甲:为啥我没遇到过这种场景?
我:你把手里的平板扔地上就能看到了。
某甲:(土豪动作完成)我摔了,咋还没看到呢
我:我就打个比方,你何必当真...
某甲:我一定要看到!
我:要不你再跺几脚...
----------------------------------------我是打算开始的分割线------------------------------------------
我们先来实现一个动态的抖音故障效果,首先我们要有一个干净的抖音图标,我是从阿里巴巴矢量图标库找的,因为它家支持SVG格式,得到的SVG代码是这样的。
看到的图形是这样子的
注意,在SVG的代码里面是没有设置颜色的,图片里面的黑色是为了让大家看清楚。我们先把白色,蓝色和红色的三层抖音图标先显示出来,代码如下:
/* 白色 */
.douyin {
fill: #fff;
}
/* 蓝色 */
.douyin1 {
fill: #25f4ee;
}
/* 红色 */
.douyin2 {
fill: #fe2c55;
}
分别填上了白色,红色和蓝色,在SVG里面,后面的会覆盖前面的,所以把白色放在最前面,因为现在三者的位置是重叠的,所以只能看到白色的。
我们再设置白色的动画效果
@keyframes glitch1 {
0% {
transform: none;
opacity: 1;
}
7% {
transform: skew(-2.5deg, -0.9deg);
opacity: 0.75;
}
10% {
transform: none;
opacity: 1;
}
27% {
transform: none;
opacity: 1;
}
30% {
transform: skew(1.8deg, -0.1deg);
opacity: 0.75;
}
35% {
transform: none;
opacity: 1;
}
52% {
transform: none;
opacity: 1;
}
55% {
transform: skew(-1deg, 1.2deg);
opacity: 0.75;
}
60% {
transform: none;
opacity: 1;
}
72% {
transform: none;
opacity: 1;
}
75% {
transform: skew(0.4deg, -1deg);
opacity: 0.75;
}
80% {
transform: none;
opacity: 1;
}
100% {
transform: none;
opacity: 1;
}
}
白色的动画效果很小,因为我只做了一些轻微的倾斜效果,感觉画面在抖动,用的是 transform: skew()。transform是css的一个属性,主要设置的是变形效果,这边用的skew是实现倾斜效果。另外还用opacity做了些透明度的处理,用来表现信号故障时的亮度变化。
我们接着设置蓝色图标的动画效果:
@keyframes glitch2 {
0% {
transform: none;
opacity: 0.25;
}
7% {
transform: translate(-4px, -6px);
opacity: 0.5;
}
10% {
transform: none;
opacity: 0.25;
}
27% {
transform: none;
opacity: 0.25;
}
30% {
transform: translate(-7px, -4px);
opacity: 0.5;
}
35% {
transform: none;
opacity: 0.25;
}
52% {
transform: none;
opacity: 0.25;
}
55% {
transform: translate(-5px, -2px);
opacity: 0.5;
}
60% {
transform: none;
opacity: 0.25;
}
72% {
transform: none;
opacity: 0.25;
}
75% {
transform: translate(-4px, -6px);
opacity: 0.5;
}
80% {
transform: none;
opacity: 0.25;
}
100% {
transform: none;
opacity: 0.25;
}
}
这里同样是使用transform变形,但用的效果是translate,官方的名称是2D转换,其实就是平移效果,可以在横向纵向做移动,我们看抖音的图标就知道,蓝色部分是在白色图标的左上方,所以设置的translate的值都是负数,这是左上方的平移。
红色部分类似,只是translate的值都是正数,表示时右下方的平移。代码如下:
@keyframes glitch3 {
0% {
transform: none;
opacity: 0.25;
}
7% {
transform: translate(4px, 6px);
opacity: 0.5;
}
10% {
transform: none;
opacity: 0.25;
}
27% {
transform: none;
opacity: 0.25;
}
30% {
transform: translate(7px, 4px);
opacity: 0.5;
}
35% {
transform: none;
opacity: 0.25;
}
52% {
transform: none;
opacity: 0.25;
}
55% {
transform: translate(5px, 2px);
opacity: 0.5;
}
60% {
transform: none;
opacity: 0.25;
}
72% {
transform: none;
opacity: 0.25;
}
75% {
transform: translate(4px, 8px);
opacity: 0.5;
}
80% {
transform: none;
opacity: 0.25;
}
100% {
transform: none;
opacity: 0.25;
}
}
最后,把动画效果加到css类里面去,之前的css代码改成这样
.douyin {
fill: #fff;
/*Animation*/
animation: glitch1 3s infinite;
}
.douyin1 {
fill: #25f4ee;
animation: glitch2 3s infinite;
}
.douyin2 {
fill: #fe2c55;
animation: glitch3 3s infinite;
}
动画效果设置成3秒,无限循环,最后的成品效果如下:
在线效果请移步codepen.io
---------------------------------------------还有高级效果的分割线----------------------------------------
上面实现的是模仿抖音官方图标的动态效果,但作为一个赛博朋克艺术家(是的,我都艺术家好几个星期了),我觉得这个效果虽然很符合抖音的气质,但离我想象中的高大上效果还有很大一段距离,我决定再加些效果,更加赛博朋克一些。
这里我要用上一个负责的svg的filter,代码如下:
这是一个组合的filter效果,具体的分工如下:
最后我们把这个filter加到动画效果里面,我们拿三个keyframe中的一个来看下代码,其他两个是一样的。
@keyframes glitch1 {
0% {
transform: none;
opacity: 1;
}
7% {
transform: skew(-2.5deg, -0.9deg);
filter: url(#filter);
opacity: 0.75;
}
8% {
filter: none;
}
10% {
transform: none;
opacity: 1;
}
27% {
transform: none;
opacity: 1;
}
30% {
transform: skew(1.8deg, -0.1deg);
filter: url(#filter);
opacity: 0.75;
}
31% {
filter: none;
}
35% {
transform: none;
opacity: 1;
}
52% {
transform: none;
opacity: 1;
}
55% {
transform: skew(-1deg, 1.2deg);
filter: url(#filter);
opacity: 0.75;
}
56% {
filter: none;
}
60% {
transform: none;
opacity: 1;
}
72% {
transform: none;
opacity: 1;
}
75% {
transform: skew(0.4deg, -1deg);
filter: url(#filter);
opacity: 0.75;
}
76% {
filter: none;
}
80% {
transform: none;
opacity: 1;
}
100% {
transform: none;
opacity: 1;
}
}
filter: url(#filter) 这一句就是调用svg filter的语句。注意每调用一次这个,在后面都会加上这一句
31% {
filter: none;
}
这是为了让filter效果瞬间出现,瞬间消失,使得故障效果更加逼真。最终看到的效果如下:
在线效果请看codepen.io
源代码请看这里