Vue自定義加水波紋效果指令實(shí)例代碼
前言
大家好,我是不吃魚d貓,過年以來。斷更許久,又回來了,學(xué)無止境,作為程序員知識是要不斷更新迭代的。在此期間,接觸了幾天的Vue,確實(shí)好用,今天給大家說個好玩的,在做項(xiàng)目過程中,點(diǎn)擊按鈕,大家肯定會接觸過很花的效果。接下來給大家說說水波紋效果。
自定義指令
指令的作用
言簡意賅,就是操作底層dom
當(dāng)然vue自身有非常強(qiáng)大的指令功能,代替你進(jìn)行dom操作,比如v-on綁定事件對不對,這應(yīng)該大家熟悉的指令,100%要用到,畢竟js就是個事件驅(qū)動的語言。還有大家可以去官方文檔去看看
水波紋
水波紋效果
如上圖所示,點(diǎn)擊按鈕時鼠標(biāo)四周會發(fā)散一個圓像水波一樣。
實(shí)現(xiàn)
原理
我們在點(diǎn)擊的時候,鼠標(biāo)會發(fā)散一個圓,是不是有點(diǎn)擊事件觸發(fā)了,此時我們就增加一個span標(biāo)簽,當(dāng)然要給他設(shè)置寬高,等屬性,而且我們觀察,圓的顏色是慢慢沒有的,所以還有opacity屬性,還有span是不是跟隨鼠標(biāo)移動的,所以還有添加定位屬性。
核心
注意發(fā)現(xiàn),span發(fā)散的圓是不斷變大的,所以寬高是不斷變化的,變化,我們就能想到定時器,定時器里面就可以控制圓的寬高,讓span變化的屬性不斷有規(guī)律變化,當(dāng)然要有臨界值,我們可以看看下圖
我們可以看看需求,水波紋,肯定是要覆整個按鈕的,那么span的發(fā)散半徑肯定就是按鈕中最大的距離,如圖所示,對角線肯定最長邊,一目了然。怎么求,在構(gòu)造函數(shù)Math有個方法可以求Math.sqrt(a*a+b*b)所以span的寬高是2倍的最長距離。所以臨界值找到了,達(dá)到都就清除定時器,讓span的屬性不在變化。并且刪除span。
代碼實(shí)現(xiàn)
上面我們分析了分析,接下來我們用代碼實(shí)現(xiàn)。
結(jié)構(gòu):
<div class="app"> <h1>{{title}}</h1> <button v-shuibowen="">點(diǎn)我發(fā)散水波紋</button> <!-- <div class="box" v-shuibowen=""></div> --> </div>
實(shí)例化一個vue對象。
const vm = new Vue({ data: { title: "自定義指定設(shè)置水波紋" } }).$mount(".app")
自定義指令
Vue.directive('shuibowen', { //binding 指令攜帶的變量數(shù)據(jù) inserted: function(el, binding) { el.addEventListener('click', function(e) { let x = e.clientX - el.offsetLeft let y = e.clientY - el.offsetTop //在鼠標(biāo)位置增加一個span標(biāo)簽 let span = document.createElement("span") span.style.position = "absolute" span.style.background = binding.value || 'rgba(150, 91, 91, .5)' span.style.opacity = 1; span.style.borderRadius = '50%' el.append(span) let width = 0 let height = 0 let opacity = 1 let max_length = Math.sqrt(el.offsetWidth * el.offsetWidth + el.offsetHeight * el.offsetHeight) * 2 let time = setInterval(() => { width += 5 height += 5 opacity -= 0.01 //判斷超出最大值時,清除定時,并且刪除span if (width < max_length) { span.style.width = width + 'px' span.style.height = height + 'px' span.style.opacity = opacity; span.style.left = x - span.offsetWidth / 2 + 'px' span.style.top = y - span.offsetHeight / 2 + 'px' } else { clearInterval(time) time = null; span.remove() } }, 10) }) } })
總結(jié)
剛接觸Vue,代碼沒有優(yōu)化,望見諒。自定義水波紋指令的好處就是,哪里需要用到水波紋的效果就往哪里加。
到此這篇關(guān)于Vue自定義加水波紋效果指令的文章就介紹到這了,更多相關(guān)Vue自定義水波紋指令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vuejs在解析時出現(xiàn)閃爍的原因及防止閃爍的方法
這篇文章主要介紹了vuejs在解析時出現(xiàn)閃爍的原因及防止閃爍的方法,本文介紹的非常詳細(xì),具有參考借鑒價值,感興趣的朋友一起看看吧2016-09-09Vue 設(shè)置axios請求格式為form-data的操作步驟
今天小編就為大家分享一篇Vue 設(shè)置axios請求格式為form-data的操作步驟,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10vue + vuex todolist的實(shí)現(xiàn)示例代碼
這篇文章主要介紹了vue + vuex todolist的實(shí)現(xiàn)示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03Vue3.0之引入Element-plus ui樣式的兩種方法
本文主要介紹了Vue3.0之引入Element-plus ui樣式的兩種方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02Vue實(shí)現(xiàn)輸入框回車發(fā)送和粘貼文本與圖片功能
這篇文章主要為大家詳細(xì)介紹了Vue如何實(shí)現(xiàn)聊天輸入框回車發(fā)送、粘貼文本(包括HTML)、粘貼圖片等功能,文中的實(shí)現(xiàn)方法講解詳細(xì),需要的可以參考一下2022-05-05vue原理Compile從新建實(shí)例到結(jié)束流程源碼
這篇文章主要為大家介紹了vue原理Compile從新建實(shí)例到結(jié)束流程源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07el-table-column 內(nèi)容不自動換行的解決方法
本文主要介紹了el-table-column 內(nèi)容不自動換行的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Vue.js+Layer表格數(shù)據(jù)綁定與實(shí)現(xiàn)更新的實(shí)例
下面小編就為大家分享一篇Vue.js+Layer表格數(shù)據(jù)綁定與實(shí)現(xiàn)更新的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03