利用CSS變量實(shí)現(xiàn)令人震驚的懸浮效果

image

原文鏈接: 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)擊的概率。

image

怎樣才能達(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`)
}
  1. 選擇元素,等待,直到用戶將鼠標(biāo)移過它;
  2. 計(jì)算相對于元素的位置;
  3. 將坐標(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;
  }
}
  1. 用span包裹文本,以避免顯示在按鈕的上方。
  2. 將 width和height初始化為0px,當(dāng)用戶懸停在按鈕上時(shí),將其改為400px。不要忘了設(shè)置這種轉(zhuǎn)換以使其像風(fēng)一樣??瞬間出現(xiàn);
  3. 利用坐標(biāo)追蹤鼠標(biāo)位置;
  4. 在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)畫:

image

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

The possibilities are endless. Let us know what you did with it in the comments below 可能的嘗試是各種各樣的,讓我們從下面的評論中看看你們都做了什么嘗試??

問與答

為什么要用widthheight代替 transform: scale()去制造動(dòng)畫效果?

通過調(diào)整widthheight值以實(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è)問題。

image

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 28,803評論 1 45
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    love2013閱讀 2,430評論 0 11
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    wzhiq896閱讀 2,114評論 0 2
  • 在旅途游歷的路上,看見了世間的美景,也看見了人間的奇妙。 一些人和事,特別想寫下來,分享在人間。 1. 2016年...
    右和閱讀 214評論 0 2

友情鏈接更多精彩內(nèi)容