vue 入门笔记 12 Vue 过度动画

                                                         Vue 过度动画


Vue 过度

       1,利用 class 名称

       2,利用 css 动画库

       3,钩子函数 (生命周期函数)

       4,第三方  js 库

       5,多元素过度

 

1,利用 class 名称

Vue 提供的 transition 组件

在进入/离开的过渡中,会有 6 个 class 切换。

   1 v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。

   2 v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。

   3 v-enter-to: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter 被移除),在过渡/动画完成之后移除。

   4 v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。

   5 v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。

   6 v-leave-to: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave 被删除),在过渡/动画完成之后移除。

vue 入门笔记 12 Vue 过度动画

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<style>
		#box {
			width: 300px;
			height: 300px;
			background: aquamarine;
		},
        .fade-leave-active /* .fade-leave-active */{
			transition: 1s;
		},
		.fade-leave-to/* .fade-leave-to */{
			opacity: 0;
		},
		.fade-enter{
			
		},
		.fade-enter-active{
			
		}
	</style>
	<body>

		<div id="app">
			<button v-on:click="buttonclick">按钮</button>
			<transition name="fade">
				<div id=box v-show="showbox">
				</div>
			</transition>
		</div>

		<!-- 开发环境版本,包含了有帮助的命令行警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

		<script>
			new Vue({
				el: "#app",
				data: {
					showbox: true
				},
				methods: {
					buttonclick: function() {
						console.log("buttonclick");
						this.showbox = !this.showbox;
					}
				},
				computed: {

				}
			})
		</script>






	</body>
</html>

 

  2,利用 css 动画库

index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<style>
		#box {
			width: 300px;
			height: 300px;
			background: aquamarine;
		}
	</style>
	<link rel="stylesheet" href="bower_components/animate.css/animate.css" >
	<body>

		<div id="app">
			<button v-on:click="btnclick"> Button </button>
			<transition enter-active-class="animated zoomInLeft" leave-active-class="animated zoomOutRight">
				<div id="box" v-show="btncilck"></div>
				
			</transition>
		</div>




		<!-- 开发环境版本,包含了有帮助的命令行警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>



		<script>
			new Vue({
				el: "#app",
				data: {
					btncilck: true
				},
				methods: {
					btnclick: function() {
						this.btncilck = !this.btncilck;
						//console.log("this.btncilck:"+this.btncilck)
					}
				},
				computed: {

				}
			})
		</script>
	</body>
</html>

 

3,钩子函数 (生命周期函数)

可以在属性中声明 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>

index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<style>
		#box {
			width: 12.5rem;
			height: 12.5rem;
			background: #7FFFD4;
		}
		.fade-enter-active, .fade-leave-active{
			transition:   1.5s;
		}
		.fade-enter, .fade-leave-to{
			opacity: 0;
		}
	</style>
	<body>


		<div id="app">
			<button v-on:click="show = !show">button</button>
			<transition name=fade
			   v-on:before-enter="beforeEnter"
			   v-on:after-enter ="afterEnter"
			   v-on:before-leave="beforeLeave"
			>
				<div id="box"  v-show="show">
			</transition>
		</div>
		</div>

		<!-- 开发环境版本,包含了有帮助的命令行警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

		<script>
			new Vue({
				el: "#app",
				data: {
					show: true
				},
				methods: {
					beforeEnter:function(el){
						console.log("beforeEnter");
						el.innerHTML ="进入之前!";
					},
					afterEnter:function(el){
						console.log("afterEnter");
						el.innerHTML +="\r\n进入之后!";
					},
					beforeLeave:function(el){
						console.log("beforeLeave");
					}
				},
				computed: {

				}
			})
		</script>

	</body>
</html>

  4,第三方  js 库

<script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js"></script>

index.html 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<style>
		#box {
			width: 12.5rem;
			height: 12.5rem;
			background: #7FFFD4;
		}
	</style>
	<body>


		<div id="app">
			<button v-on:click="show = !show">button</button>
			<transition v-on:before-enter="beforeEnter" v-on:enter="enter" v-on:leave="leave" v-bind:css="false">
				<div id="box" v-show="show">
			</transition>
		</div>
		</div>


		<!-- 开发环境版本,包含了有帮助的命令行警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

		<script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js"></script>

		<script>
			new Vue({
				el: "#app",
				data: {
					show: true
				},
				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
						})
					}
				},
				computed: {

				}
			})
		</script>
	</body>
</html>

 

5,多元素过度

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<link rel="stylesheet" href="bower_components/animate.css/animate.css" >
	</head>
	<style>
		#box {
			width: 300px;
			height: 300px;
			background: aquamarine;
		}
	</style>
	<body>


		<div id="app">
			<button v-on:click="btnclick"> Button </button>
			<transition-group
				enter-active-class="animated zoomInLeft" leave-active-class="animated zoomOutRight"
			>
				<div id="box"  :key="1" v-show="btncilck"></div>
				<div id="box"  v-bind:key="2" v-show="btncilck"></div>
				
			</transition-group>
		</div>


		<!-- 开发环境版本,包含了有帮助的命令行警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

		<script>
			new Vue({
				el: "#app",
				data: {
					btncilck: true
				},
				methods: {
					btnclick: function() {
						this.btncilck = !this.btncilck;
						//console.log("this.btncilck:"+this.btncilck)
					}
				},
				computed: {

				}
			})
		</script>
	</body>
</html>