使用CSS寫一個帶追蹤特效的漸變按鈕

寫一個帶追蹤特效的漸變按鈕
開頭先觀看這張GIF
圖:
是否被它的出色動畫效果所吸引?
這是從一個完美競技平臺中錄制出來的
我腦海中萌生了用CSS
來模仿這一效果的念頭
繪畫元素
我們先記錄下這個按鈕浮動的顏色(#868BFF
),還有按鈕的背景的漸變色(#39D5FF
->#868bff
)
外部使用一個div
元素表示一個自定義按鈕元素,內(nèi)部包含一個div
元素(follow
),用于實現(xiàn)一個尾隨鼠標(biāo)的效果。
當(dāng)鼠標(biāo)移動到按鈕上時,follow
元素將跟隨鼠標(biāo)的位置,創(chuàng)造出一個視覺上的尾隨效果,以增強用戶界面的交互性
<div class="custom-button"> <div class="follow"></div> 按鈕 </div>
接下來,結(jié)合我們之前記錄下來的色值,給按鈕添加上漸變色和浮動的元素
.custom-button { height: 80px; width: 400px; background: linear-gradient(to right, #39D5FF, #868bff); color: #fff; border: none; border-radius: 5px; cursor: pointer; overflow: hidden; display: flex; justify-content: center; align-items: center; position: relative; } .follow { width: 180px; height: 180px; background: radial-gradient(circle, #868bff 0%, transparent 70%, transparent 100%); transform-origin: center; position: absolute; left: 0; top: 0; }
設(shè)置完畢后,你將會得到以下這個效果圖
綁定事件
在我們錄制的GIF
圖中,我們可以看到當(dāng)我們鼠標(biāo)移動到按鈕上面的時候,會出現(xiàn)一個動畫效果的軟化邊緣圓形,以增強元素的視覺吸引力
你是不是也和我一樣第一時間想到了利用mousemove
事件來監(jiān)聽鼠標(biāo)移動
我們給外部的div
綁定上mousemove
事件
<div class="custom-button" @mousemove="move"> <span class="follow"></span> 按鈕 </div>
const move=()=>{}
通過mouseEvent
事件,我們可以拿到很多關(guān)于鼠標(biāo)的各種信息,例如鼠標(biāo)的位置,按鈕狀態(tài),事件類型...
如果您對
mouseEvent
事件不是很熟悉,可以看看這里 MouseEvent
接下來,我們通過mouseEvent
事件拿到offsetX
和offsetY
屬性
這兩個屬性表示的是鼠標(biāo)相對于目標(biāo)元素內(nèi)部左上角的偏移量
const move = (e: MouseEvent) => { const { offsetX, offsetY } = e loc.X = offsetX - 90; loc.Y = offsetY - 90; }
現(xiàn)在當(dāng)我們鼠標(biāo)進入到按鈕內(nèi)移動時,控制臺就會持續(xù)打印出當(dāng)前鼠標(biāo)基于元素的坐標(biāo)位置
我們新建一個reactive
屬性,用來存放當(dāng)前鼠標(biāo)坐標(biāo)系,方便后續(xù)將值綁定到元素中
這里要注意的是,我們的鼠標(biāo)指針是在圓形元素的中間,所以我們要將offsetX
,offsetY
各自減去90px
,也就是width/2
和height/2
// 存放坐標(biāo)信息 const loc = reactive({ X: 0, Y: 0 }) // 鼠標(biāo)事件 const move = (e: MouseEvent) => { const { offsetX, offsetY } = e loc.X = offsetX - 90; loc.Y = offsetY - 90; }
將loc
對象綁定給follow
元素作為樣式
<span class="follow" ref="followRef" :style="{ transform: `translate(${loc.X}px, ${loc.Y}px)` }"></span>
小小知識點:使用
transform
進行移動可以優(yōu)化性能,因為它不會觸發(fā)頁面的reflow
,reflow
是比較消耗性能的操作
我們試一下效果,跟著鼠標(biāo)移動的效果貌似是實現(xiàn)了,但是你有沒有發(fā)現(xiàn)每次移動的時候follow
元素總會閃到坐上角去,而且offsetX
,offsetY
輸出了{offsetX: 171, offsetY: 63}
我們給follow
元素添加上pointer-events: none;
即可解決問題
在多個元素重疊在一起時,event.target
會發(fā)生變動,可以打印一下看看
事件目標(biāo)元素一直在span
和div
標(biāo)簽中來回切換,導(dǎo)致我們出現(xiàn)抖動的效果
來看看調(diào)整過的效果!
實現(xiàn)動畫效果
這里可以使用CSS中的過渡動畫來實現(xiàn)我們的需求,這里使用scale
函數(shù)用來改變follow
元素的縮放效果,當(dāng)鼠標(biāo)進入到元素中,scale
值會從0
到1
,反之,重置為0
我們給外部的div
綁定多兩個事件,分別是mouseenter
,mouseleave
,用來記錄當(dāng)前鼠標(biāo)是否進入到元素中
定義兩個ref
屬性,用來記錄transitionDuration
值(元素CSS屬性的過渡時間)和isShowCircle
是否顯示follow
元素
<!-- 綁定鼠標(biāo)事件和CSS屬性值 --> <div class="custom-button" @mousemove="move" @mouseenter="enter" @mouseleave="leave"> <span class="follow" ref="followRef" :style="{ transform: `translate(${loc.X}px, ${loc.Y}px) scale(${isShowCircle ? 1 : 0})`, transitionDuration: tds }"></span> 按鈕 </div>
// 是否顯示圓形 const isShowCircle = ref(false) // 過渡時間 const tds = ref('0.2s') // 當(dāng)鼠標(biāo)進入到元素后觸發(fā) const enter = () => { isShowCircle.value = true // 這里要注意下 // 需要延遲設(shè)置tds值,否則會出現(xiàn)進入時動畫丟失效果 setTimeout(() => { tds.value = '0s'; }, 200); } // 當(dāng)鼠標(biāo)離開元素后觸發(fā) const leave = () => { isShowCircle.value = false tds.value = '0.2s'; }
現(xiàn)在就可以來看看我們效果怎么樣
解決文字層級問題
現(xiàn)在我們的特效會將按鈕中的文字覆蓋掉,是因為當(dāng)兄弟元素脫離了文檔流之后,元素的層級可能會比兄弟元素略高一些,我們只需要在按鈕里的文字用span
標(biāo)簽包裹著,并給他指定一個適當(dāng)?shù)?code>z-index即可解決這個問題
別忘記了,也要設(shè)置pointer-events: none;
哦,否則會出現(xiàn)抖動問題
.text { z-index: 1; pointer-events: none; }
擴展
在Vue
項目開發(fā)中,我們可能會遇到一份代碼重復(fù)使用的情況,這個時候我們可以使用Vue
組件的方式來封裝這個按鈕
這里我就直接把代碼貼在這里啦,有需要的同學(xué)可以從這里Copy
~~
<template> <div class="custom-button" @mousemove="move" @mouseenter="enter" @mouseleave="leave"> <span class="follow" ref="followRef" :style="{ transform: `translate(${loc.X}px, ${loc.Y}px) scale(${isShowCircle ? 1 : 0})`, transitionDuration: tds }"></span> <span class="text"> <slot></slot> </span> </div> </template> <script setup lang="ts"> import { reactive, ref } from 'vue'; const isShowCircle = ref(false) const followRef = ref() const loc = reactive({ X: 0, Y: 0 }) const tds = ref('0.2s') const enter = () => { isShowCircle.value = true setTimeout(() => { tds.value = '0s'; }, 200); } const leave = () => { isShowCircle.value = false tds.value = '0.2s'; } const move = (e: MouseEvent) => { const { offsetX, offsetY } = e loc.X = offsetX - 90; loc.Y = offsetY - 90; } </script> <style scoped> .custom-button { height: 80px; width: 400px; background: linear-gradient(to right, #39D5FF, #868bff); color: #fff; border: none; border-radius: 5px; cursor: pointer; overflow: hidden; display: flex; justify-content: center; align-items: center; position: relative; } .follow { width: 180px; height: 180px; background: radial-gradient(circle, #868bff 0%, transparent 70%, transparent 100%); transform-origin: center; pointer-events: none; position: absolute; left: 0; top: 0; } .text { z-index: 1; pointer-events: none; } </style>
以上就是使用CSS寫一個帶追蹤特效的漸變按鈕的詳細內(nèi)容,更多關(guān)于CSS追蹤特效的漸變按鈕的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
- 要在文本中實現(xiàn)漸變色效果,我們可以使用CSS中的background-clip屬性和CSS漸變來實現(xiàn),本文給大家分享一個代碼示例,展示如何創(chuàng)建文本漸變色效果,感興趣的同學(xué)可以自己動手2023-10-16
- 這篇文章給大家介紹了如何使用CSS實現(xiàn)漸變圓角邊框的效果,有沒有發(fā)現(xiàn)在現(xiàn)如今的網(wǎng)站應(yīng)用中,我們大量的使用到這類場景,在解決這類問題時,我們利用了css的mask與mask-comp2023-10-12
CSS動態(tài)流光線條效果和顏色漸變效果的實現(xiàn)代碼
在前端開發(fā)中,為網(wǎng)頁添加動態(tài)效果可以提升用戶體驗,本文將介紹如何使用 CSS 實現(xiàn)動態(tài)流光線條效果和顏色漸變效果,為你的網(wǎng)頁增添炫目的視覺效果,感興趣的同學(xué)可以自己動2023-09-12- 傳統(tǒng)的灰色純色邊框你是不是覺得太難看了?你是否想設(shè)計一些精美的邊框,例如漸變、圓角、彩色的邊框?那你來對地方了,本文將介紹如何用純CSS就能實現(xiàn)具有漸變和圓角的彩2023-02-25
CSS實現(xiàn)漸變色邊框(Gradient borders)的5種方法
給 border 設(shè)置漸變色是很常見的效果,實現(xiàn)這個效果有很多思路,本文主要介紹了CSS實現(xiàn)漸變色邊框的5種方法,文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感2022-03-22- 本文主要介紹了利用CSS中的conic-gradient()以及box-shadow模擬出光源陰影效果,從而實現(xiàn)一個充滿高級感的背景光動畫,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-11-30
CSS實現(xiàn)切角+邊框+投影+內(nèi)容背景色漸變效果
這篇文章主要介紹了CSS實現(xiàn)切角+邊框+投影+內(nèi)容背景色漸變效果,單純用css實現(xiàn)切角+邊框+投影+內(nèi)容背景色漸變所有效果,因為UI沒給背景切圖,尋思這個理論上用css就能實現(xiàn)2021-10-27- 這篇文章主要介紹了CSS 還能這樣玩?奇思妙想漸變的藝術(shù),包括數(shù)量級對背景圖形的影響及借助 CSS @property 觀察變化過程,需要的朋友可以參考下2021-04-26
- 這篇文章主要介紹了CSS線性漸變的凹面矩形過渡動效的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一2020-11-09
- 這篇文章主要介紹了css 實現(xiàn)圓形漸變進度條效果的示例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-24