电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:3日期: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
相關文章:
主站蜘蛛池模板: 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | 昊宇水工|河北昊宇水工机械工程有限公司 | 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, | 北京企业宣传片拍摄_公司宣传片制作-广告短视频制作_北京宣传片拍摄公司 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 广西教师资格网-广西教师资格证考试网 | 乙炔气体报警装置|固定式氯化氢检测仪|河南驰诚电气百科 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 动物麻醉机-数显脑立体定位仪-北京易则佳科技有限公司 | 变色龙PPT-国内原创PPT模板交易平台 - PPT贰零 - 西安聚讯网络科技有限公司 | 壹车网 | 第一时间提供新车_资讯_报价_图片_排行! | 冷却塔减速机器_冷却塔皮带箱维修厂家_凉水塔风机电机更换-广东康明冷却塔厂家 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 海尔生物医疗四川代理商,海尔低温冰箱四川销售-成都壹科医疗器械有限公司 | 深圳成考网-深圳成人高考报名网| 选宝石船-陆地水上开采「精选」色选机械设备-青州冠诚重工机械有限公司 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 吹田功率计-长创耐压测试仪-深圳市新朗普电子科技有限公司 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 通风天窗,通风气楼,屋顶通风天窗,屋顶通风天窗公司 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 篮球地板厂家_舞台木地板品牌_体育运动地板厂家_凯洁地板 | KBX-220倾斜开关|KBW-220P/L跑偏开关|拉绳开关|DHJY-I隔爆打滑开关|溜槽堵塞开关|欠速开关|声光报警器-山东卓信有限公司 | 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 污水/卧式/潜水/钻井/矿用/大型/小型/泥浆泵,价格,参数,型号,厂家 - 安平县鼎千泵业制造厂 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 铸铝门厂家,别墅大门庭院大门,别墅铸铝门铜门[十大品牌厂家]军强门业 | 生产自动包装秤_颗粒包装秤_肥料包装秤等包装机械-郑州鑫晟重工科技有限公司 | 上海洗地机-洗地机厂家-全自动洗地机-手推式洗地机-上海滢皓洗地机 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | ph计,实验室ph计,台式ph计,实验室酸度计,台式酸度计 | 北京发电车出租-发电机租赁公司-柴油发电机厂家 - 北京明旺盛安机电设备有限公司 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛调查出轨取证公司_青岛婚外情取证-青岛探真调查事务所 | 柴油发电机组_柴油发电机_发电机组价格-江苏凯晨电力设备有限公司 | 风信子发稿-专注为企业提供全球新闻稿发布服务 | 宁夏活性炭_防护活性炭_催化剂载体炭-宁夏恒辉活性炭有限公司 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 |