前言
系列文章目录:
老师的课件笔记,不含视频 https://www.aliyundrive.com/s/B8sDe5u56BU
1. 绑定class样式实现动画效果
main.js
import Vue from 'vue' import App from './App.vue' //关闭vue的生产提示 Vue.config.productionTip = false new Vue({ render: h => h(App) }).$mount('#app')
App.vue
<template> <div class="app"> <Test></Test> </div> </template> <script> //导入子组件 import Test from './components/Test.vue' export default { name: 'App', components: { Test } } </script> <style scoped> </style>
Test.vue
<template> <div> <button @click="changeShow">显示/隐藏</button> <h1 :class="animation" v-show="isShow">hello world</h1> </div> </template> <script> export default { name: 'Test', data() { return { // 控制显示与隐藏 isShow: false, // 需要进行绑定的样式 animation: '' } }, methods: { changeShow() { // 如果是隐藏状态 if (!this.isShow) { // 更改为显示状态,并且绑定进入样式 this.isShow = true this.animation = 'enter' } else { // 如果不为隐藏状态 // 更改为隐藏状态,绑定离开样式 this.isShow = false this.animation = 'leave' } } } } </script> <style scoped> h1 { background-color: orange; } /* 进入动画 */ .enter { animation: sgg 0.5s linear; } /* 离开动画 */ .leave { animation: sgg 0.5s linear reverse; } /* 自定义动画 */ @keyframes sgg { from { transform: translateX(-100%); } to { transform: translateX(0px); } } </style>
2. transition 标签实现动画效果
2.1 语法
vue规定,想要让哪个元素具有动画效果,就使用 transition 标签将该元素进行包裹,vue会在合适的时机为元素加上动画效果。
<transition> <h1 v-show="isShow">hello world</h1> </transition>
要实现动画效果,还需要将动画的命名修改为符合vue的规定,进入页面的动画的命名为v-enter-active
,离开页面的动画的命名为v-leave-active
。
/* 进入动画 */ .v-enter-active { animation: sgg 0.5s linear; } /* 离开动画 */ .v-leave-active { animation: sgg 0.5s linear reverse; } /* 自定义动画 */ @keyframes sgg { from { transform: translateX(-100%); } to { transform: translateX(0px); } }
2.2 动画实现
Test.vue
<template> <div> <button @click="changeShow">显示/隐藏</button> <transition> <h1 v-show="isShow">hello world</h1> </transition> </div> </template> <script> export default { name: 'Test', data() { return { // 控制显示与隐藏 isShow: false, } }, methods: { changeShow() { // 如果是隐藏状态 if (!this.isShow) { // 更改为显示状态 this.isShow = true } else { // 如果不为隐藏状态 // 更改为隐藏状态 this.isShow = false } } } } </script> <style scoped> h1 { background-color: orange; } /* 进入动画 */ .v-enter-active { animation: sgg 0.5s linear; } /* 离开动画 */ .v-leave-active { animation: sgg 0.5s linear reverse; } /* 自定义动画 */ @keyframes sgg { from { transform: translateX(-100%); } to { transform: translateX(0px); } } </style>
2.3 为 transition 标签指定名字
为 transition 标签指定名字,需要使用 transition 标签上的 name 属性,如果为 transition 标签指定了名字,那么对应的动画的名字也要进行相应的更改。
为 transition 标签指定了名字,可以实现使得不同的元素有不同的动画。
<transition name="hello"> <h1 v-show="isShow">hello world</h1> </transition>
/* 进入动画 */ .hello-enter-active { animation: sgg 0.5s linear; } /* 离开动画 */ .hello-leave-active { animation: sgg 0.5s linear reverse; } /* 自定义动画 */ @keyframes sgg { from { transform: translateX(-100%); } to { transform: translateX(0px); } }
Test.vue
<template> <div> <button @click="changeShow">显示/隐藏</button> <transition name="hello"> <h1 v-show="isShow">hello world</h1> </transition> </div> </template> <script> export default { name: 'Test', data() { return { // 控制显示与隐藏 isShow: false, } }, methods: { changeShow() { // 如果是隐藏状态 if (!this.isShow) { // 更改为显示状态 this.isShow = true } else { // 如果不为隐藏状态 // 更改为隐藏状态 this.isShow = false } } } } </script> <style scoped> h1 { background-color: orange; } /* 进入动画 */ .hello-enter-active { animation: sgg 0.5s linear; } /* 离开动画 */ .hello-leave-active { animation: sgg 0.5s linear reverse; } /* 自定义动画 */ @keyframes sgg { from { transform: translateX(-100%); } to { transform: translateX(0px); } } </style>
2.4 页面加载完成立即执行动画
要实现页面加载完成立即执行动画,需要使用 transition 标签的 appear 属性,指定该属性的值为 true。
<!-- 需要进行属性绑定,如果使用 appear="true" 则 appear 的值为 “true” 使用 :appear="true",appear 的值为 true --> <transition name="hello" :appear="true"> <h1 v-show="isShow">hello world</h1> </transition>
或者
<!-- appear 相当于 :appear="true" --> <transition name="hello" appear> <h1 v-show="isShow">hello world</h1> </transition>
Test.vue
<template> <div> <button @click="changeShow">显示/隐藏</button> <!-- 页面加载完成立即执行动画, 需要设置默认 h1 为显示 --> <transition name="hello" appear> <h1 v-show="isShow">hello world</h1> </transition> </div> </template> <script> export default { name: 'Test', data() { return { // 控制显示与隐藏 isShow: true, } }, methods: { changeShow() { // 如果是隐藏状态 if (!this.isShow) { // 更改为显示状态 this.isShow = true } else { // 如果不为隐藏状态 // 更改为隐藏状态 this.isShow = false } } } } </script> <style scoped> h1 { background-color: orange; } /* 进入动画 */ .hello-enter-active { animation: sgg 0.5s linear; } /* 离开动画 */ .hello-leave-active { animation: sgg 0.5s linear reverse; } /* 自定义动画 */ @keyframes sgg { from { transform: translateX(-100%); } to { transform: translateX(0px); } } </style>