vue 組件中使用 transition 和 transition-group實(shí)現(xiàn)過(guò)渡動(dòng)畫
前言
記一次vue 組件中使用 transition 和 transition-group 設(shè)置過(guò)渡動(dòng)畫,總結(jié)來(lái)說(shuō)可分為分為 name 版, js 鉤子操作類名版, js 鉤子操作行內(nèi)樣式版...
template模板結(jié)構(gòu)
// 單個(gè)元素 <transition name="自定義名字"> <p v-if="show">hello</p> </transition> // 列表元素: 注意group的直接子元素是v-for渲染出來(lái)的 <ul class="list"> <transition-group name="list"> <li v-for="(item, index) in gameList" :key="item.id"> <app-horizontal :itemData="item"></app-horizontal> </li> </transition-group> </ul>
name 版,name 為組件中的屬性
出現(xiàn)的過(guò)程: name-enter(初始態(tài)) => name-enter-active(中間態(tài)) => name-enter-to(終止態(tài))
消失的過(guò)程: name-leave => name-leave-active => name-leave-to
以進(jìn)場(chǎng)過(guò)渡動(dòng)畫為例子
我們可以分別設(shè)置 enter 階段 和 enter-to 階段的動(dòng)畫
1.設(shè)置進(jìn)入時(shí)需要過(guò)渡的屬性
.name-enter { opacity: 0; transform: translateY(30px) }
2.然后在 name-enter-active中設(shè)置過(guò)渡時(shí)間
.name-enter-active { transition: all .3s; }
3.最后在 name-enter-to 中寫上終止態(tài)屬性
其實(shí)終止態(tài)的opacity: 1;transform: none; 是默認(rèn)的,可以不用寫
.name-enter-to { opacity: 1; transform: translateY(0); }
如果要給列表中的元素設(shè)置交錯(cuò)的效果, 元素不多的話可以添加 delay 屬性
.name-enter-active:nth-child(3n+1) { transition-delay: 0s; } .name-enter-active:nth-child(3n+2) { transition-delay: .1s; } .name-enter-active:nth-child(3n+3) { transition-delay: .2s; }
離場(chǎng)動(dòng)畫同理...
js 鉤子實(shí)現(xiàn)過(guò)渡動(dòng)畫: 通過(guò)操作類名; 就是 name 版的 js 實(shí)現(xiàn)
// 例如實(shí)現(xiàn)上述列表依次顯示 <ul class="list"> <transition-group v-bind:css="false" v-on:before-enter="beforeEnter" v-on:enter="enter" v-on:after-enter="afterEnter"> <li v-for="(item, index) in gameList" :key="item.id" :data-delay="index*100" > <app-horizontal :itemData="item"></app-horizontal> </li> </transition-group> </ul> // methods: { // 事先定義上述類名 // 在beforeEnter enter afterEnter 鉤子中手動(dòng)操作上述類名 // 初始態(tài) beforeEnter(dom) { dom.classList.add('list-enter', 'list-enter-active'); }, // 中間態(tài) enter(dom,done) { // 通過(guò) setTimeout + dataset 實(shí)現(xiàn)過(guò)渡 let delay = dom.dataset.delay; setTimeout(function () { dom.classList.remove('list-enter'); dom.classList.add('list-enter-to'); //監(jiān)聽(tīng) transitionend 事件 var transitionend = window.ontransitionend ? "transitionend" : "webkitTransitionEnd"; dom.addEventListener(transitionend, function onEnd() { // 移除事件 dom.removeEventListener(transitionend, onEnd); //調(diào)用done(),表示動(dòng)畫已完成 done() }); }, delay) }, // 終止態(tài) afterEnter(dom) { dom.classList.remove('list-enter-to', 'list-enter-active'); } }
js 鉤子過(guò)渡動(dòng)畫: 通過(guò)操作行內(nèi)屬性, 自定義動(dòng)畫
<ul class="list"> <transition-group v-bind:css="false" v-on:before-enter="beforeEnter" v-on:enter="enter" v-on:after-enter="afterEnter"> <li v-for="(item, index) in gameList" :key="item.id" :data-delay="index*100" data-y = "100%" > <app-horizontal :itemData="item"></app-horizontal> </li> </transition-group> </ul> // 對(duì)應(yīng)的操作方法; 添加自定義的 dataset,給dom設(shè)置css樣式;根據(jù)需求添加 methods: { // 初始態(tài) beforeEnter(dom) { let { x = 0, y = 0, opacity = 0 } = dom.dataset; dom.style.cssText = `transition: .3s;opacity: ${opacity};transform: translateX(${x}) translateY(${y});`; }, // 中間態(tài) enter(dom,done) { let delay = dom.dataset.delay; setTimeout(function () { dom.style.cssText = `transition: .3s;opacity: 1;transform: translateX(0) translateY(0);`; //監(jiān)聽(tīng) transitionend 事件 var transitionend = window.ontransitionend ? "transitionend" : "webkitTransitionEnd"; dom.addEventListener(transitionend, function onEnd() { dom.removeEventListener(transitionend, onEnd); done(); }); }, delay) }, // 終止態(tài) afterEnter(dom) { dom.style.cssText = ""; } }
這里記錄一下監(jiān)聽(tīng)css3的animation動(dòng)畫和transition事件:
webkit-animation動(dòng)畫有三個(gè)事件: 開(kāi)始事件: webkitAnimationStart 結(jié)束事件: webkitAnimationEnd 重復(fù)運(yùn)動(dòng)事件: webkitAnimationIteration css3的過(guò)渡屬性transition: 一個(gè)事件 過(guò)渡結(jié)束: webkitTransitionEnd
總結(jié)
以上所述是小編給大家介紹的vue 組件中使用 transition 和 transition-group實(shí)現(xiàn)過(guò)渡動(dòng)畫 ,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Vue-Access-Control 前端用戶權(quán)限控制解決方案
Vue-Access-Control是一套基于Vue/Vue-Router/axios 實(shí)現(xiàn)的前端用戶權(quán)限控制解決方案。這篇文章主要介紹了Vue-Access-Control:前端用戶權(quán)限控制解決方案,需要的朋友可以參考下2017-12-12vue長(zhǎng)按事件和點(diǎn)擊事件沖突的解決
這篇文章主要介紹了vue長(zhǎng)按事件和點(diǎn)擊事件沖突的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10vue與bootstrap實(shí)現(xiàn)時(shí)間選擇器的示例代碼
本篇文章主要介紹了vue與bootstrap實(shí)現(xiàn)時(shí)間選擇器的示例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08在vue中利用全局路由鉤子給url統(tǒng)一添加公共參數(shù)的例子
今天小編就為大家分享一篇在vue中利用全局路由鉤子給url統(tǒng)一添加公共參數(shù)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11vue實(shí)現(xiàn)登錄注冊(cè)模板的示例代碼
這篇文章主要介紹了vue實(shí)現(xiàn)登錄注冊(cè)模板的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Vue中搭配Bootstrap實(shí)現(xiàn)Vue的列表增刪功能
日常開(kāi)發(fā)中,我們可以用?“拿來(lái)主義”?借助Bootstarp現(xiàn)成的一些樣式,快速生成我們想要的頁(yè)面布局,避免書寫大量的HTML和CSS代碼,省下了許多不必要的時(shí)間,可以直接搭配vue使用2022-11-11vue、react等單頁(yè)面項(xiàng)目應(yīng)該這樣子部署到服務(wù)器
這篇文章主要介紹了vue、react等單頁(yè)面項(xiàng)目應(yīng)該這樣子部署到服務(wù)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01