Vue學(xué)習(xí)筆記進(jìn)階篇——單元素過度

本文為轉(zhuǎn)載盐碱,原文:Vue學(xué)習(xí)筆記進(jìn)階篇——單元素過度

概述

Vue 在插入把兔、更新或者移除 DOM 時沪伙,提供多種不同方式的應(yīng)用過渡效果。
包括以下工具:

在 CSS 過渡和動畫中自動應(yīng)用 class
可以配合使用第三方 CSS 動畫庫县好,如 Animate.css
在過渡鉤子函數(shù)中使用 JavaScript 直接操作 DOM
可以配合使用第三方 JavaScript 動畫庫围橡,如 Velocity.js

單元素/組件的過度

Vue 提供了 transition 的封裝組件,在下列情形中缕贡,可以給任何元素和組件添加 entering/leaving 過渡

條件渲染 (使用 v-if)
條件展示 (使用 v-show)
動態(tài)組件
組件根節(jié)點

這里是一個典型的例子:

<div id="app1">
    <button @click="show = !show">toggle</button>
    <transition name="fade">
        <p v-if="show">hello</p>
    </transition>
</div>
new Vue({
    el:'#app1',
    data:{
        show:true
    }
})
.fade-enter-active, .fade-leave-active{
    transition: opacity 2s;
}
.fade-enter, .fade-leave-to{
    opacity: 0;
}

運(yùn)行結(jié)果如下:



點擊toggle按鈕會看見文字淡入淡出的效果翁授。
當(dāng)插入或刪除包含在 transition 組件中的元素時,Vue 將會做以下處理:

  1. 自動嗅探目標(biāo)元素是否應(yīng)用了 CSS 過渡或動畫晾咪,如果是收擦,在恰當(dāng)?shù)臅r機(jī)添加/刪除 CSS 類名。
  2. 如果過渡組件提供了 JavaScript 鉤子函數(shù)谍倦,這些鉤子函數(shù)將在恰當(dāng)?shù)臅r機(jī)被調(diào)用塞赂。
  3. 如果沒有找到 JavaScript 鉤子并且也沒有檢測到 CSS 過渡/動畫,DOM 操作(插入/刪除)在下一幀中立即執(zhí)行昼蛀。(注意:此指瀏覽器逐幀動畫機(jī)制减途,和Vue的 nextTick 概念不同)

過度的CSS類名

  1. v-enter: 定義進(jìn)入過渡的開始狀態(tài)。在元素被插入時生效,在下一個幀移除。
  2. v-enter-active: 定義過渡的狀態(tài)赂韵。在元素整個過渡過程中作用章鲤,在元素被插入時生效,在 transition/animation 完成之后移除怕轿。 這個類可以被用來定義過渡的過程時間偷崩,延遲和曲線函數(shù)。
  3. v-enter-to: 2.1.8版及以上 定義進(jìn)入過渡的結(jié)束狀態(tài)撞羽。在元素被插入一幀后生效(于此同時 v-enter 被刪除)阐斜,在 transition/animation 完成之后移除。
  4. v-leave: 定義離開過渡的開始狀態(tài)诀紊。在離開過渡被觸發(fā)時生效谒出,在下一個幀移除。
  5. v-leave-active: 定義過渡的狀態(tài)邻奠。在元素整個過渡過程中作用笤喳,在離開過渡被觸發(fā)后立即生效,在 transition/animation 完成之后移除碌宴。 這個類可以被用來定義過渡的過程時間杀狡,延遲和曲線函數(shù)。
  6. v-leave-to: 2.1.8版及以上 定義離開過渡的結(jié)束狀態(tài)贰镣。在離開過渡被觸發(fā)一幀后生效(于此同時 v-leave 被刪除)呜象,在 transition/animation 完成之后移除膳凝。

對于這些在 enter/leave 過渡中切換的類名,v- 是這些類名的前綴恭陡。使用 <transition name="my-transition" 可以重置前綴蹬音,比如 v-enter 替換為 my-transition-enter。

CSS過度

常用的過渡都是使用 CSS 過渡子姜。以下為示例代碼祟绊。

<div id="app2">
    <button @click="show = !show">toggle css</button>
    <transition name="slide-fade">
        <p v-if="show">CSS 過渡</p>
    </transition>
</div>
new Vue({
    el:'#app2',
    data:{
        show:true
    }
})
        .slide-fade-enter-active{
            transition: all .3s ease;
        }
        .slide-fade-leave-active{
            transition: all .8s cubic-bezier(0.68, -0.55, 0.27, 1.55);
        }
        .slide-fade-enter, .slide-fade-leave-to{
            transform: translateX(100px);
            opacity: 0;
        }

運(yùn)行結(jié)果



點擊按鈕就會看到動畫效果。

CSS動畫

CSS 動畫用法同 CSS 過渡哥捕,區(qū)別是在動畫中 v-enter 類名在節(jié)點插入 DOM 后不會立即刪除牧抽,而是在 animationend 事件觸發(fā)時刪除。
示例: (省略了兼容性前綴)

<div id="app3">
    <button @click="show = !show">toggle css</button>
    <transition name="bounce">
        <p v-if="show">css 動畫</p>
    </transition>
</div>
new Vue({
    el:'#app3',
    data:{
        show:true
    }
})
        .bounce-enter-active{
            animation: bounce-in .5s;
        }
        .bounce-leave-active{
            animation: bounce-in .5s reverse;
        }
        @keyframes bounce-in {
            0%{
                transform: scale(0);
            }
            50%{
                transform: scale(1.5);
            }
            100%{
                transform: scale(1);
            }
        }

運(yùn)行結(jié)果:


自定義過渡類名

我們可以通過以下特性來自定義過渡類名:

  • enter-class
  • enter-active-class
  • enter-to-class (>= 2.1.8 only)
  • leave-class
  • leave-active-class
  • leave-to-class (>= 2.1.8 only)

他們的優(yōu)先級高于普通的類名遥赚,這對于 Vue 的過渡系統(tǒng)和其他第三方 CSS 動畫庫扬舒,如 Animate.css 結(jié)合使用十分有用。
示例:

<link  rel="stylesheet" type="text/css">
<div id="app4">
    <button @click="show = !show">toggle coustom class</button>
    <transition name="bounce"
    enter-active-class="animated tada"
    leave-active-class="animated bounceOutRight">
        <p v-if="show">自定義過渡類名</p>
    </transition>
</div>
new Vue({
    el:'#app4',
    data:{
        show:true
    }
})

運(yùn)行結(jié)果:


animate.css的學(xué)習(xí)可以參考官網(wǎng):https://daneden.github.io/animate.css/

javascript鉤子

可以在屬性中聲明 JavaScript 鉤子

<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">
  <!-- ... -->
</transition>
methods: {
  // --------
  // 進(jìn)入中
  // --------
  beforeEnter: function (el) {
    // ...
  },
  // 此回調(diào)函數(shù)是可選項的設(shè)置
  // 與 CSS 結(jié)合時使用
  enter: function (el, done) {
    // ...
    done()
  },
  afterEnter: function (el) {
    // ...
  },
  enterCancelled: function (el) {
    // ...
  },
  // --------
  // 離開時
  // --------
  beforeLeave: function (el) {
    // ...
  },
  // 此回調(diào)函數(shù)是可選項的設(shè)置
  // 與 CSS 結(jié)合時使用
  leave: function (el, done) {
    // ...
    done()
  },
  afterLeave: function (el) {
    // ...
  },
  // leaveCancelled 只用于 v-show 中
  leaveCancelled: function (el) {
    // ...
  }
}

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

當(dāng)只用 JavaScript 過渡的時候, 在 enterleave 中愧薛,回調(diào)函數(shù) done 是必須的 晨炕。 否則,它們會被同步調(diào)用毫炉,過渡會立即完成瓮栗。

推薦對于僅使用 JavaScript 過渡的元素添加 v-bind:css="false",Vue 會跳過 CSS 的檢測瞄勾。這也可以避免過渡過程中 CSS 的影響费奸。

一個使用 Velocity.js 的簡單例子:

<div id="app5">
    <button @click="show = !show">toggle hook</button>
    <transition @before-enter="beforeEnter"
    @enter="enter"
    @leave="leave"
    :css="false">
        <p v-if="show">javascript 鉤子使用</p>
    </transition>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js"></script>
<script >
new Vue({
    el:'#app5',
    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:'15px', rotateZ:'50deg'}, {duration:600})
            Velocity(el, {rotateZ:'100deg'}, {loop:2})
            Velocity(el,{
                rotateZ:'45deg',
                translateY:'30px',
                translateX:'30px',
                opacity:0
            }, {complete:done})
        }
    }
})
</script>

運(yùn)行結(jié)果:


初始渲染的過度

可以通過appear 特性設(shè)置節(jié)點的在初始渲染的過渡
這里默認(rèn)和進(jìn)入和離開過渡一樣,同樣也可以自定義 CSS 類名进陡。

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

自定義 JavaScript 鉤子:

<transition
  appear
  v-on:before-appear="customBeforeAppearHook"
  v-on:appear="customAppearHook"
  v-on:after-appear="customAfterAppearHook"
  v-on:appear-cancelled="customAppearCancelledHook"
>
  <!-- ... -->
</transition>

示例代碼:

<!--初始渲染-->
<div id="app6">
    <transition appear
                appear-active-class="animated tada">
        <p>初始畫面</p>
    </transition>
</div>
new Vue({
    el:'#app6',
    data:{
        show:true
    }
})

運(yùn)行結(jié)果:



在界面加載該元素時愿阐,會有個過渡效果。

本文為原創(chuàng)趾疚,轉(zhuǎn)載請注明出處
上一節(jié):Vue學(xué)習(xí)筆記入門篇——組件雜項
返回目錄
下一節(jié):Vue學(xué)習(xí)筆記進(jìn)階篇——多元素及多組件過渡

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缨历,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盗蟆,更是在濱河造成了極大的恐慌戈二,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喳资,死亡現(xiàn)場離奇詭異觉吭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)仆邓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門鲜滩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伴鳖,“玉大人,你說我怎么就攤上這事徙硅“衲簦” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵嗓蘑,是天一觀的道長须肆。 經(jīng)常有香客問我,道長桩皿,這世上最難降的妖魔是什么豌汇? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮泄隔,結(jié)果婚禮上拒贱,老公的妹妹穿的比我還像新娘。我一直安慰自己佛嬉,他們只是感情好逻澳,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著暖呕,像睡著了一般斜做。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上湾揽,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天陨享,我揣著相機(jī)與錄音,去河邊找鬼钝腺。 笑死,一個胖子當(dāng)著我的面吹牛赞厕,可吹牛的內(nèi)容都是我干的艳狐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼皿桑,長吁一口氣:“原來是場噩夢啊……” “哼毫目!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诲侮,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤镀虐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沟绪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刮便,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年绽慈,在試婚紗的時候發(fā)現(xiàn)自己被綠了恨旱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辈毯。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搜贤,靈堂內(nèi)的尸體忽然破棺而出谆沃,到底是詐尸還是另有隱情,我是刑警寧澤仪芒,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布唁影,位于F島的核電站,受9級特大地震影響掂名,放射性物質(zhì)發(fā)生泄漏据沈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一铆隘、第九天 我趴在偏房一處隱蔽的房頂上張望卓舵。 院中可真熱鬧,春花似錦膀钠、人聲如沸掏湾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽融击。三九已至,卻和暖如春雳窟,著一層夾襖步出監(jiān)牢的瞬間尊浪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工封救, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留拇涤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓誉结,卻偏偏與公主長得像鹅士,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惩坑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容