日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

vue實現水波漣漪效果的點擊反饋指令

瀏覽:5日期:2022-09-29 09:49:34
目錄水波效果來看實現定制一個水波紋默認樣式計算水波紋的位置和直徑鼠標按下時創建水波鼠標抬起時銷毀水波通過指令binding去擴展你的水波選項寫在最后水波效果

當用戶點擊時,會以點擊中心為圓心產生一個水波擴散的漣漪效果,適用各個場景,美觀又不浮夸,關鍵是可以給用戶帶來很直觀的反饋。

vue實現水波漣漪效果的點擊反饋指令

來看實現

首先這里基于Vue3自定義指令進行封裝,Vue3的自定義指令跟Vue2相比變動不是很大,。我們的目標是完成一個水波指令的基本原型,這里循序漸進展開。

定制一個水波紋默認樣式

水波紋實際上就是通過用戶點擊的位置生成一個小圓圈,并且尺寸逐漸擴大到整個被點擊元素的一個過程,所以這里先制定一個水波基本的樣式,并設置好過度動畫,過度動畫應該是一個先慢后快的一個過程,這里使用貝塞爾曲線定制

.my-ripple { position: absolute; top: 0; left: 0; z-index: 100; border-radius: 50%; background-color: currentColor; opacity: 0; transition: transform 0.2s cubic-bezier(0.68, 0.01, 0.62, 0.6), opacity 0.08s linear; will-change: transform, opacity; pointer-events: none;}計算水波紋的位置和直徑

如果確定了水波的直徑、創建時的(x,y)、過度動畫結束時的(x,y),我們就可以通過transition去渲染水波動畫了,創建時的(x,y)就是用戶點擊的位置,但是水波的直徑和過度動畫結束時的(x,y)怎么計算呢?我們的元素都是矩形,不論用戶從元素的任意坐標進行點擊,以矩形斜邊作為直徑的圓都可以完美的覆蓋整個元素,斜邊的計算我們利用小學數學知識求兩邊平方和進行開方得到,下面是過度動畫結束時的水波推演圖。

第一個箭頭: 期望得到的水波第二個箭頭: 元素(0,0)點創建的水波第三個箭頭: 元素(0,0)點創建的水波, 不帶圓角效果

vue實現水波漣漪效果的點擊反饋指令

我們可以發現通過元素(0,0)點創建的水波進行一定偏移就可以得到我們想要的水波,由此我們可以推斷出

動畫結束時的水波的尺寸 = 圓的斜邊創建時的(x,y) = 用戶點擊的位置過度動畫結束時的(x,y) = 元素(0,0)點創建的水波進行x和y的偏移得到

function computeRippleStyles(element, event) { const { top, left } = element.getBoundingClientRect() const { clientWidth, clientHeight } = element const radius = Math.sqrt(clientWidth ** 2 + clientHeight ** 2) / 2 const size = radius * 2 const localX = event.clientX - left const localY = event.clientY - top const centerX = (clientWidth - radius * 2) / 2 const centerY = (clientHeight - radius * 2) / 2 const x = localX - radius const y = localY - radius return { x, y, centerX, centerY, size }}鼠標按下時創建水波

然后我們需要在鼠標按下時創建水波,監聽鼠標按下的事件,這里以pc端為例子,剛創建水波時使用transform縮小到0.3,這是作者嘗試過相對合適的創建大小, 然后修改transform觸發過度水波擴散動畫,這里還加入了透明度的過度,可以使水波漣漪更有質感。

function createRipple(event) { const container = this const { x, y, centerX, centerY, size } = computeRippleStyles(container, event) const ripple = document.createElement(’div’) ripple.classList.add(’my-ripple’) ripple.style.opacity = `0` ripple.style.transform = `translate(${x}px, ${y}px) scale3d(.3, .3, .3)` ripple.style.width = `${size}px` ripple.style.height = `${size}px` // 記錄水波的創建時間 ripple.dataset.createdAt = String(performance.now()) const { position } = window.getComputedStyle(container) container.style.overflow = ’hidden’ position === ’static’ && (this.style.position = ’relative’) container.appendChild(ripple) window.setTimeout(() => { ripple.style.transform = `translate(${centerX}px, ${centerY}px) scale3d(1, 1, 1)` ripple.style.opacity = `.25` })}const VRipple = { mounted(el) { el.addEventListener(’mousedown’, createRipple) }}

vue實現水波漣漪效果的點擊反饋指令

鼠標抬起時銷毀水波

當鼠標抬起時,只需要找到這個生成的水波節點修改透明度,再等到透明度修改動畫結束之后將水波紋節點移除即可

function removeRipple() { const container = this const ripples = container.querySelectorAll(’.my-ripple’) if (!ripples.length) { return } const lastRipple = ripples[ripples.length - 1] // 通過水波的創建時間計算出擴散動畫還需要執行多久,確保每一個水波都完整的執行了擴散動畫 const delay = 300 - performance.now() + Number(lastRipple.dataset.createdAt) setTimeout(() => { lastRipple.style.opacity = `0`setTimeout(() => lastRipple.parentNode?.removeChild(lastRipple), 300) }, delay)}const VRipple = { mounted(el) { el.addEventListener(’mousedown’, createRipple) document.addEventListener(’mouseup’, removeRipple) }, unmounted(el) { el.removeEventListener(’mousedown’, createRipple) document.removeEventListener(’mouseup’, removeRipple) }}通過指令binding去擴展你的水波選項

你還可以通過binding去擴展你的指令,比如可以提供修改顏色,禁用狀態等等選項,這里就不詳細展開了。我們來看一下成果。

vue實現水波漣漪效果的點擊反饋指令

寫在最后

到此為止我們就實現了一個簡單的ripple指令,在我們的組件庫中也有這樣的指令,所以更完善的版本可以去看我們的源碼。 先要感謝一下掘金社區,已經有一部分小伙伴開始pr一些代碼到我們的倉庫中來,我們也很高興能和社區的小伙伴們去一起做這樣一件事情,另外我們的組件庫團隊一直在募集愛好者來參與貢獻,有興趣的小伙伴歡迎加入討論,加入方式就是直接去倉庫提issue留郵箱,我們會第一時間處理,有沒有興趣都希望為我們點點star,關注一下我們,社區小伙伴的支持和興趣是我們最大的動力。

倉庫地址文檔地址

以上就是vue實現水波漣漪效果的點擊反饋指令的詳細內容,更多關于vue 點擊反饋指令的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人午夜亚洲| 日韩激情网站| 国产高清精品二区| 蜜桃久久精品一区二区| 国产亚洲毛片在线| 亚洲一区二区三区高清| 久久高清免费| 成人精品亚洲| 亚洲欧美伊人| 99国产成+人+综合+亚洲欧美| 日韩午夜黄色| 亚洲精品裸体| 欧美色综合网| 久久永久免费| 日韩国产激情| 精品一区在线| 中文字幕一区二区三区四区久久| 亚洲精品在线二区| 日韩区欧美区| 国产探花一区| 在线一区av| 激情婷婷综合| 蜜臀av性久久久久蜜臀aⅴ流畅| 日韩精品亚洲专区| 欧美国产中文高清| 人人精品亚洲| 蜜臀av亚洲一区中文字幕| 国产伦乱精品| 精精国产xxxx视频在线播放 | 久久av一区| 国产丝袜一区| 欧美丰满日韩| 国产麻豆综合| 国产精品欧美日韩一区| 亚洲伦乱视频| 日韩制服丝袜av| 你懂的国产精品| 不卡一区2区| 亚欧洲精品视频在线观看| 欧美激情精品| 欧美aa一级| 日本一区二区中文字幕| 日韩成人精品一区| 日韩专区欧美专区| 黄色精品视频| 免费不卡在线观看| 精品一二三区| 蜜臀久久久久久久| 国产精品毛片久久| 香蕉久久夜色精品国产| 久久99久久人婷婷精品综合| 蜜桃国内精品久久久久软件9| 欧美日韩一区二区三区不卡视频| 精品国模一区二区三区| 日韩欧美四区| 日韩精品免费一区二区三区| 亚洲理论在线| 日韩国产一区| 综合日韩在线| 日韩不卡在线| 国产日韩精品视频一区二区三区| 国产在线观看www| 日韩专区视频网站| 国产一区二区中文| 日本免费新一区视频| 久久精品高清| 久久不见久久见免费视频7 | 国产99精品| 国产精品白浆| 欧美专区18| 国产精品亚洲一区二区三区在线观看| 日韩美女国产精品| 在线看片不卡| 国产精品一区三区在线观看| 亚洲国产一区二区在线观看| 久久久久97| 婷婷亚洲精品| 91成人精品| 97国产精品| 欧美日韩精品一区二区三区在线观看| 国产一区日韩一区| 国产精品久久久久久久久妇女| 午夜精品影视国产一区在线麻豆| 欧美二区视频| 精品成人免费一区二区在线播放| 久久99精品久久久野外观看| 亚洲精品美女| 欧美精品九九| 国产一区二区三区久久| 国产视频一区二区在线播放| 天堂成人免费av电影一区| 日韩综合精品| 精品一区二区三区中文字幕视频| 日韩福利视频导航| 亚洲天堂av资源在线观看| 欧美精品一卡| 久久久久久久久丰满| 美女视频黄免费的久久| 日本a级不卡| 亚洲精品影视| 亚洲一区国产一区| 国产精品av一区二区| 日韩免费在线| 久久免费影院| 国产精品天天看天天狠| 日韩精品成人在线观看| 亚洲午夜久久| 在线精品亚洲| 中文一区一区三区免费在线观| 日韩一区二区免费看| 五月天久久久| 99精品一区| 欧美亚洲国产精品久久| 免费看久久久| 国产精品毛片aⅴ一区二区三区| 一区二区三区四区日韩| 老司机精品久久| 午夜在线精品偷拍| 久久精品亚洲人成影院| 成人羞羞视频播放网站| 蜜臀国产一区| 日韩高清不卡| 亚洲一本视频| 免费不卡中文字幕在线| 免费精品国产| 国产模特精品视频久久久久| 久久国产精品久久久久久电车| 水野朝阳av一区二区三区| 男女激情视频一区| 日韩在线a电影| 亚洲精品一级二级三级| 91福利精品在线观看| 国产日韩欧美一区二区三区在线观看| 日韩中文一区二区| 国产日韩高清一区二区三区在线| 国产欧美一区二区精品久久久 | 久久三级中文| 高潮一区二区| 欧美~级网站不卡| 伊人久久婷婷| 日韩中文字幕| 欧美激情精品| 成人精品天堂一区二区三区| 亚洲国产成人精品女人| 9色国产精品| 亚洲精品一区二区在线播放∴| 欧美在线精品一区| 精品一区视频| 999久久久亚洲| 免费日韩视频| 97成人超碰| 欧美精品99| 性感美女一区二区在线观看| 亚洲婷婷免费| 日本亚州欧洲精品不卡| 国产精品白丝久久av网站| 欧美freesex黑人又粗又大| 亚洲一区激情| 国产欧美日韩精品高清二区综合区 | 伊人精品一区| 91久久亚洲| 日韩和欧美一区二区| 麻豆久久一区二区| 成人精品中文字幕| 日韩中文字幕91| 麻豆一区二区三| 国产精品88久久久久久| 97久久超碰| 亚洲电影有码| 亚洲精品免费观看| 国产中文字幕一区二区三区| 亚洲精品99| 国产亚洲久久| 日韩精品久久久久久久电影99爱| 免费在线观看视频一区| 久久精品国产99| 欧美精品九九| 国产精品久久久久久久久久白浆| 日本免费一区二区三区四区| 一级欧美视频| 中文在线а√天堂 | 香蕉久久国产| 韩国女主播一区二区三区| 久久不射中文字幕| 精品国产精品国产偷麻豆| 久久精品免视看国产成人| 午夜精品免费| 久久不卡日韩美女| 久久高清免费观看| 国产高潮在线| 日韩在线观看中文字幕| 久久久国产亚洲精品| 日本欧美一区二区在线观看| 电影亚洲精品噜噜在线观看| 日本不卡视频在线| 四虎成人av| 日韩在线电影| 蜜桃成人av| 精品一区二区三区中文字幕视频| 在线观看一区|