Vue2.0 Transition常見用法全解惑

Vue2.0的過渡系統(tǒng)(transition)有了很大的改變,想把1.0的項(xiàng)目遷移到2.0,著實(shí)需要費(fèi)一些功夫哮塞,今天我就要把vue2.0的過渡系統(tǒng)的用法搞清楚南蹂,因?yàn)橹按_實(shí)踩了不少坑佃乘。這里只涉及單元素/組件的過渡實(shí)現(xiàn)局蚀,vue2.0的文檔中還講到了初始渲染的過渡、多個(gè)元素的過渡恕稠、多個(gè)組件的過渡和列表過渡琅绅,他們的過渡效果實(shí)現(xiàn)方式和單元素/組件的類似,我感覺實(shí)際項(xiàng)目中用的不太多吧鹅巍,有興趣的同學(xué)可以去了解一下千扶,文檔這里說的多個(gè)元素和多個(gè)組件和我們的理解可能不太一樣,一定要仔細(xì)閱讀文檔骆捧,搞清楚到底說的是什么樣的情況澎羞。

什么是過渡

Vue只有在插入,更新或者移除DOM元素時(shí)才會(huì)應(yīng)用過渡效果敛苇,過渡效果的應(yīng)用可以通過不同方式實(shí)現(xiàn)妆绞,官方文檔中提到了如下幾種:

  1. 在CSS過渡和動(dòng)畫中自動(dòng)應(yīng)用class;
  2. 配合使用第三方的CSS動(dòng)畫庫枫攀,如Animate.css括饶;
  3. 在過渡鉤子函數(shù)中使用JavaScript直接操作DOM;
  4. 配合使用第三方JavaScript動(dòng)畫庫来涨,如Velocity图焰;

上面四種方式其實(shí)主要就是兩種,一個(gè)是利用CSS過渡或者動(dòng)畫蹦掐,另一個(gè)是利用JavaScript鉤子函數(shù)技羔。

怎么應(yīng)用過渡到元素/組件上

要想使元素或者組件應(yīng)用到我們所寫的過渡動(dòng)畫,需要使用vue提供的transition來封裝組件成為過渡組件卧抗,transition需要與如下情景中的任一種一起使用:

  • v-if(條件渲染)
  • v-show(條件展示)
  • 動(dòng)態(tài)組件
  • 在組建的根節(jié)點(diǎn)上藤滥,并且被vue實(shí)例DOM方法觸發(fā),如appendTo方法把組件添加到某個(gè)根節(jié)點(diǎn)上

當(dāng)需要插入或者刪除封裝成過渡元素的元素時(shí)社裆,vue將做如下事情:

  1. 查找目標(biāo)元素是否有CSS過渡或者動(dòng)畫拙绊,如果有就在適當(dāng)?shù)臅r(shí)候進(jìn)行處理;
  2. 如果過渡組件設(shè)置了JavaScript鉤子函數(shù)浦马,vue會(huì)在相應(yīng)階段調(diào)用鉤子函數(shù)时呀;
  3. 如果以上兩者都沒有张漂,DOM操作(插入或者刪除)就在下一幀立即執(zhí)行晶默。

CSS過渡

先舉一個(gè)典型的CSS過渡的例子:

<!-- 首先將要過渡的元素用transition包裹,并設(shè)置過渡的name航攒,然后添加觸發(fā)這個(gè)元素過渡的按鈕(實(shí)際項(xiàng)目中不一定是按鈕磺陡,任何能觸發(fā)過渡組件的DOM操作的操作都可以) -->
<div>
  <button @click="show=!show">show</button>
  <transition name="fade">
    <p v-show="show">hello</p>
  </transition>
</div>
// 接著為過渡類名添加規(guī)則
&.fade-enter-active, &.fade-leave-active
  transition: all 0.5s ease     
&.fade-enter, &.fade-leave-active
  opacity: 0 

封裝上面的代碼,就可以實(shí)現(xiàn)一個(gè)簡單的動(dòng)畫了,CSS的transition屬性是用來設(shè)置過渡總體效果的币他,具體可參考:http://www.w3cplus.com/content/css3-transition坞靶。

CSS過渡類名

組件過渡過程中,會(huì)有四個(gè)CSS類名進(jìn)行切換蝴悉,這四個(gè)類名與上面transition的name屬性有關(guān)彰阴,比如name="fade",會(huì)有如下四個(gè)CSS類名:

  1. fade-enter:進(jìn)入過渡的開始狀態(tài)拍冠,元素被插入時(shí)生效尿这,只應(yīng)用一幀后立即刪除;
  2. fade-enter-active:進(jìn)入過渡的結(jié)束狀態(tài)庆杜,元素被插入時(shí)就生效射众,在過渡過程完成之后移除;
  3. fade-leave:離開過渡的開始狀態(tài)晃财,元素被刪除時(shí)觸發(fā)叨橱,只應(yīng)用一幀后立即刪除;
  4. fade-leave-active:離開過渡的結(jié)束狀態(tài)断盛,元素被刪除時(shí)生效罗洗,離開過渡完成之后被刪除;

從上面四個(gè)類名可以看出钢猛,fade-enter-active和fade-leave-active在整個(gè)進(jìn)入或離開過程中都有效栖博,所以CSS的transition屬性在這兩個(gè)類下進(jìn)行設(shè)置。
上面示例中厢洞,fade-enter和fade-leave-active類設(shè)置CSS為opacity:0仇让,說明過渡剛進(jìn)入和離開的時(shí)候透明度為0,即不顯示躺翻。當(dāng)然還可以設(shè)置其他的CSS屬性丧叽,transform屬性是除了opacity之外經(jīng)常在這里被用到的,transform用法可參考http://www.w3cplus.com/content/css3-transition

CSS動(dòng)畫

組件過渡的實(shí)現(xiàn)不僅可以通過CSS過渡還可以通過CSS動(dòng)畫(animation)實(shí)現(xiàn)公你,建議先了解一下CSS3 Animation踊淳,這里還是給個(gè)例子:

<div>
  <button @click="show=!show">show</button>
  <transition name="fold">
    <p v-show="show">hello</p>
  </transition>
</div>
.fold-enter-active {
  animation-name: fold-in;
  animation-duration: .5s;
}
.fold-leave-active {
  animation-name: fold-out;
  animation-duration: .5s;
}
@keyframes fold-in {
  0% {
    transform: translate3d(0, 100%, 0);
  }
  50% {
    transform: translate3d(0, 50%, 0);
  }
  100% {
    transform: translate3d(0, 0, 0);
  }
}
@keyframes fold-out {
  0% {
    transform: translate3d(0, 0, 0);
  }
  50% {
    transform: translate3d(0, 50%, 0);
  }
  100% {
    transform: translate3d(0, 100%, 0);
  }
}

如果預(yù)先了解了CSS動(dòng)畫(上面給了鏈接),上面代碼還是很好理解的陕靠,要注意的是CSS動(dòng)畫中迂尝,fold-enter類名在節(jié)點(diǎn)插入DOM后不會(huì)立即刪除,而是在animationed事件觸發(fā)時(shí)刪除剪芥。

自定義過渡類名

上面的四個(gè)過渡類名都是根據(jù)transition的name屬性自動(dòng)生成的垄开,那么能否自己定義這四個(gè)類名呢?答案是可以的税肪,通過enter-class溉躲、enter-active-class榜田、leave-class、leave-active-class這四個(gè)特性來定義锻梳。

<div>
  <button @click="show=!show">show</button>
  <transition 
    name="fade"
    enter-class="fade-in-enter"
    enter-active-class="fade-in-active"
    leave-class="fade-out-enter"
    leave-active-class="fade-out-active"
  >
    <p v-show="show">hello</p>
  </transition>
</div>
&.fade-in-active, &.fade-out-active
  transition: all 0.5s ease     
&.fade-in-enter, &.fade-out-active
  opacity: 0 

上面代碼中箭券,原來默認(rèn)的fade-enter類對(duì)應(yīng)fade-in-enter,fade-enter-active類對(duì)應(yīng)fade-in-active疑枯,依次類推辩块。

JavaScript鉤子函數(shù)

除了用CSS過渡的動(dòng)畫來實(shí)現(xiàn)vue的組件過渡,還可以用JavaScript的鉤子函數(shù)來實(shí)現(xiàn)荆永,在鉤子函數(shù)中直接操作DOM庆捺。我們可以在屬性中聲明以下鉤子:

<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)入
  // 設(shè)置過渡進(jìn)入之前的組件狀態(tài)
  beforeEnter: function (el) {
    // ...
  },
  // 設(shè)置過渡進(jìn)入完成時(shí)的組件狀態(tài)
  enter: function (el, done) {
    // ...
    done()
  },
  // 設(shè)置過渡進(jìn)入完成之后的組件狀態(tài)
  afterEnter: function (el) {
    // ...
  },
  enterCancelled: function (el) {
    // ...
  },
  // 過渡離開
  // 設(shè)置過渡離開之前的組件狀態(tài)
  beforeLeave: function (el) {
    // ...
  },
  // 設(shè)置過渡離開完成時(shí)地組件狀態(tài)
  leave: function (el, done) {
    // ...
    done()
  },
  // 設(shè)置過渡離開完成之后的組件狀態(tài)
  afterLeave: function (el) {
    // ...
  },
  // leaveCancelled 只用于 v-show 中
  leaveCancelled: function (el) {
    // ...
  }
}

上面的鉤子函數(shù)中可以進(jìn)行任何你想做的DOM操作。
小技巧:如果你只想設(shè)置組件過渡進(jìn)入的效果而不想有組件過渡離開的效果屁魏,這時(shí)你就可以用鉤子函數(shù)滔以,只設(shè)置beforeEnter、enter氓拼、afterEnter這幾個(gè)鉤子函數(shù)就可以了你画。

目前接觸到的關(guān)于vue transition相關(guān)的就這么多了,當(dāng)然vue transition的用法可不止這么點(diǎn)桃漾,這需要我以后的慢慢積累坏匪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市撬统,隨后出現(xiàn)的幾起案子适滓,更是在濱河造成了極大的恐慌,老刑警劉巖恋追,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凭迹,死亡現(xiàn)場離奇詭異,居然都是意外死亡苦囱,警方通過查閱死者的電腦和手機(jī)嗅绸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撕彤,“玉大人鱼鸠,你說我怎么就攤上這事「Γ” “怎么了蚀狰?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長职员。 經(jīng)常有香客問我麻蹋,道長,這世上最難降的妖魔是什么廉邑? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任哥蔚,我火速辦了婚禮,結(jié)果婚禮上蛛蒙,老公的妹妹穿的比我還像新娘糙箍。我一直安慰自己,他們只是感情好牵祟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布深夯。 她就那樣靜靜地躺著,像睡著了一般诺苹。 火紅的嫁衣襯著肌膚如雪咕晋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天收奔,我揣著相機(jī)與錄音掌呜,去河邊找鬼。 笑死坪哄,一個(gè)胖子當(dāng)著我的面吹牛质蕉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翩肌,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼模暗,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了念祭?” 一聲冷哼從身側(cè)響起兑宇,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粱坤,沒想到半個(gè)月后隶糕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡站玄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年若厚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜒什。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡测秸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出灾常,到底是詐尸還是另有隱情霎冯,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布钞瀑,位于F島的核電站沈撞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏雕什。R本人自食惡果不足惜缠俺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一显晶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壹士,春花似錦磷雇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盒使,卻和暖如春崩掘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背少办。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工苞慢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人英妓。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓枉疼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鞋拟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骂维,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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