在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ 過渡
自定義過濾器
自定義指令
概述
安裝
起步
深入響應式原理
Class 與 Style 綁定
混合
列表渲染
方法與事件處理器
表單控件綁定
對比其它框架
組件
計算屬性
插件
數(shù)據(jù)綁定語法
構(gòu)建大型應用
條件渲染
Vue 實例
過渡

過渡

通過 Vue.js 的過渡系統(tǒng),可以在元素從 DOM 中插入或移除時自動應用過渡效果。Vue.js 會在適當?shù)臅r機為你觸發(fā) CSS 過渡或動畫,你也可以提供相應的 JavaScript 鉤子函數(shù)在過渡過程中執(zhí)行自定義的 DOM 操作。

為了應用過渡效果,需要在目標元素上使用 transition 特性:

<div v-if="show" transition="my-transition"></div>

transition 特性可以與下面資源一起用:

  • v-if
  • v-show
  • v-for (只為插入和刪除觸發(fā))
  • 動態(tài)組件 (介紹見組件)
  • 在組件的根節(jié)點上,并且被 Vue 實例 DOM 方法(如 vm.$appendTo(el))觸發(fā)。

當插入或刪除帶有過渡的元素時,Vue 將:

  1. 嘗試以 ID "my-transition" 查找 JavaScript 過渡鉤子對象——通過 Vue.transition(id, hooks)transitions 選項注冊。如果找到了,將在過渡的不同階段調(diào)用相應的鉤子。

  2. 自動嗅探目標元素是否有 CSS 過渡或動畫,并在合適時添加/刪除 CSS 類名。

  3. 如果沒有找到 JavaScript 鉤子并且也沒有檢測到 CSS 過渡/動畫,DOM 操作(插入/刪除)在下一幀中立即執(zhí)行。

CSS 過渡

示例

典型的 CSS 過渡像這樣:

<div v-if="show" transition="expand">hello</div>

然后為 .expand-transition, .expand-enter.expand-leave 添加 CSS 規(guī)則:

/* 必需 */
.expand-transition {
  transition: all .3s ease;
  height: 30px;
  padding: 10px;
  background-color: #eee;
  overflow: hidden;
}

/* .expand-enter 定義進入的開始狀態(tài) */
/* .expand-leave 定義離開的結(jié)束狀態(tài) */
.expand-enter, .expand-leave {
  height: 0;
  padding: 0 10px;
  opacity: 0;
}

另外,可以提供 JavaScript 鉤子:

Vue.transition('expand', {

  beforeEnter: function (el) {
    el.textContent = 'beforeEnter'
  },
  enter: function (el) {
    el.textContent = 'enter'
  },
  afterEnter: function (el) {
    el.textContent = 'afterEnter'
  },
  enterCancelled: function (el) {
    // handle cancellation
  },

  beforeLeave: function (el) {
    el.textContent = 'beforeLeave'
  },
  leave: function (el) {
    el.textContent = 'leave'
  },
  afterLeave: function (el) {
    el.textContent = 'afterLeave'
  },
  leaveCancelled: function (el) {
    // handle cancellation
  }
})
{% raw %}
<div id="demo">
  <div v-if="show" transition="expand">hello</div>
  <button @click="show = !show">Toggle</button>
</div>

<style>
.expand-transition {
  transition: all .3s ease;
  height: 30px;
  padding: 10px;
  background-color: #eee;
  overflow: hidden;
}
.expand-enter, .expand-leave {
  height: 0;
  padding: 0 10px;
  opacity: 0;
}
</style>

<script>
new Vue({
  el: '#demo',
  data: {
    show: true,
    transitionState: 'Idle'
  },
  transitions: {
    expand: {
      beforeEnter: function (el) {
        el.textContent = 'beforeEnter'
      },
      enter: function (el) {
        el.textContent = 'enter'
      },
      afterEnter: function (el) {
        el.textContent = 'afterEnter'
      },
      beforeLeave: function (el) {
        el.textContent = 'beforeLeave'
      },
      leave: function (el) {
        el.textContent = 'leave'
      },
      afterLeave: function (el) {
        el.textContent = 'afterLeave'
      }
    }
  }
})
</script>
{% endraw %}

過渡的 CSS 類名

類名的添加和切換取決于 transition 特性的值。比如 transition="fade",會有三個 CSS 類名:

  1. .fade-transition 始終保留在元素上。

  2. .fade-enter 定義進入過渡的開始狀態(tài)。只應用一幀然后立即刪除。

  3. .fade-leave 定義離開過渡的結(jié)束狀態(tài)。在離開過渡開始時生效,在它結(jié)束后刪除。

如果 transition 特性沒有值,類名默認是 .v-transition, .v-enter.v-leave

自定義過渡類名

1.0.14 新增

我們可以在過渡的 JavaScript 定義中聲明自定義的 CSS 過渡類名。這些自定義類名會覆蓋默認的類名。當需要和第三方的 CSS 動畫庫,比如 Animate.css 配合時會非常有用:

<div v-show="ok" class="animated" transition="bounce">Watch me bounce</div>
Vue.transition('bounce', {
  enterClass: 'bounceInLeft',
  leaveClass: 'bounceOutRight'
})

顯式聲明 CSS 過渡類型

1.0.14 新增

Vue.js 需要給過渡元素添加事件偵聽器來偵聽過渡何時結(jié)束?;谒褂玫?CSS,該事件要么是 transitionend,要么是 animationend。如果你只使用了兩者中的一種,那么 Vue.js 將能夠根據(jù)生效的 CSS 規(guī)則自動推測出對應的事件類型。但是,有些情況下一個元素可能需要同時帶有兩種類型的動畫。比如你可能希望讓 Vue 來觸發(fā)一個 CSS animation,同時該元素在鼠標懸浮時又有 CSS transition 效果。這樣的情況下,你需要顯式地聲明你希望 Vue 處理的動畫類型 (animation 或是 transition):

Vue.transition('bounce', {
  // 該過渡效果將只偵聽 `animationend` 事件
  type: 'animation'
})

過渡流程詳解

show 屬性改變時,Vue.js 將相應地插入或刪除 <div> 元素,按照如下規(guī)則改變過渡的 CSS 類名:

  • 如果 show 變?yōu)?false,Vue.js 將:

    1. 調(diào)用 beforeLeave 鉤子;
    2. 添加 v-leave 類名到元素上以觸發(fā)過渡;
    3. 調(diào)用 leave 鉤子;
    4. 等待過渡結(jié)束(監(jiān)聽 transitionend 事件);
    5. 從 DOM 中刪除元素并刪除 v-leave 類名;
    6. 調(diào)用 afterLeave 鉤子。
  • 如果 show 變?yōu)?true,Vue.js 將:
    1. 調(diào)用 beforeEnter 鉤子;
    2. 添加 v-enter 類名到元素上;
    3. 把它插入 DOM;
    4. 調(diào)用 enter 鉤子;
    5. 強制一次 CSS 布局,讓 v-enter 確實生效。然后刪除 v-enter 類名,以觸發(fā)過渡,回到元素的原始狀態(tài);
    6. 等待過渡結(jié)束;
    7. 調(diào)用 afterEnter 鉤子。

另外,如果在它的進入過渡還在進行中時刪除元素,將調(diào)用 enterCancelled 鉤子,以清理變動或 enter 創(chuàng)建的計時器。反過來對于離開過渡亦如是。

上面所有的鉤子函數(shù)在調(diào)用時,它們的 this 均指向所屬的 Vue 實例。如果元素是 Vue 實例的根節(jié)點,則這個實例是上下文。否則,上下文是過渡指令所屬的實例。

最后,enterleave 可以有第二個可選的回調(diào)參數(shù),用于顯式控制過渡如何結(jié)束。因此不必等待 CSS transitionend 事件, Vue.js 將等待你手工調(diào)用這個回調(diào),以結(jié)束過渡。例如:

enter: function (el) {
  // 沒有第二個參數(shù)
  // 由 CSS transitionend 事件決定過渡何時結(jié)束
}

vs.

enter: function (el, done) {
  // 有第二個參數(shù)
  // 過渡只有在調(diào)用 `done` 時結(jié)束
}

當多個元素一起過渡時,Vue.js 會批量處理,只強制一次布局。

CSS 動畫

CSS 動畫用法同 CSS 過渡,區(qū)別是在動畫中 v-enter 類名在節(jié)點插入 DOM 后不會立即刪除,而是在 animationend 事件觸發(fā)時刪除。

示例: (省略了兼容性前綴)

<span v-show="show" transition="bounce">Look at me!</span>
.bounce-transition {
  display: inline-block; /* 否則 scale 動畫不起作用 */
}
.bounce-enter {
  animation: bounce-in .5s;
}
.bounce-leave {
  animation: bounce-out .5s;
}
@keyframes bounce-in {
  0% {
    transform: scale(0);
  }
  50% {
    transform: scale(1.5);
  }
  100% {
    transform: scale(1);
  }
}
@keyframes bounce-out {
  0% {
    transform: scale(1);
  }
  50% {
    transform: scale(1.5);
  }
  100% {
    transform: scale(0);
  }
}
{% raw %}
<div id="anim" class="demo">
  <span v-show="show" transition="bounce">Look at me!</span>
  <br>
  <button @click="show = !show">Toggle</button>
</div>

<style>
  .bounce-transition {
    display: inline-block;
  }
  .bounce-enter {
    -webkit-animation: bounce-in .5s;
    animation: bounce-in .5s;
  }
  .bounce-leave {
    -webkit-animation: bounce-out .5s;
    animation: bounce-out .5s;
  }
  @keyframes bounce-in {
    0% {
      -webkit-transform: scale(0);
      transform: scale(0);
    }
    50% {
      -webkit-transform: scale(1.5);
      transform: scale(1.5);
    }
    100% {
      -webkit-transform: scale(1);
      transform: scale(1);
    }
  }
  @keyframes bounce-out {
    0% {
      -webkit-transform: scale(1);
      transform: scale(1);
    }
    50% {
      -webkit-transform: scale(1.5);
      transform: scale(1.5);
    }
    100% {
      -webkit-transform: scale(0);
      transform: scale(0);
    }
  }
  @-webkit-keyframes bounce-in {
    0% {
      -webkit-transform: scale(0);
      transform: scale(0);
    }
    50% {
      -webkit-transform: scale(1.5);
      transform: scale(1.5);
    }
    100% {
      -webkit-transform: scale(1);
      transform: scale(1);
    }
  }
  @-webkit-keyframes bounce-out {
    0% {
      -webkit-transform: scale(1);
      transform: scale(1);
    }
    50% {
      -webkit-transform: scale(1.5);
      transform: scale(1.5);
    }
    100% {
      -webkit-transform: scale(0);
      transform: scale(0);
    }
  }
</style>

<script>
new Vue({
  el: '#anim',
  data: { show: true }
})
</script>
{% endraw %}

JavaScript 過渡

也可以只使用 JavaScript 鉤子,不用定義任何 CSS 規(guī)則。當只使用 JavaScript 過渡時,enterleave 鉤子需要調(diào)用 done 回調(diào),否則它們將被同步調(diào)用,過渡將立即結(jié)束。

為 JavaScript 過渡顯式聲明 css: false 是個好主意,Vue.js 將跳過 CSS 檢測。這樣也會阻止無意間讓 CSS 規(guī)則干擾過渡。

在下例中我們使用 jQuery 注冊一個自定義的 JavaScript 過渡:

Vue.transition('fade', {
  css: false,
  enter: function (el, done) {
    // 元素已被插入 DOM
    // 在動畫結(jié)束后調(diào)用 done
    $(el)
      .css('opacity', 0)
      .animate({ opacity: 1 }, 1000, done)
  },
  enterCancelled: function (el) {
    $(el).stop()
  },
  leave: function (el, done) {
    // 與 enter 相同
    $(el).animate({ opacity: 0 }, 1000, done)
  },
  leaveCancelled: function (el) {
    $(el).stop()
  }
})

然后用 transition 特性中:

<p transition="fade"></p>

漸近過渡

transitionv-for 一起用時可以創(chuàng)建漸近過渡。給過渡元素添加一個特性 stagger, enter-staggerleave-stagger

<div v-for="item in list" transition="stagger" stagger="100"></div>

或者,提供一個鉤子 stagger, enter-staggerleave-stagger,以更好的控制:

Vue.transition('stagger', {
  stagger: function (index) {
    // 每個過渡項目增加 50ms 延時
    // 但是最大延時限制為 300ms
    return Math.min(300, index * 50)
  }
})

示例:

<iframe width="100%" height="200" style="margin-left:10px" src="http://jsfiddle.net/yyx990803/mvo99bse/embedded/result,html,js,css" allowfullscreen="allowfullscreen" frameborder="0"></iframe>
上一篇:自定義指令下一篇:列表渲染