其他分享
首页 > 其他分享> > CSS 赛博朋克 “故障风”按钮制作方法

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>

 

知识点:

  1. 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