Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
渡系統是Vue.js為DOM動畫效果提供的一個特性,
它能在元素從DOM中插入或移除時觸發你的CSS過渡(transition)和動畫(animation),也就是說在DOM元素發生變化時為其添加特定的class類名,從而產生過渡效果。
除了CSS過渡外,Vue.js的過渡系統也支持javascript的過渡,
通過暴露過渡系統的鉤子函數,我們可以在DOM變化的特定時機對其進行屬性的操作,產生動畫效果。
SS過渡的用法
首先舉一個例子來說明CSS過渡系統的使用方式:
<div v-if="show" transition="my-startup"></div>
var vm = new Vue({
el : '#app',
data: {
show : false
}
});
首先在模板中用transition綁定一個DOM元素,并且使用v-if指令使元素先處于未被編譯狀態。然后在控制臺內手動調用vm.show = true, 就可以看到DOM元素最后輸出為:
<div class="my-startup-transition"></div>
我們可以看到在DOM元素完成編譯后,過渡系統自動給元素添加了一個my-startup-transition的class類名。
CSS過渡鉤子函數
Vue.js提供了在插入或DOM元素時類名變化的鉤子函數,可以通過Vue.transition('name', {})的方式來執行具體的函數操作。
顯示聲明過渡類型
Vue.js可以指定過渡元素監聽的結束事件的類型, 例如:
Vue.transition('done-type', {
type: 'animation'
})
此時Vue.js就只監聽元素的animationend事件,避免元素上還存在transition時導致的結束事件觸發不一致。
自定義過渡類名
除了使用默認的類名*-enter, *-leave外,Vue.js也允許我們自定義過渡類名,例如:
Vue.transition('my-startup', {
enterClass: 'fadeIn',
leaveClass: 'fadeOut'
})
我們可以通過上述鉤子函數的例子,觀測元素的類名變化:
Vue.js官方推薦了一個CSS動畫庫,animate.css,配合自定義過渡類名使用,
可以達到非常不錯的效果。
【B站推薦】Vue全套視頻教程,從vue2.0到vue3.0一套全覆蓋,前端必會的框架教程包含4套優質VUE練手項目,從零開始入門到精通,一套搞定。_嗶哩嗶哩_bilibili
章節我們主要介紹 Vue.js 的過渡效果與動畫效果。包括如何編寫自定義 CSS 動畫、如何配合第三方 CSS 動畫庫、過渡鉤子函數的使用、如何使用第三方 JavaScript 動畫庫。本小節的內容相對之前有些難度,同學們在閱讀一遍之后如果不能完全掌握,建議反復閱讀,并把本小節的所有案例自己實現一遍,相信通過多次的練習一定可以掌握。
Vue 在插入、更新或者移除 DOM 時,提供多種不同方式的應用過渡效果。 包括以下工具: 1、在 CSS 過渡和動畫中自動應用 class; 2、配合使用第三方 CSS 動畫庫,如 Animate.css; 3、在過渡鉤子函數中使用 JavaScript 直接操作 DOM; 4、配合使用第三方 JavaScript 動畫庫,如 Velocity.js。
使用 transition 組件包裹需要使用過渡效果的 DOM 元素。例如:
<transition name = "transition-name">
<div>...</div>
</transition>
接下來讓我們先看一個淡入淡出效果的實現代碼:
實例演示
<!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>
12345678910111213141516171819202122232425262728293031323334353637
運行案例點擊 "運行案例" 可查看在線運行效果
代碼解釋:
那么,transition 組件是如何做到這樣的過渡效果的呢?
我想,同學們肯定猜想到當元素切換狀態的時候,我們定義的樣式會作用于標簽元素 <p>。那么,到底是不是這樣呢?
打開控制臺,檢索到 <p> 標簽上,我們可以清晰地看到:
實際上 Vue 在元素顯示與隱藏的過渡中,提供了 6 個 class 來切換:
對于這些在過渡中切換的類名來說,如果你使用一個沒有名字的 <transition>,則 v- 是這些類名的默認前綴。如果你使用了 <transition name="test-transition">,那么 v 會替換為 test-transition。例如:test-transition-enter、test-transition-enter-active、test-transition-leave…
在日常開發中,我們經常會使用 CSS 過渡來實現一些簡單的動畫效果。接下來我們用一個示例來學習如何使用:
實例演示
<!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>
"運行案例" 可查看在線運行效果
代碼解釋:
同樣,我們可以使用 CSS 動畫來實現元素的過渡效果。CSS 動畫用法類似 CSS 過渡,在過渡的不同階段對應的 Class 會作用于元素。但是在動畫中 v-enter 類名在節點插入 DOM 后不會立即刪除,而是在 animationend 事件觸發時刪除。 相信同學們在日常業務開發中一定使用過 Dialog,接下來我們就使用 CSS 動畫來實現它的過渡效果:
實例演示
<!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>
"運行案例" 可查看在線運行效果
代碼解釋:
在之前的兩個案例中,我們通過給 transition 設置 name 屬性來指定元素在不同階段的樣式類名,但有時候希望使用自定義的過渡類名,我們可以通過給 transition 設置以下屬性來達到需求:
自定義過渡的類名優先級高于普通的類名,這樣就能很好地與第三方(如:animate.css)的動畫庫結合使用。
在很多情況下,Vue 可以自動得出過渡效果的完成時機。默認情況下,Vue 會等待其在過渡效果的根元素的第一個 transitionend 或 animationend 事件。然而也可以不這樣設定 —— 比如,我們可以擁有一個精心編排的一系列過渡效果,其中一些嵌套的內部元素相比于過渡效果的根元素有延遲的或更長的過渡效果。
在這種情況下你可以用 組件上的 duration 屬性定制一個顯性的過渡持續時間 (以毫秒計):
<transition :duration="1000">...</transition>
你也可以定制進入和移出的持續時間:
<transition :duration="{ enter: 400, leave: 600 }">...</transition>
transition 組件在過渡的不同階段會觸發相應的鉤子函數:
<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>
這些鉤子函數可以結合 CSS transitions/animations 使用,也可以單獨使用。
當只用 JavaScript 過渡的時候,在 enter 和 leave 中必須使用 done 進行回調。否則,它們將被同步調用,過渡會立即完成。
推薦對于僅使用 JavaScript 過渡的元素添加 v-bind:css="false",Vue 會跳過 CSS 的檢測。這也可以避免過渡過程中 CSS 的影響。
接下來我們來看一個使用鉤子函數和 Velocity.js 實現過渡動畫的例子:
實例演示
<!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">
切換顯示狀態
</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>
"運行案例" 可查看在線運行效果
代碼解釋:
有時候我們希望給元素設置初始渲染的過渡效果,可以通過給 transition 設置 appear 的 attribute:
<transition appear>
<!-- ... -->
</transition>
這里默認和進入 / 離開過渡一樣,同樣也可以自定義 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>
接下來我們看一個完整的示例:
實例演示
<!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>
"運行案例" 可查看在線運行效果
代碼解釋:
本小節我們介紹了如何使用 transition 實現過渡和動畫效果,主要包括以下知識點:
transform:可以對元素對象進行旋轉rotate、縮放scale、移動translate、傾斜skew、矩陣變形matrix。
示例:
transform: rotate(90deg) scale(1.5,0.8) translate(100px,50px) skew(45deg,45deg); /*矩陣變形*/ matrix(<number>,<number>,<number>,<number>,<number>,<number>); /*透視*/ perspective(length);
transition:過度屬性
transition:過度效果的css屬性名 過度效果時長 速度效果的速度曲線 過度效果開始時間;
transition: property duration timing-function delay;/*示例*/transition:1s ease all;-webkit-tansition:1s ease all;-moz-transition:1s ease all;-o-transition:1s ease all;
rotate():二維空間旋轉元素。
若元素設置了perspective值,可用rotate3d()實現三維空間內旋轉。
rotateX(angele)/*相當于rotate3d(1,0,0,angle)指定在三維空間內的X軸旋轉*/rotateY(angele)/*相當于rotate3d(0,1,0,angle)指定在三維空間內的Y軸旋轉*/rotateZ(angele)/*相當于rotate3d(0,0,1,angle)指定在三維空間內的Z軸旋轉*/
scale()
scaleX(<number>)/*只在X軸(水平方向)縮放元素*/scaleY(<number>)/*只在Y軸(垂直方向)縮放*/scaleZ(<number>)/*只在Z軸縮放,前提:元素設定透視值*/
translate([,]):移動,是位移量。
translateX(<translation-value>);/*只在X軸(水平方向)移動*/translateY(<translation-value>);/*只在Y軸(垂直方向)移動*/translateZ(<translation-value>);/*只在Z軸移動,前提:元素設置透視值*/
skew():傾斜
skewX(<angle>);/*只在X軸(水平)傾斜*/skewY(<angle>);/*只在Y軸(垂直)傾斜*/
matrix(a,c,e,b,d,f):矩陣變形,c、e的值用正弦或余弦值表示。
a:表示scaleX(); X軸縮放
c:skewY(); Y軸傾斜
e:skewX(); X軸傾斜
b:scaleY(); Y軸縮放
d:translateX() X軸移動
f:translateY() Y軸移動
transform:matrix(<number>,<number>,<number>,<number>,<number>,<number>);
perspective():透視
.wrap{ perspective:1000px; }.wrap .child{ transform:perspective(1000px); }
transition-property:過度的屬性
transition-property:all;/*針對所有元素都有過度效果*/transition-property:none;/*沒有元素有過度效果*/transition-property:ident;/*指定css屬性有過度效果,例如width*/
transition-duration:過度時間
transition-delay:延遲時間,為負數時,過度動作會從該時間點開始顯示,之前的動作會被截斷。
transition-timing-function:過度效果,默認ease。
transition-timing-function:ease;/*緩解效果,等同于cubic-bezier(0.25,0.1,0.25,1.0)函數,既立方貝塞爾*/transition-timing-function:linear;/*線性效果,等同于cubic-bezier(0.0,0.0,1.0,1.0)函數*/transition-timing-function:ease-in;/*漸顯效果,等同于cubic-bezier(0.42,0,1.0,1.0)函數*/transition-timing-function:ease-out;/*漸隱效果,等同于cubic-bezier(0,0,0.58,1.0)函數*/transition-timing-function:ease-in-out;/*漸顯漸隱效果,等同于cubic-bezier(0.42,0,0.58,1.0)函數*/transition-timing-function:cubic-bezier;/*特殊的立方貝塞爾曲線效果*/
animation-name:動畫名稱,必須與規則@keyframes配合使用,因為動畫名稱由@keyframes定義,如果提供多個屬性值用逗號隔開。
@keyframes相當于一個命名空間,后面跟一個名詞,如果在class中的animation-name定義了與之對應的name就可以執行動畫。定義動畫時可直接使用關鍵字from和to,從一種狀態過度到另一種狀態。
.animation_name{ left:0; top:100px; position: absolute; -webkit-animation: 0.5s 0.5s ease infinite alternate; -moz-animation: 0.5s 0.5s ease infinite alternate; -webkit-animation-name:demo; -moz-animation-name:demo; } @-webkit-keyframes demo{ from{left:0;} to{left:400px;} } @-webkit-keyframes demo1{ 0%{left:0;} 50%{left:200px;} 100%{left:400px;} }
animation-duration:動畫時間
animation-timing-function:播放方式,取值如下:
ease:緩解效果,等同于cubic-bezier(0.25,0.1,0.25,1.0)函數,既立方貝塞爾。
linear:線性效果
ease-in:漸顯效果
ease-out:漸隱效果
ease-in-out:漸顯漸隱效果
step-start:馬上跳轉到動畫結束狀態
step-end:保持動畫開始狀態,到動畫執行時間結束,馬上跳轉到動畫結束狀態
step([,[start | end]]?):第一個參數number為指定的間隔數,即把動畫分為n步階段性顯示,第二個參數默認為end,設置最后一步狀態,start為結束時的狀態,end為開始時的狀態,若設置與animation-fill-mode的效果沖突,以animation-fill-mode的設置為動畫結束狀態。
cubic-bezier(,,,):特殊的立方賽貝爾曲線效果
animation-delay:開始播放時間
animation-iteration-count:播放次數,取值為infinite時表示無限循環播放
animation-direction:播放方向,取值為:
normal:正常方向
reverse:動畫反向運行,方向始終與normal相仿
alternate:動畫會循環正反交替運動
animation-fill-mode:播放后的狀態,取值:
none:默認值,不設置
forwards:結束后保持動畫結束的狀態
backwards:結束后返回動畫開始時狀態
both:結束后可遵循forwards和backwards兩個規則
animation-play-state:檢索或設置對象動畫的狀態,取值:
running:默認,運動
paused:暫停
transform-origin:變形原點,transform的參照點,默認為元素的中心點。有兩個參數,參數一為橫坐標,參數二為縱坐標。
percentage:用百分比指定坐標值,可負
length:用長度指定坐標值,可負
left center right:水平方向取值
top center bottom:垂直方向取值
perspective-prigin:透視原點,定義在X軸和Y軸的3D元素,允許改變3D元素的底部位置,定義該屬性時,它是一個元素的子元素,透視圖,而不是元素本身。
注意:使用該屬性必須和perspective屬性一起用,只影響3D轉換的元素。
取值:percentage、length、left、center、right、top、center、bottom
backface-visibility:隱藏內容的背面,默認情況下背面可見,反轉后變換的內容仍然可見,當backface-visibility設置hidden時,旋轉后內容將隱藏,旋轉后正面將不再可見。
取值:visible、hidden
transform-style:3D呈現,設置內嵌的元素在3D空間如何呈現,有兩個值:
flat:所有子元素在2D平面呈現
preserve-3d:保留3D空間
*請認真填寫需求信息,我們會在24小時內與您取得聯系。