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

Vue中實現(xiàn)過渡動畫效果示例代碼

 更新時間:2022年08月11日 11:45:40   作者:林有酒  
這篇文章主要介紹了Vue中實現(xiàn)過渡動畫效果示例代碼,Vue中為我們提供一些內置組件和對應的API來完成動畫,利用它們我們可以方便的實現(xiàn)過渡動畫效果,需要的朋友可以參考下

Vue的transition動畫

Transition動畫的使用

在開發(fā)中,我們想要給一個組件的顯示和消失添加某種過渡動畫,可以很好的增加用戶體驗

React框架本身并沒有提供任何動畫相關的API,所以在React中使用過渡動畫我們需要使用一個第三方庫 react-transition-group;

Vue中為我們提供一些內置組件和對應的API來完成動畫,利用它們我們可以方便的實現(xiàn)過渡動畫效果;

我們來看一個案例

Hello World的顯示和隱藏;

通過下面的代碼實現(xiàn),顯式和隱藏Hello World是不會有任何動畫效果的;

<template>
  <div class="app">
    <button @click="btnClick">Toogle</button>
    <h2 v-show="isShow">Hello World</h2>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const isShow = ref(true)
const btnClick = () => {
  isShow.value = !isShow.value
}
</script>

沒有動畫的情況下,整個內容的顯示和隱藏會非常的生硬

如果我們希望給單元素或者組件實現(xiàn)過渡動畫,可以使用Vue提供的 transition 內置組件來完成動畫;

Vue 提供了 transition 的封裝組件,在下列情形中,可以給任何元素和組件添加進入/離開過渡

條件渲染 (使用 v-if)條件展示 (使用 v-show)

動態(tài)組件

組件根節(jié)點

例如我們給剛剛的Hello World添加動畫, 首先定義類(類的名字暫時是固定的)

/* 從什么狀態(tài)進入 */
.v-enter-from {
  opacity: 0;
}

/* 進入之后打算變成的狀態(tài) */
.v-enter-to {
  opacity: 1;
}

/* 進入的過程中做什么 */
.v-enter-active {
  transition: opacity 2s linear;
}

定義好類之后, 我們可以使用Vue的內置組件 transition 將動畫元素包裹起來, transition 組件會自動在合適的時機, 將合適的類添加到它所包裹的元素上

<template>
  <div class="app">
    <button @click="btnClick">Toogle</button>
    <!-- 使用內置組件包裹h2 -->
    <transition>
      <h2 v-show="isShow">Hello World</h2>
    </transition>
  </div>
</template>

此時顯式Hello World 就已經(jīng)有動畫效果了, 但是隱藏時并沒有效果, 是因為我們剛剛定義的類是進入的類, 當離開時我們也應該定義對應的類

/* 離開后的狀態(tài) */
.v-leave-to,
/* 從什么狀態(tài)進入 */
.v-enter-from {
  opacity: 0;
}

/* 開始離開的狀態(tài) */
.v-leave-from,
/* 進入之后打算變成的狀態(tài) */
.v-enter-to {
  opacity: 1;
}

/* 離開過程中做什么 */
.v-leave-active,
/* 進入的過程中做什么 */
.v-enter-active {
  transition: opacity 1s linear;
}

Transition組件的原理

我們會發(fā)現(xiàn),上面演示代碼中Vue自動給h2元素添加了動畫,這是什么原因呢?

當插入或刪除包含在 transition 組件中的元素時, Vue 將會做以下處理

1.自動嗅探目標元素是否應用了CSS過渡或者動畫,如果有,那么在恰當?shù)臅r機添加/刪除 CSS類名;

2.如果 transition 組件提供了JavaScript鉤子函數(shù),這些鉤子函數(shù)將在恰當?shù)臅r機被調用;

3.如果沒有找到JavaScript鉤子并且也沒有檢測到CSS過渡/動畫, DOM插入、刪除操作將會立即執(zhí)行;

在上面我們簡單使用了Vue會自動添加/刪除的CSS類名, 接下來我們詳細學習一下都有哪些類吧

Transition動畫的class

我們會發(fā)現(xiàn)上面提到了很多個class,事實上Vue就是幫助我們在這些class之間來回切換完成的動畫

v-enter-from:定義進入過渡的開始狀態(tài)。

在元素被插入之前生效,在元素被插入之后的下一幀移除。

v-enter-active:定義進入過渡生效時的狀態(tài)。

在整個進入過渡的階段中應用,在元素被插入之前生效,在過渡/動畫完成之后移除。這個類可以被用來定義進入過渡的過程時間,延遲和曲線 函數(shù)。

v-enter-to:定義進入過渡的結束狀態(tài)

在元素被插入之后下一幀生效 (與此同時 v-enter-from 被移除),在過渡/動畫完成之后移除。

v-leave-from:定義離開過渡的開始狀態(tài)。

在離開過渡被觸發(fā)時立刻生效,下一幀被移除。

v-leave-active:定義離開過渡生效時的狀態(tài)。

在整個離開過渡的階段中應用,在離開過渡被觸發(fā)時立刻生效,在過渡/動畫完成之后移除。這個類可以被用來定義離開過渡的過程時間,延遲 和曲線函數(shù)。

v-leave-to:離開過渡的結束狀態(tài)。

在離開過渡被觸發(fā)之后下一幀生效 (與此同時 v-leave-from 被刪除),在過渡/動畫完成之后移除。

在這里插入圖片描述

class的name命名規(guī)則如下

如果我們使用的是一個沒有name屬性的transition,那么所有的class是以 v- 作為默認前綴;

如果我們添加了一個name屬性,比如<transtion name= “abc” >,那么所有的class會以 abc- 開頭;

Vue的animation動畫

Animation動畫的使用

例如有一段文本, 我們對文本的顯式隱藏添加上一些動畫

先定義類, 用于實現(xiàn)動畫

/* 定義進入的動畫 */
.v-enter-active {
  animation: myAnim 2s linear;
}

/* 定義離開的動畫 */
.v-leave-active {
  animation: myAnim 2s linear reverse;
}

/* 定義序列幀動畫 */
@keyframes myAnim {
  0% {
    transform: scale(0);
    opacity: 0;
  }

  50% {
    transform: scale(1.25);
    opacity: 0.5;
  }

  100% {
    transform: scale(1);
    opacity: 1;
  }
}

同transition動畫, 使用transition組件包裹

<template>
  <div class="app">
    <button @click="btnClick">Toogle</button>
    <!-- 使用內置組件包裹h2 -->
    <transition>
      <h2 v-show="isShow">
        今天2022年8月6日星期六,利好消息來襲!因為經(jīng)濟數(shù)據(jù)仍顯疲軟,
        市場對全球經(jīng)濟增速放緩可能抑制需求的擔憂加劇,導致成品油調價
        掛靠的國際油價繼續(xù)下挫,同時綜合原油品種變化率也已經(jīng)完成正值
        到負值的轉變。數(shù)據(jù)顯示:截至國內成品油調價周期的第8個工作日
        結束,原油綜合變化率為-0.83%,詳細成品油調價窗口開啟時間定在
        8月9日24時開啟。
      </h2>
    </transition>
  </div>
</template>

同時設置兩種動畫(了解)

Vue為了知道過渡的完成,內部是在監(jiān)聽 transitionend 或 animationend,到底使用哪一個取決于元素應用的CSS規(guī)則

如果我們只是使用了其中的一個,那么Vue能自動識別類型并設置監(jiān)聽;

但是如果我們同時使用了transition動畫和animation動畫呢?

在開發(fā)中, 如果設置了兩個動畫, 盡量要保持兩個動畫的時間一致;

/* 定義transition動畫 */
.v-enter-from,
.v-leave-to {
  opacity: 0;
}

.v-enter-to,
.v-leave-from {
  opacity: 1;
}


.v-enter-active {
  /* 設置兩個不同的動畫, 最好保持動畫時間一致 */
  animation: myAnim 2s linear;
  transition: opacity 2s linear;
}

.v-leave-active {
  /* 設置兩個不同的動畫, 最好保持動畫時間一致 */
  animation: myAnim 2s linear reverse;
  transition: opacity 2s linear;
}

/* 定義序列幀動畫 */
@keyframes myAnim {
  0% {
    transform: scale(0);
    opacity: 0;
  }

  50% {
    transform: scale(1.25);
    opacity: 0.5;
  }

  100% {
    transform: scale(1);
    opacity: 1;
  }
}

如果使用兩個動畫, 動畫的時間又不一致, 并且在這個情況下可能某一個動畫執(zhí)行結束時,另外一個動畫還沒有結

在這種情況下,我們可以設置 type 屬性為 animation 或者 transition 來明確的告知Vue監(jiān)聽的類型, 以哪一個動畫為標準(一般不設置);

<!-- 告知以哪一個動畫為標準 -->
<transition type="transition">
  <h2 v-show="isShow">
    今天2022年8月6日星期六,利好消息來襲!因為經(jīng)濟數(shù)據(jù)仍顯疲軟,
    市場對全球經(jīng)濟增速放緩可能抑制需求的擔憂加劇,導致成品油調價
    掛靠的國際油價繼續(xù)下挫,同時綜合原油品種變化率也已經(jīng)完成正值
    到負值的轉變。數(shù)據(jù)顯示:截至國內成品油調價周期的第8個工作日
    結束,原油綜合變化率為-0.83%,詳細成品油調價窗口開啟時間定在
    8月9日24時開啟。
  </h2>
</transition>

過渡的模式mode

我們來看當前的動畫在兩個元素之間顯式隱藏切換的時候添加動畫存在的問題

在這里插入圖片描述

我們會發(fā)現(xiàn) Hello World 和 你好啊,李銀河是同時存在的

這是因為默認情況下進入和離開動畫是同時發(fā)生的;

如果確實我們希望達到這個的效果,那么是沒有問題;

但是如果我們不希望同時執(zhí)行進入和離開動畫,那么我們需要設置transition的過渡模式

in-out: 新元素先進行過渡,完成之后當前元素過渡離開;

out-in: 當前元素先進行過渡,完成之后新元素過渡進入;

<transition mode="in-out">
  <h2>Hello Worl</h2>
  <h2>你好啊, 李銀河</h2>
</transition>

上面的示例同樣適用于我們的動態(tài)組件

<div class="app">
  <div>
    <button @click="isShow = !isShow">切換</button>
  </div>

  <transition name="why" mode="out-in">
    <component :is=" isShow ? 'home': 'about'"></component>
  </transition>
</div>

默認情況下,首次渲染的時候是沒有動畫的,如果我們希望給他添加上去動畫,那么就可以增加另外一個屬性appear

<div class="app">
  <div>
    <button @click="isShow = !isShow">切換</button>
  </div>

  <transition name="why" mode="out-in" appear="">
    <component :is=" isShow ? 'home': 'about'"></component>
  </transition>
</div>

列表過渡

列表過渡的介紹

目前為止,過渡動畫我們只要是針對單個元素或者組件的

要么是單個節(jié)點;

要么是同一時間渲染多個節(jié)點中的一個;

那么如果希望渲染的是一個列表,并且該列表中添加刪除數(shù)據(jù)也希望有動畫執(zhí)行呢?

這個時候我們要使用<transition-group>組件來完成;

使用<transition-group>有如下的特點

默認情況下,它不會渲染成任何一個元素,但是你可以指定一個元素并以 tag attribute 讓他進行渲染;

過渡模式不可用,因為我們不再相互切換特有的元素;

內部元素總是需要提供唯一的 key attribute 值;

CSS 過渡的類將會應用在內部的元素中,而不是這個組/容器本身;

列表過渡的使用

我們來做一個案例

案例是一列數(shù)字,可以繼續(xù)添加或者刪除數(shù)字;

在添加和刪除數(shù)字的過程中,對添加的或者移除的數(shù)字添加動畫;

示例代碼如下

<template>
  <div class="app">
    <button @click="addNumber">添加數(shù)字</button>
    <button @click="removeNumber">刪除數(shù)字</button>
    
    <template v-for="item in nums" :key="item">
      <span>{{ item }}</span>
    </template>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const nums = ref([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

const addNumber = () => {
  nums.value.splice(randomIndex(), 0, nums.value.length)
}

const removeNumber = () => {
  nums.value.splice(randomIndex(), 1)
}

const randomIndex = () => {
  return Math.floor(Math.random() * nums.value.length)
}

</script>

添加動畫, 此時添加上動畫, 這個組中的內容都會有動畫效果

span {
  margin-right: 20px;
  display: inline-block;
}

.v-enter-from,
.v-leave-to {
  opacity: 0;
  transform: translateY(20px);
}

.v-enter-to,
.v-leave-from {
  opacity: 1;
  transform: translateY(0);
}

.v-enter-active,
.v-leave-active {
  transition: all 2s linear;
}
<template>
  <div class="app">
    <button @click="addNumber">添加數(shù)字</button>
    <button @click="removeNumber">刪除數(shù)字</button>
    
    <!-- tag屬性, 告知渲染成div -->
    <transition-group tag="div">
      <template v-for="item in nums" :key="item">
        <span>{{ item }}</span>
      </template>
    </transition-group>
  </div>
</template>

在上面的案例中雖然新增的或者刪除的節(jié)點是有動畫的,但是對于哪些其他需要移動的節(jié)點是沒有動畫的

我們可以通過使用一個新增的 v-move 的class來完成動畫;

它會在元素改變位置的過程中應用;

像之前的名字一樣,我們也可以通過name來自定義前綴;

/* 定位解決刪除占用空間, 無法執(zhí)行動畫問題 */
.v-leave-active {
  position: absolute;
}
  /* 針對其他節(jié)點移動需要的動畫 */
.v-move {
  transition: all 2s linear;
}

到此這篇關于Vue中實現(xiàn)過渡動畫效果示例代碼的文章就介紹到這了,更多相關Vue中實現(xiàn)過渡動畫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Vue中Mustache引擎插值語法使用詳解

    Vue中Mustache引擎插值語法使用詳解

    在Vue中通過Mustache模板引擎將data中的文本數(shù)據(jù)插入到HTML中,下面這篇文章主要給大家介紹了關于Vue中Mustache模板引擎插值語法的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • vue多級多選菜單組件開發(fā)

    vue多級多選菜單組件開發(fā)

    這篇文章主要為大家分享了vue多級多選菜單組件開發(fā)案例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Vue CLI3創(chuàng)建項目部署到Tomcat 使用ngrok映射到外網(wǎng)

    Vue CLI3創(chuàng)建項目部署到Tomcat 使用ngrok映射到外網(wǎng)

    這篇文章主要介紹了Vue CLI3創(chuàng)建項目部署到Tomcat 使用ngrok映射到外網(wǎng),本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • vue使用vue-i18n實現(xiàn)國際化的實現(xiàn)代碼

    vue使用vue-i18n實現(xiàn)國際化的實現(xiàn)代碼

    本篇文章主要介紹了vue使用vue-i18n實現(xiàn)國際化的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Vue數(shù)據(jù)更新但頁面沒有更新的多種情況問題及解決

    Vue數(shù)據(jù)更新但頁面沒有更新的多種情況問題及解決

    這篇文章主要介紹了Vue數(shù)據(jù)更新但頁面沒有更新的多種情況問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Vue3中如何使用component :is 加載組件

    Vue3中如何使用component :is 加載組件

    Monaco-editor,一個vs code 編輯器,需要將其集成到項目,這篇文章主要介紹了Vue3中如何使用component :is 加載組件,需要的朋友可以參考下
    2023-11-11
  • vue項目如何實現(xiàn)前端預覽word與pdf格式文件

    vue項目如何實現(xiàn)前端預覽word與pdf格式文件

    最近項目中需要在線預覽WORD文檔,所以給大家總結下,這篇文章主要給大家介紹了關于vue項目如何實現(xiàn)前端預覽word與pdf格式文件的相關資料,需要的朋友可以參考下
    2023-03-03
  • 如何正確快速使用Vue中的插槽和配置代理

    如何正確快速使用Vue中的插槽和配置代理

    這篇文章主要介紹了正確快速使用Vue中的插槽和配置代理的相關知識,插槽分為三種,分別是默認插槽、具名插槽、作用域插槽,下面分別列出了如何使用這三種插槽,需要的朋友可以參考下
    2023-01-01
  • Vue3 中的 Vue-Router 和 VueX詳解

    Vue3 中的 Vue-Router 和 VueX詳解

    VueX 提供了一個全局都可以使用的數(shù)據(jù)管理倉庫,不用考慮父子傳值之類的問題,并且可以跨頁面?zhèn)鬟f數(shù)據(jù),提高了可維護性,這篇文章主要介紹了Vue3 中的 Vue-Router 和 VueX,需要的朋友可以參考下
    2022-12-12
  • vue中使用swiper輪播圖的正確姿勢(親測有效)

    vue中使用swiper輪播圖的正確姿勢(親測有效)

    最近在用Vue制作移動端項目,碰到了輪播圖的制作,接下來就讓小編一步一步帶大家動作制作吧,下面這篇文章主要給大家介紹了關于vue中使用swiper輪播圖的正確姿勢,需要的朋友可以參考下
    2022-06-06

最新評論

玛曲县| 湟源县| 博爱县| 筠连县| 阿克| 古田县| 成安县| 平泉县| 诸暨市| 手游| 苗栗县| 巴林右旗| 桃江县| 峨边| 敖汉旗| 广元市| 安丘市| 昔阳县| 南宫市| 高碑店市| 沁水县| 巨鹿县| 石柱| 临湘市| 广灵县| 龙陵县| 永川市| 黄平县| 泗洪县| 余江县| 新巴尔虎右旗| 安庆市| 周口市| 新泰市| 马山县| 灵宝市| 武安市| 大名县| 常宁市| 宣威市| 富民县|