最近中文字幕高清中文字幕无,亚洲欧美高清一区二区三区,一本色道无码道dvd在线观看 ,一个人看的www免费高清中文字幕

Vue 過(guò)渡 & 動(dòng)畫

本章節(jié)我們主要介紹 Vue.js 的過(guò)渡效果與動(dòng)畫效果。包括如何編寫自定義 CSS 動(dòng)畫、如何配合第三方 CSS 動(dòng)畫庫(kù)、過(guò)渡鉤子函數(shù)的使用、如何使用第三方 JavaScript 動(dòng)畫庫(kù)。本小節(jié)的內(nèi)容相對(duì)之前有些難度,同學(xué)們?cè)陂喿x一遍之后如果不能完全掌握,建議反復(fù)閱讀,并把本小節(jié)的所有案例自己實(shí)現(xiàn)一遍,相信通過(guò)多次的練習(xí)一定可以掌握。

1. 過(guò)渡

Vue 在插入、更新或者移除 DOM 時(shí),提供多種不同方式的應(yīng)用過(guò)渡效果。
包括以下工具:
1、在 CSS 過(guò)渡和動(dòng)畫中自動(dòng)應(yīng)用 class;
2、配合使用第三方 CSS 動(dòng)畫庫(kù),如 Animate.css;
3、在過(guò)渡鉤子函數(shù)中使用 JavaScript 直接操作 DOM;
4、配合使用第三方 JavaScript 動(dòng)畫庫(kù),如 Velocity.js。

語(yǔ)法格式:

使用 transition 組件包裹需要使用過(guò)渡效果的 DOM 元素。例如:

    <transition name = "transition-name">
      <div>...</div>
    </transition>

1.1 基本使用

接下來(lái)讓我們先看一個(gè)淡入淡出效果的實(shí)現(xiàn)代碼:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .fade-enter-active, .fade-leave-active {
      transition: opacity 3s
    }
    .fade-enter, .fade-leave-to {
      opacity: 0
    }
  </style>
</head>
<body>
  <div id = "app">
    <button v-on:click = "show = !show">{{ show ? '隱藏' : '顯示'}}</button>
    <transition name="fade">
      <p v-show = "show" >hello !</p>
    </transition>
  </div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script type = "text/javascript">
  var vm = new Vue({
    el: '#app',
    data: {
        show:true
    },
    methods : {
    }
  });
</script>
</html>

運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

代碼解釋:

  1. HTML 代碼第 3-5 行,我們使用 transition 組件包裹 <p> 標(biāo)簽,transition 組件指定 name 為 fade,通過(guò) 指令 v-show 控制 <p> 標(biāo)簽的顯示和隱藏;
  2. HTML 代碼第 2 行,定義按鈕 button,點(diǎn)擊修改 show 的值來(lái)控制標(biāo)簽 <p> 的顯示隱藏;
  3. CSS 中我們定義了 4 個(gè)樣式;
  4. JS 代碼第 6 行,定義數(shù)據(jù) show,默認(rèn)值為 true。

那么,transition 組件是如何做到這樣的過(guò)渡效果的呢?

我想,同學(xué)們肯定猜想到當(dāng)元素切換狀態(tài)的時(shí)候,我們定義的樣式會(huì)作用于標(biāo)簽元素 <p>。那么,到底是不是這樣呢?

打開控制臺(tái),檢索到 <p> 標(biāo)簽上,我們可以清晰地看到:

  1. 當(dāng)元素隱藏的時(shí)候,樣式 fade-leave-active 和 fade-leave-to 會(huì)被添加到元素 <p> 上;
  2. 當(dāng)元素顯示的時(shí)候,樣式 fade-enter-active 和 fade-enter-to 會(huì)被添加到元素 <p> 上。

實(shí)際上 Vue 在元素顯示與隱藏的過(guò)渡中,提供了 6 個(gè) class 來(lái)切換:

  • v-enter:定義進(jìn)入過(guò)渡的開始狀態(tài)。在元素被插入之前生效,在元素被插入之后的下一幀移除;
  • v-enter-active:定義進(jìn)入過(guò)渡生效時(shí)的狀態(tài)。在整個(gè)進(jìn)入過(guò)渡的階段中應(yīng)用,在元素被插入之前生效,在過(guò)渡 / 動(dòng)畫完成之后移除。這個(gè)類可以被用來(lái)定義進(jìn)入過(guò)渡的過(guò)程時(shí)間,延遲和曲線函數(shù);
  • v-enter-to: 定義進(jìn)入過(guò)渡的結(jié)束狀態(tài)。在元素被插入之后下一幀生效 (與此同時(shí) v-enter 被移除),在過(guò)渡 / 動(dòng)畫完成之后移除。
  • v-leave: 定義離開過(guò)渡的開始狀態(tài)。在離開過(guò)渡被觸發(fā)時(shí)立刻生效,下一幀被移除;
  • v-leave-active:定義離開過(guò)渡生效時(shí)的狀態(tài)。在整個(gè)離開過(guò)渡的階段中應(yīng)用,在離開過(guò)渡被觸發(fā)時(shí)立刻生效,在過(guò)渡 / 動(dòng)畫完成之后移除。這個(gè)類可以被用來(lái)定義離開過(guò)渡的過(guò)程時(shí)間,延遲和曲線函數(shù);
  • v-leave-to: 定義離開過(guò)渡的結(jié)束狀態(tài)。在離開過(guò)渡被觸發(fā)之后下一幀生效 (與此同時(shí) v-leave 被刪除),在過(guò)渡 / 動(dòng)畫完成之后移除。

圖片描述

對(duì)于這些在過(guò)渡中切換的類名來(lái)說(shuō),如果你使用一個(gè)沒(méi)有名字的 <transition>,則 v- 是這些類名的默認(rèn)前綴。如果你使用了 <transition name="test-transition">,那么 v 會(huì)替換為 test-transition。例如:test-transition-enter、test-transition-enter-active、test-transition-leave…

1.2 CSS 過(guò)渡

在日常開發(fā)中,我們經(jīng)常會(huì)使用 CSS 過(guò)渡來(lái)實(shí)現(xiàn)一些簡(jiǎn)單的動(dòng)畫效果。接下來(lái)我們用一個(gè)示例來(lái)學(xué)習(xí)如何使用:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .fade-enter-active {
      transition: all .3s ease;
    }
    .fade-leave-active {
      transition: all .3s cubic-bezier(1.0, 0.5, 0.8, 1.0);
    }
    .fade-enter, .fade-leave-to {
      transform: translateY(10px);
      opacity: 0;
    }
  </style>
</head>
<body>
  <div id = "app">
    <button v-on:click = "show = !show">{{ show ? '顯示' : '隱藏'}}</button>
    <transition name = "fade">
      <p v-show = "show" >Hello !</p>
    </transition>
  </div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script type = "text/javascript">
  var vm = new Vue({
    el: '#app',
    data: {
      show:true
    }
  });
</script>
</html>

運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

代碼解釋:

  1. HTML 代碼第 3-5 行,我們使用 transition 組件包裹 <p> 標(biāo)簽,transition 組件指定 name 為 fade,通過(guò) 指令 v-show 控制 <p> 標(biāo)簽的顯示和隱藏;
  2. HTML 代碼第 2 行,定義按鈕 button,點(diǎn)擊修改 show 的值來(lái)控制標(biāo)簽 <p> 的顯示隱藏;
  3. CSS 中我們定義了 4 個(gè)樣式,通過(guò) transform 控制元素的垂直位移,通過(guò) opacity 控制元素的 透明度,通過(guò) transition 控制元素的過(guò)渡效果;
  4. JS 代碼第 6 行,定義數(shù)據(jù) show,默認(rèn)值為 true。

1.3 CSS 動(dòng)畫

同樣,我們可以使用 CSS 動(dòng)畫來(lái)實(shí)現(xiàn)元素的過(guò)渡效果。CSS 動(dòng)畫用法類似 CSS 過(guò)渡,在過(guò)渡的不同階段對(duì)應(yīng)的 Class 會(huì)作用于元素。但是在動(dòng)畫中 v-enter 類名在節(jié)點(diǎn)插入 DOM 后不會(huì)立即刪除,而是在 animationend 事件觸發(fā)時(shí)刪除。
相信同學(xué)們?cè)谌粘I(yè)務(wù)開發(fā)中一定使用過(guò) Dialog,接下來(lái)我們就使用 CSS 動(dòng)畫來(lái)實(shí)現(xiàn)它的過(guò)渡效果:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    #app{
      text-align: center;
    }
    .dialog{
      width: 100px;
      height: 100px;
      border: 1px solid #333;
      margin: 60px auto;
      text-align: center;
      line-height: 100px;
    }
    .bounce-enter-active {
      animation: bounce-in 400ms;
    }
    .bounce-leave-active {
      animation: bounce-out 300ms;
    }
    @keyframes bounce-in {
      0% {
        transform: scale(0.7);
      }
      50% {
        transform: scale(1.3);
      }
      100% {
        transform: scale(1);
      }
    }
    @keyframes bounce-out {
      0% {
        transform: scale(1);
      }
      100% {
        transform: scale(0.4);
      }
    }
  </style>
</head>
<body>
  <div id = "app">
    <button v-on:click = "show = !show">{{ show ? '顯示 Dialog' : '隱藏 Dialog'}}</button>
    <transition name = "bounce">
      <p v-show = "show" class="dialog">Dialog...</p>
    </transition>
  </div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script type = "text/javascript">
  var vm = new Vue({
    el: '#app',
    data: {
      show:false
    }
  });
</script>
</html>

運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

代碼解釋:

  1. HTML 代碼第 3-5 行,我們使用 transition 組件包裹 <p> 標(biāo)簽,transition 組件指定 name 為 bounce 指令 v-show 控制 <p> 標(biāo)簽的顯示和隱藏;
  2. HTML 代碼第 2 行,定義按鈕 button,點(diǎn)擊修改 show 的值來(lái)控制標(biāo)簽 <p> 的顯示隱藏;
  3. CSS 中我們定義了樣式兩個(gè)樣式:
    1. 元素入場(chǎng)樣式: bounce-enter-active,它執(zhí)行動(dòng)畫 bounce-in。
    2. 元素出場(chǎng)樣式: bounce-leave-active,它執(zhí)行動(dòng)畫 bounce-out。
  4. JS 代碼第 6 行,定義數(shù)據(jù) show,初始值為 true。

1.4 自定義過(guò)渡的類名

在之前的兩個(gè)案例中,我們通過(guò)給 transition 設(shè)置 name 屬性來(lái)指定元素在不同階段的樣式類名,但有時(shí)候希望使用自定義的過(guò)渡類名,我們可以通過(guò)給 transition 設(shè)置以下屬性來(lái)達(dá)到需求:

  • enter-class
  • enter-active-class
  • enter-to-class
  • leave-class
  • leave-active-class
  • leave-to-class

自定義過(guò)渡的類名優(yōu)先級(jí)高于普通的類名,這樣就能很好地與第三方(如:animate.css)的動(dòng)畫庫(kù)結(jié)合使用。

1.5 顯性的過(guò)渡持續(xù)時(shí)間

在很多情況下,Vue 可以自動(dòng)得出過(guò)渡效果的完成時(shí)機(jī)。默認(rèn)情況下,Vue 會(huì)等待其在過(guò)渡效果的根元素的第一個(gè) transitionend 或 animationend 事件。然而也可以不這樣設(shè)定 —— 比如,我們可以擁有一個(gè)精心編排的一系列過(guò)渡效果,其中一些嵌套的內(nèi)部元素相比于過(guò)渡效果的根元素有延遲的或更長(zhǎng)的過(guò)渡效果。

在這種情況下你可以用 組件上的 duration 屬性定制一個(gè)顯性的過(guò)渡持續(xù)時(shí)間 (以毫秒計(jì)):

<transition :duration="1000">...</transition>

你也可以定制進(jìn)入和移出的持續(xù)時(shí)間:

<transition :duration="{ enter: 400, leave: 600 }">...</transition>

2. JavaScript 鉤子

transition 組件在過(guò)渡的不同階段會(huì)觸發(fā)相應(yīng)的鉤子函數(shù):

<transition 
  v-on:before-enter="beforeEnter"
  v-on:enter="enter"
  v-on:after-enter="afterEnter"
  v-on:enter-cancelled="enterCancelled"
  v-on:before-leave="beforeLeave"
  v-on:leave="leave"
  v-on:after-leave="afterLeave"
  v-on:leave-cancelled="leaveCancelled"
>
  <p>...</p>
</transition>

這些鉤子函數(shù)可以結(jié)合 CSS transitions/animations 使用,也可以單獨(dú)使用。

當(dāng)只用 JavaScript 過(guò)渡的時(shí)候,在 enter 和 leave 中必須使用 done 進(jìn)行回調(diào)。否則,它們將被同步調(diào)用,過(guò)渡會(huì)立即完成。

推薦對(duì)于僅使用 JavaScript 過(guò)渡的元素添加 v-bind:css="false",Vue 會(huì)跳過(guò) CSS 的檢測(cè)。這也可以避免過(guò)渡過(guò)程中 CSS 的影響。

接下來(lái)我們來(lái)看一個(gè)使用鉤子函數(shù)和 Velocity.js 實(shí)現(xiàn)過(guò)渡動(dòng)畫的例子:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .hello{
      width: 100px;
      height: 100px;
      border: 1px solid red;
      margin: auto;
    }
  </style>
</head>
<body>
  <div id = "app">
    <button @click="show = !show">
      切換顯示狀態(tài)
    </button>
    <transition
      v-on:before-enter="beforeEnter"
      v-on:enter="enter"
      v-on:leave="leave"
      v-bind:css="false"
    >
      <p v-if="show">
        Demo
      </p>
    </transition>
  </div>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js"></script>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script type = "text/javascript">
  var vm = new Vue({
    el: '#app',
    data: {
      show:false
    },
    methods: {
      beforeEnter: function (el) {
        el.style.opacity = 0
        el.style.transformOrigin = 'left'
      },
      enter: function (el, done) {
        Velocity(el, { opacity: 1, fontSize: '1.4em' }, { duration: 300 })
        Velocity(el, { fontSize: '1em' }, { complete: done})
      },
      leave: function (el, done) {
        Velocity(el, { translateX: '20px', rotateZ: '45deg' }, { duration: 600 })
        Velocity(el, { rotateZ: '90deg' }, { loop: 3 })
        Velocity(el, {
          rotateZ: '45deg',
          translateY: '30px',
          translateX: '30px',
          opacity: 0
        }, { complete: done })
      }
    }
  });
</script>
</html>
運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

代碼解釋:

  1. HTML 代碼第 3-12 行,我們使用 transition 組件包裹 <p> 標(biāo)簽,并給 transition 組件綁定監(jiān)聽事件 before-enter、enter、leave;
  2. HTML 代碼第 2 行,定義按鈕 button,點(diǎn)擊修改 show 的值來(lái)控制標(biāo)簽 <p> 的顯示隱藏;
  3. JS 代碼第 7 行,定義數(shù)據(jù) show,默認(rèn)值為 false;
  4. JS 代碼第 10-13 行,定義元素的 beforeEnter 函數(shù),并修改元素的樣式 style;
  5. JS 代碼第 14-17 行,定義元素的 enter 函數(shù),并執(zhí)行以下操作:
  6. 使用 Velocity 修改元素的 opacity 和 fontSize,過(guò)渡時(shí)間為 300。
  7. 使用 Velocity 修改元素的 fontSize,并在完成時(shí)間調(diào)用 done 回調(diào)函數(shù)。
  8. JS 代碼第 18-27 行,定義元素的 leave 函數(shù),并執(zhí)行以下操作:
  9. 使用 Velocity 修改元素的 translateX 和 rotateZ,過(guò)渡時(shí)間為 600。
  10. 使用 Velocity 修改元素的 rotateZ,并且循環(huán) 3 次。
  11. 使用 Velocity 修改元素的 rotateZ 、translateY、translateX、opacity,并在完成時(shí)間調(diào)用 done 回調(diào)函數(shù)。

3. 初始渲染的過(guò)渡

有時(shí)候我們希望給元素設(shè)置初始渲染的過(guò)渡效果,可以通過(guò)給 transition 設(shè)置 appear 的 attribute

<transition appear>
  <!-- ... -->
</transition>

這里默認(rèn)和進(jìn)入 / 離開過(guò)渡一樣,同樣也可以自定義 CSS 類名:

<transition
  appear
  appear-class="v-appear-class"
  appear-to-class="v-appear-to-class"
  appear-active-class="v-appear-active-class"
>
  <!-- ... -->
</transition>

同樣地,可以使用自定義 JavaScript 鉤子:

<transition
  appear
  v-on:before-appear="beforeAppear"
  v-on:appear="appear"
  v-on:after-appear="afterAppear"
  v-on:appear-cancelled="appearCancelled"
>
  <!-- ... -->
</transition>

接下來(lái)我們看一個(gè)完整的示例:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .hello{
      width: 100px;
      height: 100px;
      border: 1px solid red;
      margin: auto;
    }
    .v-appear-class{
      opacity: 0;
    }
    .v-appear-to-class{
      opacity: 1;
    }
    .v-appear-active-class{
      transition: all 2s;
    }

  </style>
</head>
<body>
  <div id = "app">
    <button v-on:click = "show = !show">隱藏</button>
    <transition 
      appear
      appear-class="v-appear-class"
      appear-to-class="v-appear-to-class"
      appear-active-class="v-appear-active-class"
      v-on:before-appear="beforeAppear"
      v-on:appear="appear"
      v-on:after-appear="afterAppear"
      v-on:appear-cancelled="appearCancelled"
    >
      <p v-show = "show" class="hello">Hello !</p>
    </transition>
  </div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script type = "text/javascript">
  var vm = new Vue({
    el: '#app',
    data: {
      show:true
    },
    methods: {
      beforeAppear() {
        console.log('beforeAppear')
      },
      appear() {
        console.log('appear')
      },
      afterAppear() {
        console.log('afterAppear')
      },
      appearCancelled() {
        console.log('appearCancelled')
      },
    }
  });
</script>
</html>

運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

代碼解釋:

  1. HTML 代碼第 3-14 行,我們使用 transition 組件包裹 <p> 標(biāo)簽,指定 transition 為初次渲染的過(guò)渡,并給 transition 組件綁定監(jiān)聽事件: before-appear、appear、after-appear、appear-cancelled;
  2. HTML 代碼第 2 行,定義按鈕 button,點(diǎn)擊修改 show 的值來(lái)控制標(biāo)簽 <p> 的顯示隱藏;
  3. JS 代碼第 6 行,定義數(shù)據(jù) show,默認(rèn)值為 false。

4. 小結(jié)

本小節(jié)我們介紹了如何使用 transition 實(shí)現(xiàn)過(guò)渡和動(dòng)畫效果,主要包括以下知識(shí)點(diǎn):

  • 使用 CSS 過(guò)渡配合 transition 實(shí)現(xiàn)過(guò)渡效果;
  • 使用 CSS 動(dòng)畫配合 transition 實(shí)現(xiàn)動(dòng)畫效果;
  • 使用 transition 鉤子函數(shù)操作元素 DOM 來(lái)實(shí)現(xiàn)動(dòng)畫;
  • 使用 transition 的 appear 屬性實(shí)現(xiàn)初次渲染的動(dòng)畫效果。