CSSGlitchArt
时间:2023-03-30 18:54:52
CSS
本文的主题是GlitchArt,故障艺术。什么是故障艺术?抖音家喻户晓的LOGO只是故障艺术的一种表现形式。它有一种神奇的感觉,看起来有一种闪烁、震动的效果,非常的醒目。GlitchArt它模拟图像信号中的毛刺导致成像错误的感觉。青色色块和红色色块无法重叠就是这种失败的体现。从电影时代开始到今天的数字时代,这种故障对于观众来说已经是一种非常熟悉的现象。即使抖音的LOGO只是静态的,大脑也会自己完成整个效果,甚至会自己弥补信号干扰的噪音。当然,广义的glitchart不仅仅是指这个效果,我觉得是非常广泛的。本文将介绍一些CSS可以模拟的故障艺术效果。使用混合模式实现抖音LOGO从静态开始,抖音的LOGO就是一个很好的例子。它看起来像3个J形状相互重叠。实际上,两个J形重叠在一起,重叠部分呈现白色。这个特性使用CSS混合模式mix-blend-mode非常容易实现,单个J形示意图如下:图片来自知乎:Why抖音的logo好像有点“电”、“闪烁”和“振动”?单个J形其实是由3/4圆+竖条+1/4圆组成,用一个label(加两个伪元素)就可以完成。关键是借助伪元素实现整体J结构,借助mix-blend-mode实现融合效果。使用mix-blend-mode:lighten实现两个J型结构的重叠部分,这样整个效果只需要两个label。:
简单的SASS代码://实现第一个J.j{position:absolute;&::之前{内容:“”;...}&::after{内容:“”;...}}//实现第二个J,加上混合模式。j:last-child{位置:绝对;混合混合模式:变亮;&::之前{内容:“”;...}&::after{内容:“”;...}}原理图如下(为了更好理解加了动画):完整DEMO:使用mix-blend-mode实现抖音LOGO图片的GlitchArt风格当然上面是叠加的J形我们实现了。了解了这个技巧之后,我们就可以把它应用到图片上了。这里我们将使用background-blend-mode和mix-blend-mode。假设我们有这样一张图片:只需要一个标签就可以给出两张相同的图片
,叠加青色#0ff和红色#f00,错开一定距离,添加background-blend-mode:lightentobothpictures,addmix-blend-mode:darkentooneofthem:.mix{width:400px;高度:400px;背景:url($img),#0ff;背景混合模式:变亮;&::之后{内容:'';位置:绝对;左边距:10px;宽度:400px;高度:400px;背景:url($img),#f00;混合模式:变亮;混合混合模式:变暗;}}得到如下效果:这里和上面的抖音LOGO有点不同,使用的混合模式不止一种,我简单说明一下。因为图片本身并不是红色和青色,所以需要通过background-image将这两种颜色叠加,通过background-blend-mode:lighten使其呈现出来。中间为了保持叠加部分原来的颜色,需要叠加一个mix-blend-mode:darken反处理。(不懂的同学可以打开调试,手动关掉几个混合模式,自己感受一下)有了上面的铺垫,我们接下来就可以动画这个效果了。重点是使用mix-blend-mode:lighten混合模式实现两段文字结构重叠部分为白色。利用元素位移完成错位运动动画,形成视觉冲击效果。看效果:本文有点长,代码就不上传了。完整的DEMO在这里:class抖音LOGOTextGlitchEffect当然,我们不一定要用混合模式让融合部分变白,我们可以直接使用这个配色效果,基于上面的另一个版本效果,不使用混合模式。关键点是使用伪元素生成文本的两个副本。视觉效果由置换、遮罩和混合模式完成。配色借鉴了抖音的LOGO。好处是对于文本的每一份拷贝,都有更大的移动距离和处理空间。GlitchArtstyle404效果稍微把文字文案替换成404,然后加了一些滤镜效果(hue-rotate(),blur())嘿嘿,我发现了一个可能实际可用的场景:效果一:效果二:二404效果的demo如下:CodePen--CSS404失败效果CodePen--404失败效果其他配色效果当然不止这个红+蓝配色效果。还有一些其他的配色混合模式,比如黄色+粉色+蓝色搭配mix-blend-mode:multiply。然后,有时候,效果不想和背景混在一起,可以用isolation:isolate来隔离。好吧,以上效果可以归为一类。接下来,打开下一个类别剪辑路径。本章后半部分的主角主要是clip-path。clip-path是一个非常有趣的CSS属性。clip-pathCSS属性创建一个裁剪区域,其中仅显示元素的一部分。区域内的部分显示,区域外的部分隐藏。裁剪区域是通过引用嵌入的URL或外部SVG路径来定义的。也就是说,使用clip-path可以把一个容器切割成我们想要的样子。例如:
TXET
div{margin:auto;填充:10px;行高:1.2;字体大小:60px;background:#ddd;}这是正常的:使用clip-path来裁剪到一个平行四边形:div{margin:auto;填充:10px;行高:1.2;字体大小:60px;background:#ddd;+clip-path:polygon(35%0,85%0,75%100%,25%100%);}结果如下:然后,我们有一个想法,我们可以复制几份将文本重叠,然后分别剪切这些副本以制作位移动画。使用clip-path实现文字打断动画我们还是使用元素的::before和::after伪元素做两份,然后使用clip-path进行裁剪,再使用transform进行控制。核心代码:
TextCrack div{position:relative;动画:向前摇动2.5s线性;}div跨度{剪辑路径:多边形(10%0%,44%0%,70%100%,55%100%);}div::before,div::after{内容:属性(数据文本);位置:绝对;顶部:0;left:0;}div::before{animation:crack12.5s线性向前;clip-path:polygon(0%0%,10%0%,55%100%,0%100%);}div::after{animation:crack22.5slinearforwards;clip-path:polygon(44%0%,100%0%,100%100%,70%100%);}//元素摇动,打破前摇动@keyframesshake{...}@keyframescrack1{0%,95%{transform:translate(-50%,-50%);}100%{转换:翻译(-55%,-45%);}}@keyframescrack2{0%,95%{transform:translate(-50%,-50%);}100%{变换:翻译(-45%,-55%);可以得到这个效果:完整Demo:clip-path实现文字打断的效果,最早的版本可以找这个作者:GeorgeW.Parkclip-path的GlitchArtOK,继续,有了上面的铺垫,接下来我们把这个效果应用到图片上,加上动画随意选择一张图片:哇,很赛博朋克。实现动画的关键是:利用元素的两个伪元素生成两份图像,利用clip-path裁剪两份图像元素,然后进行位移、变换等一系列操作,并添加过滤器。简单贴一下伪代码: