Vue3使用transition組件改變DOM屬性的方式小結(jié)
想要制作基于狀態(tài)變化的過(guò)渡,使用vue內(nèi)置組件、Class、動(dòng)畫(huà)庫(kù)來(lái)快速實(shí)現(xiàn);
<Transition>會(huì)在單個(gè)元素或組件進(jìn)入和離開(kāi) DOM 時(shí)應(yīng)用動(dòng)畫(huà);
<TransitionGroup>會(huì)在一個(gè) v-for 列表中的元素或組件被插入,移動(dòng),或移除時(shí)應(yīng)用動(dòng)畫(huà);
下面使用Vue3的代碼對(duì)DOM的width、height屬性進(jìn)行過(guò)渡的不同實(shí)現(xiàn)方式
1、<transition> 標(biāo)簽
使用 name
屬性 來(lái)定義class 來(lái)實(shí)現(xiàn)DOM的屬性的過(guò)渡
<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 開(kāi)始 width: 0; height: 0; } .fade-enter-active { // 過(guò)程 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 { // 離開(kāi) 從XX 開(kāi)始 width: 200px; height: 200px; } .fade-leave-active { // 過(guò)程 transition: all 1.5s ease; } .fade-leave-to { // 離開(kāi) 到 XX 結(jié)束 width: 0; height: 0; } </style>
頁(yè)面效果:
可以通過(guò)name屬性,綁定指定name的class, 靈活定義過(guò)渡的進(jìn)入
和離開(kāi)
時(shí)的效果;
上面方式缺點(diǎn)是class.xxx-enter-from
-enter-from
部分是固定的, 如果想要定義整個(gè)class名,可以使用<Transition>
另外屬性;
進(jìn)入:enter-from-class
、enter-active-class
、enter-to-class
、
離開(kāi):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">自定義類(lèi)名</div> </transition> </template> ... <style scoped lang="scss"> dada-enter-from { width: 0; height: 0; } .dada-enter-active { // 過(guò)程 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 { // 過(guò)程 transition: all 1.5s ease; } .dada-leave-to { // 離開(kāi) 到 XX 結(jié)束 width: 0; height: 0; } </style>
頁(yè)面效果:同上
<transition> + 動(dòng)畫(huà)庫(kù) 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é)合第三方類(lèi)庫(kù) animate.css</div> </transition> <script setup lang='ts'> import 'animate.css' </script>
屬性duration:number|{enter:number, leave:number}
是指動(dòng)畫(huà)時(shí)長(zhǎng);如果進(jìn)入
和離開(kāi)
定義相同時(shí)長(zhǎng),值可定義number類(lèi)型,如果進(jìn)入
和離開(kāi)
定義不同時(shí)長(zhǎng),值可定義object類(lèi)型;
注意,使用class時(shí)不要漏加特定classanimate__animated
,
頁(yè)面效果:
使用第三方CSS動(dòng)畫(huà)庫(kù),過(guò)渡效果豐富,減少自己寫(xiě)CSS代碼,直接添加對(duì)應(yīng)效果的class即可;
豐富有趣的交互效果,往往只有class是不夠的,還需要通過(guò)JS代碼控制動(dòng)畫(huà)來(lái)實(shí)現(xiàn);
想要通過(guò) Javascript來(lái)控制過(guò)渡動(dòng)畫(huà),首先理解過(guò)渡的時(shí)機(jī),動(dòng)畫(huà)分為進(jìn)入和離開(kāi),進(jìn)入有:進(jìn)入前、進(jìn)入、進(jìn)入后,同樣離開(kāi): 離開(kāi)前、離開(kāi)、離開(kāi)后,那么在不同時(shí)機(jī)中,觸發(fā)JavaScript 邏輯即可;
<transition>
對(duì)應(yīng)的事件:
@before-enter
:進(jìn)入之前@before-leave
:離開(kāi)之前@enter
:進(jìn)入時(shí)@leave
:離開(kāi)時(shí)@after-enter
:進(jìn)入之后@after-leave
:離開(kāi)之后@enter-cancelled
:進(jìn)入中斷@leave-cancelled
(v-show
only):離開(kāi)中斷
<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)畫(huà)進(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)畫(huà)進(jìn)入之后 EnterTo'); } const EnterCancel = (el:Element) => { console.log(el,'動(dòng)畫(huà)進(jìn)過(guò)渡效果 被打斷時(shí) EnterCancel'); } // 離開(kāi) // el DOM 節(jié)點(diǎn) const LeaveFrom = (el:Element) => { console.log(el, '動(dòng)畫(huà)離開(kāi)之前LeaveFrom'); } const LeaveActive = (el:Element, done:Function) => { console.log(el,'離開(kāi)時(shí) LeaveActive'); done() } const LeaveTo = (el:Element) => { console.log(el,'動(dòng)畫(huà)離開(kāi)之后 LeaveTo'); } const LeaveCancel = (el:Element) => { console.log(el,'動(dòng)畫(huà)離開(kāi)過(guò)渡效果 被打斷時(shí)------'); } </script>
過(guò)渡進(jìn)入時(shí)觸發(fā):
過(guò)渡離開(kāi)時(shí)觸發(fā):
過(guò)渡中斷是什么時(shí)候出發(fā)呢,當(dāng)進(jìn)入過(guò)程中立馬切換為離開(kāi)時(shí)就會(huì)觸發(fā)中斷的函數(shù)了;當(dāng)理解了出發(fā)函數(shù)鉤子的時(shí)機(jī),可以結(jié)合優(yōu)秀的動(dòng)畫(huà)庫(kù),精準(zhǔn)的實(shí)現(xiàn)效果;
2、<transition-group> 標(biāo)簽
單節(jié)點(diǎn)動(dòng)畫(huà)可以使用<transition>
,多節(jié)點(diǎn)可以使用 <transition-group>
;
特點(diǎn):
- 默認(rèn)情況下 它不會(huì)渲染一個(gè)包裹元素,但是可以通過(guò)tag attribute 指定渲染一個(gè)元素,
<transition-group tag="div">
或<transition tag="section">
實(shí)際生成DOM標(biāo)簽div
或section
包一層; - 過(guò)渡模式下不可用, 因?yàn)槲覀儾辉傧嗷デ袚Q特有的元素
- 內(nèi)部元素 總是需要提供一個(gè)唯一的 key attribute值
- CSS過(guò)渡的類(lèi)型將會(huì)應(yīng)用在內(nèi)部的元素中,而不是這個(gè)組/容器本身
列表的移動(dòng)過(guò)渡示例:
<template> <!-- 列表的移動(dòng)過(guò)度示例 技術(shù)點(diǎn): <transition-group> 組件還有一個(gè)特殊之處除了進(jìn)入和離開(kāi),transition-group還可以為定位的改變添加動(dòng)畫(huà) 第三方庫(kù): lodash npm install lodash --S 注意在ts 下 還需要安裝類(lèi)型聲明文件庫(kù) 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)的過(guò)渡:
<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)畫(huà)庫(kù)來(lái)實(shí)現(xiàn)過(guò)渡效果;
到此這篇關(guān)于Vue3使用transition組件改變DOM屬性的方式小結(jié)的文章就介紹到這了,更多相關(guān)Vue3 transition改變DOM屬性?xún)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue引用CSS樣式實(shí)現(xiàn)手機(jī)充電效果
這篇文章主要介紹了vue引用CSS樣式實(shí)現(xiàn)手機(jī)充電效果,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01Vue使用v-for數(shù)據(jù)渲染順序混亂的原因及解決方案
在 Vue.js 中,使用 v-for 指令進(jìn)行數(shù)據(jù)渲染時(shí),有時(shí)會(huì)遇到渲染順序混亂的問(wèn)題,這種問(wèn)題主要與 Vue 的響應(yīng)式系統(tǒng)、DOM 更新機(jī)制以及數(shù)組的變更方法有關(guān),以下是對(duì)這一現(xiàn)象的深入分析及解決方案,需要的朋友可以參考下2025-01-01element-ui中el-input只輸入數(shù)字(包括整數(shù)和小數(shù))
開(kāi)發(fā)中有時(shí)候需要input只能輸入數(shù)字,下面這篇文章主要給大家介紹了關(guān)于element-ui中el-input只輸入數(shù)字(包括整數(shù)和小數(shù))的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09vue:axios請(qǐng)求本地json路徑錯(cuò)誤問(wèn)題及解決
這篇文章主要介紹了vue:axios請(qǐng)求本地json路徑錯(cuò)誤問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(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.js的移動(dòng)組件庫(kù)cube-ui
這篇文章主要介紹了基于Vue.js的移動(dòng)組件庫(kù)cube-ui,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12在Vue methods中調(diào)用filters里的過(guò)濾器實(shí)例
今天小編就為大家分享一篇在Vue methods中調(diào)用filters里的過(guò)濾器實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08