HTML+CSS:炫酷按钮组件

效果演示

23-炫酷按钮组件.gif

实现了一个带有发光效果的按钮。按钮在悬停或激活时会产生发光效果,并且按钮上的文字也会随之移动。

Code

<main id="app">

    <button>
        <span class="text">若冰说CSS</span>
        <span class="shimmer"></span>
    </button>

</main>
:root {
    --glow-hue: 222deg;
    --shadow-hue: 180deg;
    --spring-easing: linear(
        0,
        0.002,
        0.01 0.9%,
        0.038 1.8%,
        0.156,
        0.312 5.8%,
        0.789 11.1%,
        1.015 14.2%,
        1.096,
        1.157,
        1.199,
        1.224 20.3%,
        1.231,
        1.231,
        1.226,
        1.214 24.6%,
        1.176 26.9%,
        1.057 32.6%,
        1.007 35.5%,
        0.984,
        0.968,
        0.956,
        0.949 42%,
        0.946 44.1%,
        0.95 46.5%,
        0.998 57.2%,
        1.007,
        1.011 63.3%,
        1.012 68.3%,
        0.998 84%,
        1
    );
    --spring-duration: 1.33s;
}
@property --shimmer {
    syntax: "<angle>";
    inherits: false;
    initial-value: 33deg;
}

@keyframes shimmer {
    0% {
        --shimmer: 0deg;
    }
    100% {
        --shimmer: 360deg;
    }
}

@keyframes shine {
    0% {
        opacity: 0;
    }
    15% {
        opacity: 1;
    }
    55% {
        opacity: 1;
    }
    100% {
        opacity: 0;
    }
}
@keyframes text {
    0% {
        background-position: 100% center;
    }
    100% {
        background-position: -100% center;
    }
}

button {
    color: var(--bg);
    font-weight: 600;
    /*     background-image: linear-gradient(90deg, #fcecfe, #fbf6e7, #e6fcf5); */
    background-image: linear-gradient(
        315deg,
        #ffc4ec -10%,
        #efdbfd 50%,
        #ffedd6 110%
    );
    padding: 0.8em 1.4em;
    position: relative;
    isolation: isolate;
    box-shadow: 0 2px 3px 1px hsl(var(--glow-hue) 50% 20% / 50%),
        inset 0 -10px 20px -10px hsla(var(--shadow-hue), 10%, 90%, 95%);
    border-radius: 0.66em;
    scale: 1;
    transition: all var(--spring-duration) var(--spring-easing);
}

button:hover:not(:active),
button.active {
    transition-duration: calc(var(--spring-duration) * 0.5);
    scale: 1.2;
    box-shadow: 0 4px 8px -2px hsl(var(--glow-hue) 50% 20% / 50%),
        inset 0 0 0 transparent;
}
button:active {
    scale: 1.1;
    transition-duration: calc(var(--spring-duration) * 0.5);
}

.shimmer {
    position: absolute;
    inset: -40px;
    border-radius: inherit;
    mask-image: conic-gradient(
        from var(--shimmer, 0deg),
        transparent 0%,
        transparent 10%,
        black 36%,
        black 45%,
        transparent 50%,
        transparent 60%,
        black 85%,
        black 95%,
        transparent 100%
    );
    mask-size: cover;
    mix-blend-mode: plus-lighter;
    animation: shimmer 1s linear infinite both;
}
button:hover .shimmer::before,
button:hover .shimmer::after,
button.active .shimmer::before,
button.active .shimmer::after {
    opacity: 1;
    animation: shine 1.2s ease-in 1 forwards;
}
.shimmer::before,
.shimmer::after {
    transition: all 0.5s ease;
    opacity: 0;
    content: "";
    border-radius: inherit;
    position: absolute;
    mix-blend-mode: color;
    inset: 40px;
    pointer-events: none;
}
.shimmer::before {
    box-shadow: 0 0 3px 2px hsl(var(--glow-hue) 20% 95%),
        0 0 7px 4px hsl(var(--glow-hue) 20% 80%),
        0 0 13px 4px hsl(var(--glow-hue) 50% 70%),
        0 0 25px 5px hsl(var(--glow-hue) 100% 70%);
    z-index: -1;
}

.shimmer::after {
    box-shadow: inset 0 0 0 1px hsl(var(--glow-hue) 70% 95%),
        inset 0 0 2px 1px hsl(var(--glow-hue) 100% 80%),
        inset 0 0 5px 2px hsl(var(--glow-hue) 100% 70%);
    z-index: 2;
}

button .text {
    color: black;
    font-weight: bold;
    background-clip: text;
    background-color: var(--bg);
    background-image: linear-gradient(
        120deg,
        transparent,
        hsla(var(--glow-hue), 100%, 80%, 0.66) 40%,
        hsla(var(--glow-hue), 100%, 90%, 0.9) 50%,
        transparent 52%
    );
    background-repeat: no-repeat;
    background-size: 300% 300%;
    background-position: center 200%;
}

button:hover .text,
button.active .text {
    animation: text 0.66s ease-in 1 both;
}

body,
html {
    display: flex;
    height: 100vh;
    padding: 0;
    /*     background: radial-gradient(circle at 50% 0%, #9588c7 15%, #c79ed5 75%); */
    background-image: radial-gradient(
        circle at 50% 0%,
        rgb(67, 54, 74) 16.4%,
        rgb(47, 48, 67) 68.2%,
        rgb(27, 23, 36) 99.1%
    );
}
main#app {
    height: 100vh;
    width: 100vw;
    display: flex;
    align-items: center;
    justify-content: center;
}

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值