当前位置: 首页 > Web前端 > CSS

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裁剪两份图像元素,然后进行位移、变换等一系列操作,并添加过滤器。简单贴一下伪代码:
$img:"https://mzz-files.oss-cn-shenzhen.aliyuncs.com///uploads/U1002433/0cb5e044a1f0f7fc15f61264ee97ac1f.png";div{position:相对的;宽度:658px;高度:370px;背景:url($img)不重复;animation:main-img-hide16sinfinitestep-end;}div::before,div::after{position:absolute;宽度:658px;高度:370px;顶部:0;左:0;背景:继承;}div::after{内容:“”;动画:glitch-one16s无限步结束;}div::before{内容:“”;动画:glitch-two16sinfinite1sstep-end;}@keyframesglitch-one{@for$ifrom20to30{#{$i/2}%{left:#{randomNum(200,-100)}px;剪辑路径:插图(#{randomNum(150,30)}px0#{randomNum(150,30)}px);}}15.5%{剪辑路径:插图(10px0320px);左:-20px;}16%{剪辑路径:插图(10px0320px);左:-10px;不透明度:0;}....}@keyframesglitch-two{@for$ifrom40to50{#{$i/2}%{left:#{randomNum(200,-100)}px;clip-path:inset(#{randomNum(180)}px0#{randomNum(180)}px);}}25.5%{剪辑路径:插图(10px0320px);左:-20px;}26%{剪辑路径:插图(10px0320px);左:-10px;不透明度:0;}...}@keyframesmain-img-hide{5%{过滤器:反转(1);}...}因为动画部分的代码比较多,所以使用SASS循环函数随机生成一些部分。如果使用手动控制,效果其实会更好。当然,调试动画会花费更多时间。看效果,虽然CSS能力有限,但实际效果还不错:GIF图片太大,掉帧太多,效果大打折扣。完整的demo和效果可以点击这里:clip-path实现图片的glitchart风格动画有几个效果单靠这两个属性是无法实现的。其中transform和filter也起着非常重要的作用。当然,仅仅使用transform和filter也可以实现一些基本的毛刺艺术效果。对此感兴趣的读者可以自行多尝试。如果要在生产环境中使用,需要考虑mix-blend-mode和clip-path的兼容性。我自己对GlitchArt的理解其实比较简单,只是觉得用CSS来实现这种类似的效果比较有意思,所以尝试实践了一下,对相关名词或名词有什么误解还请见谅。最后,本文到此结束,希望对你有所帮助:)更多精彩的CSS技术文章汇总在我的Github——iCSS,持续更新中。欢迎点个星订阅收藏。更多精彩有趣的CSS效果,欢迎看这里的CSS灵感——在这里寻找编写CSS的灵感。有什么问题或者建议可以多交流。原创文章文笔有限,知识匮乏。如果文章中有任何不准确的地方,请告诉我。