十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章主要介紹了Vue中如何使用create-keyframe-animation與動(dòng)畫鉤子完成復(fù)雜動(dòng)畫,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)建站是一家專注于成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)與策劃設(shè)計(jì),民和網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:民和等地區(qū)。民和做網(wǎng)站價(jià)格咨詢:028-86922220
效果
如何實(shí)現(xiàn)這個(gè)動(dòng)畫?
效果分析
點(diǎn)`start`的時(shí)候,我們把整個(gè)動(dòng)畫拆分為兩種效果(過渡和動(dòng)畫)。
1. 中間cd消失,下方播放條顯示,這是屬于`過渡`
2. `過渡`開始的同時(shí),cd同時(shí)移動(dòng)、放大、縮小到左下方播放條 ,這屬于`動(dòng)畫`
上面的效果是【過渡】加【動(dòng)畫】同時(shí)使用完成的
對(duì)于第一種【過渡】,我們用vue中transition標(biāo)簽,加設(shè)置v-enter、v-leave-to、v-enter-active、v-leave-enter即可完成
對(duì)于第二種【動(dòng)畫】,我們就要用keyframe來完成了。
這里我們先完成第一種過渡
vue中模板節(jié)點(diǎn)
// CD圖片 (動(dòng)畫的時(shí)候圖片初始位置)![]()
// 下面播放狀態(tài)框 // 狀態(tài)看里面的圖片 (動(dòng)畫的時(shí)候圖片結(jié)束位置)![]()
結(jié)構(gòu)很簡(jiǎn)單,基本就是 兩個(gè)大div
,然后把div的布局按效果圖那些布置。
css部分(省略布局部分)
.cd-box &.v-enter-active, &.v-leave-active transition: all 0.4s &.v-enter, &.v-leave-to opacity: 0 .mini-player-box &.v-enter-active, &.v-leave-active transition: all 0.4s &.v-enter, &.v-leave-to transform: translate3d(0, 40px, 0) opacity: 0
這樣在fullScreen變量改變的時(shí)候,就會(huì)觸發(fā)【過渡】
這里我們完成第二種動(dòng)畫
首先安裝插件, npm i create-keyframe-animation
這個(gè)插件是用js寫css的keyframe動(dòng)畫用的,至于為什么keyframe不在css里面寫呢?那是因?yàn)槠聊淮笮〔灰粯樱瑫?huì)導(dǎo)致需要移動(dòng)的px不一樣,所以要?jiǎng)討B(tài)計(jì)算。
給
計(jì)算偏移量(中心點(diǎn)到中心的偏移,圖中紅線距離)
// 獲得偏移量,以及scale _getPosAndScale() { // 左下角圖片的寬度 const targetWidth = 40 // cd寬度 const width = 300 const scale = targetWidth / width // 這里的 x,y要算,過程省略,無非就是加加減減,這的x,y都是算出來了的 const x = -167.5 const y = 497 return {x ,y , scale} },
x,y的數(shù)值代表什么?見圖
這里x為什么是負(fù)的,y是正的呢?
因?yàn)?瀏覽器的坐標(biāo)系的中心點(diǎn)是在左上角
的,如圖
那么動(dòng)畫從 cd中心到左下角,X偏移為負(fù),y偏移為正
然后用animations插件執(zhí)行動(dòng)畫鉤子
// enter是指當(dāng) cd從隱藏到顯示的動(dòng)畫, enter(el, done) { const {x, y, scale} = this._getPosAndScale() let animation = { // 第0幀的時(shí)候,先讓圖片縮小,顯示在右下角 0: { transform: `translate3d(${x}px, ${y}px, 0) scale(${scale})` }, // 60%的時(shí)候,讓圖片回到cd中心,變大 60: { transform: `translate3d(0 ,0 , 0) scale(1.1)` }, // 變回原來的尺寸,會(huì)有一個(gè)回彈的效果 100: { transform: `translate3d(0 ,0 , 0) scale(1)` } } // 動(dòng)畫的一些配置 animations.registerAnimation({ name: 'move', animation, presets: { duration: 400, easing: 'linear' } }) //運(yùn)行動(dòng)畫 animations.runAnimation(this.$refs.cdWrapper, 'move', done) }, afterEnter(){ //運(yùn)行完動(dòng)畫之后,注銷掉動(dòng)畫 animations.unregisterAnimation('move') this.$refs.cdWrapper.style.animation = '' }, // leave是指 cd從顯示到隱藏的動(dòng)畫 leave(el, done) { this.$refs.cdWrapper.style.transition = 'all 0.4s' const {x, y, scale} = this._getPosAndScale() // 這里我們只要直接移動(dòng)變小就可以了 this.$refs.cdWrapper.style['transform'] = `translate3d(${x}px,${y}px,0) scale(${scale})` // 監(jiān)聽transitionend 事件在 CSS 完成過渡后觸發(fā)done回調(diào) this.$refs.cdWrapper.addEventListener('transitionend', () => { done() }) }, afterLeave() { this.$refs.cdWrapper.style.transition = '' this.$refs.cdWrapper.style['transform'] = '' }
寫到這里,我們就把剛開始的效果給寫完啦!
但在寫js的keyframe的時(shí)候
我們還可以加上rotate,讓動(dòng)畫效果有一個(gè)回彈效果
let animation = { 0: { transform: `translate3d(${x}px, ${y}px, 0) scale(${scale}) rotate(0deg)` }, 60: { transform: `translate3d(0 ,0 , 0) scale(1.1) rotate(365deg)` }, 100: { transform: `translate3d(0 ,0 , 0) scale(1) rotate(360deg)` } }
所有源碼
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Vue中如何使用create-keyframe-animation與動(dòng)畫鉤子完成復(fù)雜動(dòng)畫”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!