
原文鏈接: blog.prototypr.io
最近,我從 Grover網(wǎng)站上發(fā)現(xiàn)以一個(gè)好玩兒的懸停動(dòng)畫,也有了些自己的靈感。這個(gè)動(dòng)畫是將鼠標(biāo)移動(dòng)到訂閱按鈕上移動(dòng)光標(biāo)會顯示相應(yīng)的彩色漸變。這個(gè)想法很簡單,但是它能使這個(gè)按鈕脫穎而出,人們一下子就注意到它了,增加了點(diǎn)擊的概率。

怎樣才能達(dá)到這個(gè)效果,使我們的網(wǎng)站脫穎而出呢?其實(shí),它并不像你想象的那么難!
追蹤位置
我們要做的第一件事就是獲取到鼠標(biāo)的位置。
document.querySelector('.button').onmousemove = (e) => {
const x = e.pageX - e.target.offsetLeft
const y = e.pageY - e.target.offsetTop
e.target.style.setProperty('--x', `${ x }px`)
e.target.style.setProperty('--y', `${ y }px`)
}
- 選擇元素,等待,直到用戶將鼠標(biāo)移過它;
- 計(jì)算相對于元素的位置;
- 將坐標(biāo)存在CSS的變量中。
是的,僅僅9行代碼就讓你能獲知用戶放置鼠標(biāo)的位置,通過這個(gè)信息你能達(dá)到意想不到的效果,但是我們還是先來完成CSS部分的代碼。
動(dòng)畫漸變
我們先將坐標(biāo)存儲在CSS變量中,以便能夠隨時(shí)使用它們。
.button {
position: relative;
appearance: none;
background: #f72359;
padding: 1em 2em;
border: none;
color: white;
font-size: 1.2em;
cursor: pointer;
outline: none;
overflow: hidden;
border-radius: 100px;
span {
position: relative;
}
&::before {
--size: 0;
content: '';
position: absolute;
left: var(--x);
top: var(--y);
width: var(--size);
height: var(--size);
background: radial-gradient(circle closest-side, #4405f7, transparent);
transform: translate(-50%, -50%);
transition: width .2s ease, height .2s ease;
}
&:hover::before {
--size: 400px;
}
}
- 用span包裹文本,以避免顯示在按鈕的上方。
- 將 width和height初始化為0px,當(dāng)用戶懸停在按鈕上時(shí),將其改為400px。不要忘了設(shè)置這種轉(zhuǎn)換以使其像風(fēng)一樣??瞬間出現(xiàn);
- 利用坐標(biāo)追蹤鼠標(biāo)位置;
- 在background 屬性上應(yīng)用 radial-gradient,使用closest-side circle。Closest-side能夠覆蓋整個(gè)面。
結(jié)果
成功啦!將其加入到對于的HTML頁面,你炫酷的按鈕就可以使用啦!
其他嘗試
通過收集鼠標(biāo)的位置并對其有相應(yīng)的響應(yīng)就能實(shí)現(xiàn)這么贊的效果。太棒了,在這個(gè)動(dòng)手過程中我收獲很多樂趣 ??
這是我在名為 basicScroll 的網(wǎng)站做的其他的類似的動(dòng)畫:

花哨些,做了個(gè)3D效果的按鈕:

The possibilities are endless. Let us know what you did with it in the comments below 可能的嘗試是各種各樣的,讓我們從下面的評論中看看你們都做了什么嘗試??
問與答
為什么要用width 和 height代替 transform: scale()去制造動(dòng)畫效果?
通過調(diào)整width 和 height值以實(shí)現(xiàn)動(dòng)畫效果,實(shí)際上的性能極差,您應(yīng)該盡可能嘗試用 transform去實(shí)現(xiàn)。那我為什么仍然堅(jiān)持呢?原因就在于當(dāng)瀏覽器在加速圖層中呈現(xiàn)元素時(shí)(即轉(zhuǎn)換),如果按鈕具有非矩形邊緣時(shí),該圖層可能會出現(xiàn)意想不到的bug。
編者: 誠然,有很多方式去使用 transform,但是一些瀏覽器并不喜歡它。不通過transform去實(shí)現(xiàn)轉(zhuǎn)換功能也許是個(gè)不錯(cuò)的解決問題的方法。這兒還有名為 解決Safari的方法 的網(wǎng)站也許可以解決這個(gè)問題。

為什么改變 top 和 left屬性的值而不使用 transform: translate()?
參見上面的解釋??