原本在一般頁面要製造一些簡單的動畫效果,只要掌控 class 和 Css 就好了,但是如果要在框架內做這些動態效果,如何做?
在 Vue 裡有它的特殊做法,必須把享有動態效果的元素,以<transition>
的標籤包起來,並給予一個name
的屬性,然後在 CSS 裡,以這個name
來作為 class 的名稱,並加上動畫不同時期的後綴,來達到動態效果。
先來看一下 Codepen VueJs Transitioning Single Elements/Component 過渡與動畫效果
我們先來看一張官方上的示意圖:
要指定進出場的樣式需要搭配 Vue 指定的後綴詞,進、出場個分三個階段
進場:
階段 | 進場 Enter | 出場 Leave |
---|---|---|
開始 | v-enter | v-leave |
結束 | v-enter-to | v-leave-to |
整個過程 | v-enter-active | v-leave-active |
再依照每個過程,指定不同的效果。而表中的v
是在沒有給<transition>
名字的時候,如果有給name
,則把v
用我們給的name
替換就好了。
淡入淡出的過度效果 Transition
以淡入淡出的效果來說,在 HTML 需要先將<transition>
把我們要做動態效果的元素包住,例如我們希望點一個按鈕,讓文字淡入淡出切換,就可以寫成:
1 | <div id="app1"> |
在文字的<p>
標籤內,我們可以給v-if
或v-show
,這兩個效果是一樣的。
Vue 實例的部分
1 | const vm1 = new Vue({ |
然後在 CSS 裡依上述規則指定,在進場時透明度為 0 漸變為 100,而出場則反之。而按鈕則控制進出場的切換。
1 | /*指定進場*/ |
動畫效果的放大縮小 Animation
我們也可以以動畫的方式來將組件變大變小與出場,也是一樣使用 Enter 和 Leave 的三個階段,分別設定。
CSS 的部分
1 | /* 使用Animation 動畫 */ |
HTML 部分
因為文字段落<p>
標簽是行內元素,所以放大縮小會以整行的大小來算,所以會看不出小果,最好將這段該成display: inline-block
就可比較清出的看出變化效果。
1 | <!-- Animation 動畫 --> |
Vue 實例的部分
1 | const vm4 = new Vue({ |
發現原本可以簡單在 Css 裡做出的的動畫效果,在框架裡做還是有些綁手綁腳,如果讓這些小果更容易操控,得要先了解 Vue 是怎麼處理這些效果,在官網的解釋算是蠻清楚的,但幫自己要做一些簡單的圖片入場效果,就開始感到有點綁手綁腳,有點可惜。
如果對此部分有興趣的話,除了可以看看官方解釋,也推薦「Summer。桑莫。夏天」的部落格,至少比較親和。
Transitioning Single Elements/Components
官方文件:進入/離開 & 列表過渡 — Vue.js