Vue3使用transition組件改變DOM屬性的方式小結(jié)
想要制作基于狀態(tài)變化的過渡,使用vue內(nèi)置組件、Class、動(dòng)畫庫來快速實(shí)現(xiàn);
<Transition>會(huì)在單個(gè)元素或組件進(jìn)入和離開 DOM 時(shí)應(yīng)用動(dòng)畫;
<TransitionGroup>會(huì)在一個(gè) v-for 列表中的元素或組件被插入,移動(dòng),或移除時(shí)應(yīng)用動(dòng)畫;
下面使用Vue3的代碼對DOM的width、height屬性進(jìn)行過渡的不同實(shí)現(xiàn)方式
1、<transition> 標(biāo)簽
使用 name 屬性 來定義class 來實(shí)現(xiàn)DOM的屬性的過渡
<template>
<div>
<button @click="flag = !flag">switch</button>
<!-- 用法1 name屬性定義class-->
<transition name="fade">
<div v-if="flag" class="box">name屬性定義class</div>
</transition>
</div>
</template>
<script setup lang='ts'>
import{ref} from 'vue'
const flag = ref<boolean>(true)
</script>
<style scoped lang="scss">
.box{
width: 200px;
height: 200px;
background-color: red;
}
.fade-enter-from { // 進(jìn)入 從XX 開始
width: 0;
height: 0;
}
.fade-enter-active {
// 過程
transition: all 1.5s ease;
}
.fade-enter-to { // 進(jìn)入 到 XX 結(jié)束
width: 200px;
height: 200px;
transform: scale(1.2); // 放大1.2倍
}
.fade-leave-from { // 離開 從XX 開始
width: 200px;
height: 200px;
}
.fade-leave-active {
// 過程
transition: all 1.5s ease;
}
.fade-leave-to { // 離開 到 XX 結(jié)束
width: 0;
height: 0;
}
</style>
頁面效果:

可以通過name屬性,綁定指定name的class, 靈活定義過渡的進(jìn)入和離開時(shí)的效果;
上面方式缺點(diǎn)是class.xxx-enter-from -enter-from部分是固定的, 如果想要定義整個(gè)class名,可以使用<Transition> 另外屬性;
進(jìn)入:enter-from-class、enter-active-class、enter-to-class、
離開:leave-from-class、leave-active-class、leave-to-class
<template>
<transition
enter-from-class="dada-enter-from"
enter-active-class="dada-enter-active"
enter-to-class="dada-enter-to"
leave-from-class="dada-leave-from"
leave-active-class="dada-leave-active"
leave-to-class="dada-leave-to">
<div v-if="flag" class="box">自定義類名</div>
</transition>
</template>
...
<style scoped lang="scss">
dada-enter-from {
width: 0;
height: 0;
}
.dada-enter-active {
// 過程
transition: all 1.5s ease;
}
.dada-enter-to { // 進(jìn)入 到 XX 結(jié)束
width: 200px;
height: 200px;
transform: scale(1.2); // 放大1.2倍
}
.dada-leave-from {
width: 200px;
height: 200px;
}
.dada-leave-active {
// 過程
transition: all 1.5s ease;
}
.dada-leave-to { // 離開 到 XX 結(jié)束
width: 0;
height: 0;
}
</style>
頁面效果:同上
<transition> + 動(dòng)畫庫 animate.css
安裝: npm install animate.css --save或yarn add animate.css
<transition
:duration="1000"
enter-active-class="animate__animated animate__flipInX"
leave-active-class="animate__animated animate__fadeOutDown">
<div v-if="flag" class="box font-12">結(jié)合第三方類庫 animate.css</div>
</transition>
<script setup lang='ts'>
import 'animate.css'
</script>
屬性duration:number|{enter:number, leave:number} 是指動(dòng)畫時(shí)長;如果進(jìn)入和離開定義相同時(shí)長,值可定義number類型,如果進(jìn)入和離開定義不同時(shí)長,值可定義object類型;
注意,使用class時(shí)不要漏加特定classanimate__animated,
頁面效果:

使用第三方CSS動(dòng)畫庫,過渡效果豐富,減少自己寫CSS代碼,直接添加對應(yīng)效果的class即可;
豐富有趣的交互效果,往往只有class是不夠的,還需要通過JS代碼控制動(dòng)畫來實(shí)現(xiàn);
想要通過 Javascript來控制過渡動(dòng)畫,首先理解過渡的時(shí)機(jī),動(dòng)畫分為進(jìn)入和離開,進(jìn)入有:進(jìn)入前、進(jìn)入、進(jìn)入后,同樣離開: 離開前、離開、離開后,那么在不同時(shí)機(jī)中,觸發(fā)JavaScript 邏輯即可;
<transition> 對應(yīng)的事件:
@before-enter:進(jìn)入之前@before-leave:離開之前@enter:進(jìn)入時(shí)@leave:離開時(shí)@after-enter:進(jìn)入之后@after-leave:離開之后@enter-cancelled:進(jìn)入中斷@leave-cancelled(v-showonly):離開中斷
<template>
<transition
@before-enter="EnterFrom"
@enter="EnterActive"
@after-enter="EnterTo"
@enter-cancelled="EnterCancel"
@before-leave="LeaveFrom"
@leave="LeaveActive"
@after-leave="LeaveTo"
@leave-cancelled="LeaveCancel" >
<div v-if="flag" class="box">8個(gè) 生命周期</div>
</transition>
</template>
<script setup lang='ts'>
// 進(jìn)入
const EnterFrom = (el:Element) => {
console.log('動(dòng)畫進(jìn)入之前EnterFrom');
}
const EnterActive = (el:Element, done: gsap.Callback) => {
console.log('進(jìn)入時(shí) EnterActive');
}
const EnterTo = (el:Element) => {
console.log(el,'動(dòng)畫進(jìn)入之后 EnterTo');
}
const EnterCancel = (el:Element) => {
console.log(el,'動(dòng)畫進(jìn)過渡效果 被打斷時(shí) EnterCancel');
}
// 離開
// el DOM 節(jié)點(diǎn)
const LeaveFrom = (el:Element) => {
console.log(el, '動(dòng)畫離開之前LeaveFrom');
}
const LeaveActive = (el:Element, done:Function) => {
console.log(el,'離開時(shí) LeaveActive');
done()
}
const LeaveTo = (el:Element) => {
console.log(el,'動(dòng)畫離開之后 LeaveTo');
}
const LeaveCancel = (el:Element) => {
console.log(el,'動(dòng)畫離開過渡效果 被打斷時(shí)------');
}
</script>
過渡進(jìn)入時(shí)觸發(fā):

過渡離開時(shí)觸發(fā):

過渡中斷是什么時(shí)候出發(fā)呢,當(dāng)進(jìn)入過程中立馬切換為離開時(shí)就會(huì)觸發(fā)中斷的函數(shù)了;當(dāng)理解了出發(fā)函數(shù)鉤子的時(shí)機(jī),可以結(jié)合優(yōu)秀的動(dòng)畫庫,精準(zhǔn)的實(shí)現(xiàn)效果;
2、<transition-group> 標(biāo)簽
單節(jié)點(diǎn)動(dòng)畫可以使用<transition>,多節(jié)點(diǎn)可以使用 <transition-group>;
特點(diǎn):
- 默認(rèn)情況下 它不會(huì)渲染一個(gè)包裹元素,但是可以通過tag attribute 指定渲染一個(gè)元素,
<transition-group tag="div">或<transition tag="section">實(shí)際生成DOM標(biāo)簽div或section包一層; - 過渡模式下不可用, 因?yàn)槲覀儾辉傧嗷デ袚Q特有的元素
- 內(nèi)部元素 總是需要提供一個(gè)唯一的 key attribute值
- CSS過渡的類型將會(huì)應(yīng)用在內(nèi)部的元素中,而不是這個(gè)組/容器本身
列表的移動(dòng)過渡示例:

<template>
<!-- 列表的移動(dòng)過度示例
技術(shù)點(diǎn): <transition-group> 組件還有一個(gè)特殊之處除了進(jìn)入和離開,transition-group還可以為定位的改變添加動(dòng)畫
第三方庫: lodash npm install lodash --S 注意在ts 下 還需要安裝類型聲明文件庫 npm i --save-dev @types/lodash
-->
<div>
<button @click="random">random</button>
<transition-group move-class="move" class="wrap" tag="div">
<div class="item" v-for="item in list" :key="item.id">{{ item.number }}</div>
</transition-group>
</div>
</template>
<script setup lang='ts'>
import {ref} from 'vue'
import _ from 'lodash' // 需要安裝聲明文件 npm i -D @types/lodash
let list = ref(Array.apply(null, {length:81} as number[]).map((_, index) => {
return {
id: index,
number: (index % 9) + 1
}
}))
console.log(list, 'list');
const random = () => {
list.value = _.shuffle(list.value)
}
</script>
<style scoped lang="scss">
.wrap {
display: flex;
flex-wrap: wrap;
width: calc(25px * 9 + 9px);
.item {
width: 25px;
height: 25px;
border: 1px solid #ccc;
display: flex;
justify-self: center;
align-items: center;
}
}
.move {
transition: all 1s;
}
</style>
狀態(tài)的過渡:

<template>
<input type="number" step="20" v-model="num.current">
<div style="font-size: 30px; margin-left: 20px;">{{ num.tweenedNumber.toFixed() }}
</div>
</template>
<script setup lang='ts'>
import {reactive, watch} from 'vue'
import gsap from 'gsap'
const num = reactive({
current: 0,
tweenedNumber:0
})
watch(() => num.current, (newVal) =>{
gsap.to(num, {
duration: 1,
tweenedNumber: newVal
})
})
</script>3、總結(jié)
主要理解<Transition>、<TransitionGroup>,同時(shí)結(jié)合動(dòng)畫庫來實(shí)現(xiàn)過渡效果;
到此這篇關(guān)于Vue3使用transition組件改變DOM屬性的方式小結(jié)的文章就介紹到這了,更多相關(guān)Vue3 transition改變DOM屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue引用CSS樣式實(shí)現(xiàn)手機(jī)充電效果
這篇文章主要介紹了vue引用CSS樣式實(shí)現(xiàn)手機(jī)充電效果,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01
Vue使用v-for數(shù)據(jù)渲染順序混亂的原因及解決方案
在 Vue.js 中,使用 v-for 指令進(jìn)行數(shù)據(jù)渲染時(shí),有時(shí)會(huì)遇到渲染順序混亂的問題,這種問題主要與 Vue 的響應(yīng)式系統(tǒng)、DOM 更新機(jī)制以及數(shù)組的變更方法有關(guān),以下是對這一現(xiàn)象的深入分析及解決方案,需要的朋友可以參考下2025-01-01
element-ui中el-input只輸入數(shù)字(包括整數(shù)和小數(shù))
開發(fā)中有時(shí)候需要input只能輸入數(shù)字,下面這篇文章主要給大家介紹了關(guān)于element-ui中el-input只輸入數(shù)字(包括整數(shù)和小數(shù))的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
vue:axios請求本地json路徑錯(cuò)誤問題及解決
這篇文章主要介紹了vue:axios請求本地json路徑錯(cuò)誤問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
前端架構(gòu)vue動(dòng)態(tài)組件使用基礎(chǔ)教程
這篇文章主要為大家介紹了前端架構(gòu)vue動(dòng)態(tài)組件使用的基礎(chǔ)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-02-02
在Vue methods中調(diào)用filters里的過濾器實(shí)例
今天小編就為大家分享一篇在Vue methods中調(diào)用filters里的過濾器實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08

