动态

详情 返回 返回

CSS炫酷光暈按鈕特效 - 动态 详情

如圖所示,這是一個很炫酷的發光按鈕特效,鼠標懸停時,按鈕呈現旋轉動畫發光的效果,這樣的動畫效果可以顯著提升用户體驗和視覺吸引力。本文將解析如何實現這個按鈕特效,基於這個動圖可以分析出實現這個效果的主要功能要點:

  • 按鈕背景為漸變顏色
  • 懸停時按鈕有放大效果
  • 懸停時文案有發光漸變動畫
  • 懸停時按鈕有旋轉發光效果

實現過程

漸變按鈕

漸變色背景我們設置background-imagelinear-gradient即可,這裏我們設置3個顏色和漸變的角度。

background-image: linear-gradient( 
    315deg,
    #ffc4ec -10%,
    #efdbfd 50%,
    #ffedd6 110%
);

為了加強按鈕效果再給按鈕設置陰影效果:

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%);

此時的按鈕效果:

懸停放大效果

給按鈕設置默認scale: 1,並設置動畫過渡屬性,這裏定義了一個複雜的自定義緩動函數linear,這個函數允許開發者在動畫中實現更細膩的速度變化。

  --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;
    
  transition: all var(--spring-duration) var(--spring-easing);

當用户懸停按鈕時,通過 scale 屬性使按鈕在懸停時放大,使用 transition 屬性使樣式變化平滑,並對按鈕陰影進行細微的調整,增強交互感。

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);
}

按鈕文案漸變

這裏除了按鈕放大其次還會按鈕的文案也增加了細節動畫,通過 background-clip: text 設置了文本的漸變效果,使文本看起來更具層次感。

默認給按鈕文案設置了背景色,動畫中通過調整背景色的background-position實現按鈕文字的漸變動畫。

background-image: linear-gradient(
  120deg,
  transparent,
  hsla(var(--glow-hue),100%,80%,0.66) 40%,
  hsla(var(--glow-hue),100%,90%,.9) 50%,
  transparent 52%);

默認設置 background-position: center 200%。在按鈕文案懸停時設置動畫:

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

動畫則是改變按鈕文案背景的background-position

@keyframes text {
    0% {
        background-position: 100% center;
    }    
    100% {
        background-position: -100% center;
    }    
}

為了方便查看,這裏是沒有設置background-clip: text的動畫效果,以下是懸停效果:

以下是設置background-clip: text後的動畫效果:

按鈕發光效果

接下來來到最重要的動畫實現環節,懸停時發光旋轉的效果。這裏我們新增一個shimmer元素來實現。

<span class="shimmer"></span> 

通過給這個元素的偽元素設置陰影以達到發光的效果,這裏設置按鈕的內部和外陰影如下圖箭頭所示,使按鈕內外都有光暈模糊的效果。

按鈕外部陰影:

.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;
}

接下來通過設置mask-image屬性使用 conic-gradient 函數創建了一個圓錐形的漸變遮罩,從而模擬了光暈的擴散效果。

conic-gradient 函數定義了一個圍繞中心點旋轉的漸變。漸變的顏色在不同的角度上有不同的透明度,從而創建出光暈的輪廓。在這個效果中,漸變從透明到黑色再到透明,模擬了光暈的邊緣。

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%
);

繼續設置inset: -40pxinset 屬性在這裏是用來調整絕對定位元素的位置和尺寸,以創建一個超出按鈕邊界的光暈效果,並通過動畫增強這種效果的動態性。40px是按鈕的高度,這樣可以創建一個剛好超出按鈕邊界的光暈效果。為了方便大家查看效果,這裏我將此值調整為-50px,以下是效果圖。

默認shimmer的偽元素透明度為0,鼠標懸停將 opacity 屬性被設置為 1, 使得光暈效果可見,並且應用了 shine 動畫,這個動畫改變了光暈的透明度,使按鈕有閃爍的效果。

@keyframes shine {
    0% {
        opacity: 0;
    }
    15% {
        opacity: 1;
    }
    55% {
        opacity: 1;
    }
    100% {
        opacity: 0;
    }
}

shimmer元素應用一個旋轉的動畫,修改mask-image中的--shimmer從0度到360度,使按鈕的光暈效果旋轉起來。

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

此時我們的完整動畫效果就完成了,以下是效果圖:

在線預覽

https://code.juejin.cn/pen/7376988628519485449

最後

通過以上步驟,結合 CSS 動畫、陰影和漸變效果,我們實現了一個旋轉光暈的按鈕。該效果不僅提升了視覺吸引力,也增強了用户的交互體驗。利用 CSS 的強大功能,我們可以輕鬆實現複雜的動畫效果,有興趣的可以嘗試使用起來~


看完本文如果覺得有用,記得點個贊支持,收藏起來説不定哪天就用上啦~

專注前端開發,分享前端相關技術乾貨,公眾號:南城大前端(ID: nanchengfe)
user avatar sy_records 头像 kinfuy 头像 jerryc 头像 howiecong 头像 guixudepubu 头像 fenanjiu 头像 bill_5bac65cc7963b 头像 lizeze 头像 linyuyizhizou_678b9fdc436f1 头像 mall4j 头像
点赞 10 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.