最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3使用transition組件改變DOM屬性的方式小結(jié)

 更新時(shí)間:2024年01月02日 16:33:09   作者:超捻  
這篇文章主要為大家詳細(xì)介紹了Vue3中使用transition組件改變DOM屬性的常用方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

想要制作基于狀態(tài)變化的過(guò)渡,使用vue內(nèi)置組件、Class、動(dòng)畫庫(kù)來(lái)快速實(shí)現(xiàn);

<Transition>會(huì)在單個(gè)元素或組件進(jìn)入和離開(kāi) DOM 時(shí)應(yīng)用動(dòng)畫;

<TransitionGroup>會(huì)在一個(gè) v-for 列表中的元素或組件被插入,移動(dòng),或移除時(shí)應(yīng)用動(dòng)畫;

下面使用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-classenter-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">自定義類名</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)畫庫(kù)  animate.css

安裝: npm install animate.css --saveyarn 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é)合第三方類庫(kù) animate.css</div> 
</transition>
      
<script setup lang='ts'>
import 'animate.css'
</script>

屬性duration:number|{enter:number, leave:number} 是指動(dòng)畫時(shí)長(zhǎng);如果進(jìn)入離開(kāi)定義相同時(shí)長(zhǎng),值可定義number類型,如果進(jìn)入離開(kāi)定義不同時(shí)長(zhǎng),值可定義object類型;

注意,使用class時(shí)不要漏加特定classanimate__animated

頁(yè)面效果:

使用第三方CSS動(dòng)畫庫(kù),過(guò)渡效果豐富,減少自己寫CSS代碼,直接添加對(duì)應(yīng)效果的class即可;

豐富有趣的交互效果,往往只有class是不夠的,還需要通過(guò)JS代碼控制動(dòng)畫來(lái)實(shí)現(xiàn);

想要通過(guò) Javascript來(lái)控制過(guò)渡動(dòng)畫,首先理解過(guò)渡的時(shí)機(jī),動(dòng)畫分為進(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)畫進(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)過(guò)渡效果 被打斷時(shí) EnterCancel');
    }
    
    // 離開(kāi)
    // el DOM 節(jié)點(diǎn)
    const LeaveFrom = (el:Element) => {
        console.log(el, '動(dòng)畫離開(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)畫離開(kāi)之后 LeaveTo');
    }
    const LeaveCancel = (el:Element) => {
        console.log(el,'動(dòng)畫離開(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)畫庫(kù),精準(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è)包裹元素,但是可以通過(guò)tag attribute 指定渲染一個(gè)元素, <transition-group tag="div"><transition tag="section"> 實(shí)際生成DOM標(biāo)簽divsection 包一層;
  • 過(guò)渡模式下不可用, 因?yàn)槲覀儾辉傧嗷デ袚Q特有的元素
  • 內(nèi)部元素 總是需要提供一個(gè)唯一的 key attribute值
  • CSS過(guò)渡的類型將會(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)畫
         第三方庫(kù): lodash  npm install lodash --S  注意在ts 下 還需要安裝類型聲明文件庫(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)畫庫(kù)來(lái)實(shí)現(xiàn)過(guò)渡效果;

到此這篇關(guān)于Vue3使用transition組件改變DOM屬性的方式小結(jié)的文章就介紹到這了,更多相關(guān)Vue3 transition改變DOM屬性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • ElementUI?select彈窗在特定場(chǎng)合錯(cuò)位問(wèn)題解決方案

    ElementUI?select彈窗在特定場(chǎng)合錯(cuò)位問(wèn)題解決方案

    這篇文章主要介紹了ElementUI?select彈窗在特定場(chǎng)合錯(cuò)位問(wèn)題解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • vxe-table中vxe-grid的使用解讀

    vxe-table中vxe-grid的使用解讀

    這篇文章主要介紹了vxe-table中vxe-grid的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • uniapp頁(yè)面完成水印添加功能代碼示例(自定義文字)

    uniapp頁(yè)面完成水印添加功能代碼示例(自定義文字)

    這篇文章主要介紹了uniapp頁(yè)面完成水印添加功能(自定義文字)的相關(guān)資料,包括如何編寫頁(yè)面代碼、數(shù)據(jù)代碼以及如何展示效果圖,通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • 如何在Vue單頁(yè)面中進(jìn)行業(yè)務(wù)數(shù)據(jù)的上報(bào)

    如何在Vue單頁(yè)面中進(jìn)行業(yè)務(wù)數(shù)據(jù)的上報(bào)

    為什么要在標(biāo)題里加上一個(gè)業(yè)務(wù)數(shù)據(jù)的上報(bào)呢,因?yàn)樵谠蹅兦岸隧?xiàng)目中,可上報(bào)的數(shù)據(jù)維度太多,比如還有性能數(shù)據(jù)、頁(yè)面錯(cuò)誤數(shù)據(jù)、console捕獲等。這里我們只講解業(yè)務(wù)數(shù)據(jù)的埋點(diǎn)。
    2021-05-05
  • vue中bus的使用及踩坑解決

    vue中bus的使用及踩坑解決

    這篇文章主要為大家詳細(xì)介紹了vue中bus的相關(guān)使用以及涉及到的問(wèn)題與解決,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-08-08
  • vxetable的高亮行不顯示的問(wèn)題及解決

    vxetable的高亮行不顯示的問(wèn)題及解決

    這篇文章主要介紹了vxetable的高亮行不顯示的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Vue 自定義ColorPicker及使用方法

    Vue 自定義ColorPicker及使用方法

    這篇文章主要介紹了Vue 自定義ColorPicker及使用方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • vue編譯器util工具使用方法示例

    vue編譯器util工具使用方法示例

    這篇文章主要為大家介紹了vue編譯器util工具使用方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Vue使用vue-simple-uploader上傳文件夾實(shí)現(xiàn)方式

    Vue使用vue-simple-uploader上傳文件夾實(shí)現(xiàn)方式

    本文介紹使用vue-simple-uploader上傳文件夾的流程:前端點(diǎn)擊按鈕選擇文件夾,確認(rèn)上傳并顯示進(jìn)度;后端SpringBoot接收文件夾數(shù)據(jù),完成傳輸與處理
    2025-09-09
  • Vue在外部配置打包文件夾名稱和url地址前綴

    Vue在外部配置打包文件夾名稱和url地址前綴

    本文主要介紹了Vue在外部配置打包文件夾名稱和url地址前綴,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評(píng)論

永福县| 隆德县| 德州市| 祥云县| 顺义区| 银川市| 韩城市| 金乡县| 囊谦县| 北川| 开原市| 育儿| 郯城县| 凤庆县| 星子县| 沈阳市| 元朗区| 林甸县| 措美县| 凌海市| 汤阴县| 石泉县| 安国市| 隆昌县| 宣武区| 乌兰县| 昌黎县| 逊克县| 福州市| 都昌县| 建宁县| 嘉善县| 五大连池市| 宁明县| 明星| 府谷县| 城市| 色达县| 无棣县| 广州市| 扬中市|