CSS 赛博朋克 “故障风”按钮制作方法
作者:互联网
想在个人博客上名字处添加一个鼠标经过的动画特效,看到这种“故障风格”感觉自己的中二值拉满,随后进行学习如何制作。
参考原文:https://juejin.cn/post/6908565208596217863
代码展示:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <style scoped> @keyframes glitch { 0% { clip-path: var(--slice-1); transform: translate(-20px, -10px); } 10% { clip-path: var(--slice-3); transform: translate(10px, 10px); } 20% { clip-path: var(--slice-1); transform: translate(-10px, 10px); } 30% { clip-path: var(--slice-3); transform: translate(0px, 5px); } 40% { clip-path: var(--slice-2); transform: translate(-5px, 0px); } 50% { clip-path: var(--slice-3); transform: translate(5px, 0px); } 60% { clip-path: var(--slice-4); transform: translate(5px, 10px); } 70% { clip-path: var(--slice-2); transform: translate(-10px, 10px); } 80% { clip-path: var(--slice-5); transform: translate(20px, -10px); } 90% { clip-path: var(--slice-1); transform: translate(-10px, 0px); } 100% { clip-path: var(--slice-1); transform: translate(0); } } body { display: flex; justify-content: center; align-items: center; min-height: 100vh; background-color: #f8f005; } button, button::after { position: relative; width: 380px; height: 86px; line-height: 86px; font-size: 36px; /* cursive 为通用字体族名——草书 */ font-family: "Bebas Neue", cursive; background: linear-gradient(45deg, transparent 5%, #ff013c 5%); border: 0; color: #fff; letter-spacing: 3px; outline: transparent; } button::after { --slice-0: inset(50% 50% 50% 50%); --slice-1: inset(80% -6px 0 0); --slice-2: inset(50% -6px 30% 0); --slice-3: inset(10% -6px 85% 0); --slice-4: inset(40% -6px 43% 0); --slice-5: inset(80% -6px 5% 0); content: "AVAILABLE NOW"; display: block; position: absolute; top: 0; left: 0; bottom: 0; background: linear-gradient(45deg, transparent 3%, #00e6f6 3%, #00e6f6 5%, #ff013c 5%); box-shadow: 6px 0 0 #00e6f6; text-shadow: -3px -3px 0px #f8f005, 3px 3px 0px #00e6f6; clip-path: var(--slice-0); } button:hover::after { animation: glitch 1s; animation-timing-function: steps(2, end); } </style> <body> <button>AVAILABLE NOW</button> </body> </html>
知识点:
- linear-gradient:用于背景颜色的渐变。
background:linear-gradient(to left , red,#fff);
第一个参数用于控制渐变的角度,分别为0deg与90deg。
第二个参数与第三个分别控制终点颜色与起始颜色。
而原文作者使用的想法为用于制作左下角的斜角,将斜角出设置为透明并过渡到红色。
但如果直接设置为background:linear-gradient(45deg, transparent,red); 则会导致一个从透明缓慢过渡到红色的样式。无法突显左下角缺一块的感觉。
而通过设置颜色开始部分相同,位置相交中间过渡区域被遮挡剔除。也就形成了想要的结果。
background:linear-gradient(45deg, transparent 5%,red 5%);
2.实现变色层:通过对按钮设置伪类选择器::after 并设置相同样式,悬浮在按钮上,设置文字阴影效果。
3.图形切割达到颜色分割效果:clip-path:由于第一次接触clip-path 所以需要从头了解。
clip-path 属性使用裁剪方式创建元素的可显示区域。区域内的部分显示,区域外的隐藏。可以指定一些特定形状。
而inset()里面的设定值有 4 个,分别代表上右下左,即是要向内缩小多少。
在通过动画设定%的进度看做帧数,每一帧显示的区域不同,可以达到一种“信号不稳定,导致的卡顿画面切割的效果”。关于属性的具体使用,可以参考https://blog.csdn.net/weixin_44614518/article/details/121946472 写的十分详细。
通过自定义多个属性并在动画使用var()函数来调用属性。以达到显示不同区域的感觉,但指显示不同区域无法做到拉扯撕裂的感觉,所以还需要在每一帧添加小幅度位移来进行体现。
在::after 内进行多个自定义属性。来设定可显示区域,区域划分只要划分出上下层次即可,左右通过位移实现即可。
--division-0:inset(50% 50% 50% 50%); --division-1:inset(80% -6px 0 2px); --division-2:inset(70% -6px 30% 2px); --division-3:inset(80% -6px 0 2px); --division-4:inset(10% -6px 70% 2px); --division-5:inset(0% -6px 90% 2px); --division-6:inset(30% -6px 50% 2px); clip-path: var(--division-0);
动画代码
@keyframes glitch { 0% { clip-path: var(--division-0); transform: translate(-20px, -10px); } 10% { clip-path: var(--division-3); transform: translate(10px, 10px); } 20% { clip-path: var(--division-1); transform: translate(-10px, 10px); } 30% { clip-path: var(--division-3); transform: translate(0px, 5px); } 40% { clip-path: var(--division-6); transform: translate(-5px, 0px); } 50% { clip-path: var(--division-5); transform: translate(5px, 0px); } 60% { clip-path: var(--division-4); transform: translate(5px, 10px); } 70% { clip-path: var(--division-2); transform: translate(-10px, 10px); } 80% { clip-path: var(--division-5); transform: translate(20px, -10px); } 90% { clip-path: var(--division-1); transform: translate(-10px, 0px); } 100% { clip-path: var(--division-6); transform: translate(0); } }
标签:clip,朋克,赛博,transform,--,var,path,translate,CSS 来源: https://www.cnblogs.com/WangEDblog/p/16210002.html