Vue中的动画效果
Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。
包括以下工具:
- 在 CSS 过渡和动画中自动应用 class
- 可以配合使用第三方 CSS 动画库,如 Animate.css
- 在过渡钩子函数中使用 JavaScript 直接操作 DOM
- 可以配合使用第三方 JavaScript 动画库,如 Velocity.js
下面分别从这个4个工具来学习Vue动画效果。
一、单元素/组件的过渡
Vue 提供了 transition
的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡
- 条件渲染 (使用
v-if
) - 条件展示 (使用
v-show
) - 动态组件
- 组件根节点
一个典型的例子:
Html文件
- <div id="app">
- <transition name="fade">
- <div v-if="show">
- Hello world.
- </div>
- </transition>
- <button @click="handleClick">切换</button>
- </div>
js文件
- <script>
- // 1. 创建Vue的实例
- let vm = new Vue({
- el:'#app',
- data:{
- show:false
- },
- methods:{
- handleClick:function(){
- this.show = !this.show
- }
- }
- });
- </script>
css文件
- <style>
- .fade-enter-active, .fade-leave-active {
- transition: opacity 2s;
- }
- .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
- opacity: 0;
- }
- </style>
这个例子的效果为:点击切换,文字会淡入淡出。
实现原理:
1、通过使用transition组件后, Vue 将会做以下处理:
- 自动嗅探目标元素是否应用了 CSS 过渡或动画,如果是,在恰当的时机添加/删除 CSS 类名。
- 如果过渡组件提供了 JavaScript 钩子函数,这些钩子函数将在恰当的时机被调用。
- 如果没有找到 JavaScript 钩子并且也没有检测到 CSS 过渡/动画,DOM 操作 (插入/删除) 在下一帧中立即执行。(注意:此指浏览器逐帧动画机制,和 Vue 的
nextTick
概念不同)
2、动画进入时,Vue会添加CSS类,如果没有使用name="fade"的话,类名为v-fade-enter、v-fade-eneter-active等。
第一帧动画,会自动添加fade-enter和fade-enter-active类
第二帧动画,会去掉fade-enter类,添加fade-enter-to类
第三帧动画,会去掉所有enter类
3、动画在离开时同样会添加或删除CSS类
二、Vue使用animate.css动画库
1、使用自定义类
效果为:进入或离开都会有拉升效果。
注意:这里我们使用了
- name="bounce"替换了默认的fade。当然,如果没有fade的话,也会有v-作为默认开头。
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title></title>
- <style>
- @keyframes bounce-in {
- 0% {
- transform: scale(0);
- }
- 50% {
- transform: scale(1.5);
- }
- 100% {
- transform: scale(1);
- }
- }
- .bounce-enter-active {
- animation: bounce-in .5s;
- }
- .bounce-leave-active {
- animation: bounce-in .5s reverse;
- }
- </style>
- </head>
- <body>
- <div id="app">
- <transition name="bounce">
- <div v-if="show">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.
- </div>
- </transition>
- <button @click="handleClick">切换</button>
- </div>
- <script src="js/vue.js"></script>
- <script>
- // 1. 创建Vue的实例
- let vm = new Vue({
- el:'#app',
- data:{
- show:false
- },
- methods:{
- handleClick:function(){
- this.show = !this.show
- }
- }
- });
- </script>
- </body>
- </html>
我们这里还可以使用自定义类:
既然我们可以使用自定义class,那么我们就可以使用开源的第三方CSS库,比如animate.css库。
https://daneden.github.io/animate.css/
使用很简单,直接替换上面我们自定义的class就行。
使用animate.css注意事项:
1、必须使用自定义class的模式
enter-active-class=""
2、animated类放在前面,且是必须的
三、Vue中同时使用过渡和动画
1、初次动画效果
上面例子中,我们初次进入的时候没有动画效果,我们可以做如下修改:
2、如果我们希望在上面的例子中还加入一开始我们说的过渡效果,那该怎么做呢?
1、因为animate.css有一个自己的动画效果时长,fade也有一个opacity,那么以哪一个为准呢?我们可以使用type="transition"来确定哪个为准。
2、我们也可以自己设定动画效果时长样式:duration里面的enter为进入时长,leave为动画离开时长,都是针对过渡效果的。
四、Vue中的js动画配合使用第三方动画库(Velocity.js)
Html
- <div id="app">
- <transition name="fade"
- @before-enter="beforeEnter"
- @enter="enter"
- >
- <div v-if="show">
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.
- </div>
- </transition>
- <button @click="handleClick">切换</button>
- </div>
Js
- methods:{
- handleClick:function(){
- this.show = !this.show
- },
- 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 })
- },
- }
五、多个元素或组件的过渡动画
1、多个元素的过渡动画实现
Html
- <div id="app">
- <transition name="fade" mode="in-out">
- <div v-if="show" key='one'>组件1</div>
- <div v-else key='two'>组件2</div>
- </transition>
- <button @click="handleClick">切换</button>
- </div>
style
- <style>
- .fade-enter-active, .fade-leave-active {
- transition: opacity 1s;
- }
- .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
- opacity: 0;
- }
- </style>
注意:这里需要绑定一个key,因为vue会复用,所以不加key就不会有效果。
2、多个组件的过渡动画实现
Html
- <div id="app">
- <transition name="fade" >
- <child-one v-if="show"></child-one>
- <child-two v-else></child-two>
- </transition>
- <button @click="handleClick">切换</button>
- </div>
js
- <script>
- Vue.component('child-one',{
- template:'<div>child-one</div>'
- })
- Vue.component('child-two',{
- template:'<div>child-two</div>'
- })
- // 1. 创建Vue的实例
- let vm = new Vue({
- el:'#app',
- data:{
- show:false
- },
- methods:{
- handleClick:function(){
- this.show = !this.show
- }
- }
- });
- </script>
css
- <style>
- .fade-enter-active, .fade-leave-active {
- transition: opacity .4s;
- }
- .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
- opacity: 0;
- }
- </style>
我们可以通过Vue自带的compoent标签实现动态组件,data中show改成type,type:‘child-one’
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title></title>
- <style>
- .fade-enter-active, .fade-leave-active {
- transition: opacity .4s;
- }
- .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
- opacity: 0;
- }
- </style>
- </head>
- <body>
- <div id="app">
- <transition name="fade" >
- <component :is="type"></component>
- </transition>
- <button @click="handleClick">切换</button>
- </div>
- <script src="js/vue.js"></script>
- <script>
- Vue.component('child-one',{
- template:'<div>child-one</div>'
- })
- Vue.component('child-two',{
- template:'<div>child-two</div>'
- })
- // 1. 创建Vue的实例
- let vm = new Vue({
- el:'#app',
- data:{
- type:'child-one'
- },
- methods:{
- handleClick:function(){
- this.type = this.type==='child-one'?'child-two':'child-one'
- }
- }
- });
- </script>
- </body>
- </html>
六、Vue中列表的过渡动画
当我们希望对列表进行过渡效果时,使用transition-group标签就可以了。
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title></title>
- <style>
- .fade-enter-active, .fade-leave-active {
- transition: opacity 1s;
- color: red;
- }
- .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
- opacity: 0;
- }
- </style>
- </head>
- <body>
- <div id="app">
- <transition-group name="fade">
- <div v-for="item in list" key="item.id">{{item.title}}</div>
- </transition-group>
- <button @click="handleClick">增加</button>
- </div>
- <script src="js/vue.js"></script>
- <script>
- var count = 0
- // 1. 创建Vue的实例
- let vm = new Vue({
- el:'#app',
- data:{
- list:[]
- },
- methods:{
- handleClick:function(){
- this.list.push({
- id:count++,
- title:'hello kitty!'
- })
- }
- }
- });
- </script>
- </body>
- </html>
七、动画封装
我们可以将动画以组件的方式进行封装起来,以后需要使用这个动画时,直接通过插槽将组件放入插槽即可。
例子:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title></title>
- <script src='js/velocity.min.js'></script>
- </head>
- <body>
- <div id="app">
- <fade :show="show">
- <div>
- hello div
- </div>
- </fade>
- <fade :show="show">
- <h1>hello H1</h1>
- </fade>
- <button @click="handleClick">增加</button>
- </div>
- <script src="js/vue.js"></script>
- <script>
- Vue.component('fade',{
- props:['show'],
- template:`<transition @before-enter="handleBeforeEnter"
- @enter="handleEnter">
- <slot v-if="show"></slot>
- </transition>`,
- methods:{
- handleBeforeEnter:function(el){
- el.style.color="red"
- },
- handleEnter:function(el,done){
- setTimeout(()=>{
- Velocity(el, { opacity: 1, fontSize: '1.4em' }, { duration: 300 })
- Velocity(el, { fontSize: '1em' }, { complete: done })
- done()
- },2000)
- }
- }
- })
- // 1. 创建Vue的实例
- let vm = new Vue({
- el:'#app',
- data:{
- show:false
- },
- methods:{
- handleClick:function(){
- this.show=!this.show
- }
- }
- });
- </script>
- </body>
- </html>
我们这里封装了一个fade组件,通过transition封装一个slot,里面可以支持N个内容。然后将动画效果封装到钩子函数,然后在钩子函数里面放入CSS效果。这样,就将动画效果完全封装在一个组件中了,随时随地可以使用这个带动画的组件啦。
写了这么多,其实就是开头的四种方式:
- 在CSS过渡和动画中自动应用class【默认为fade开头,也可以自定义,不写name时为v开头】
- 可以配合使用第三方 CSS 动画库,如 Animate.css【自定义class的方式】
- 在过渡钩子函数中使用 JavaScript 直接操作 DOM
- 可以配合使用第三方 JavaScript 动画库,如 Velocity.js
Vue中的动画效果的更多相关文章
- Vue中过度动画效果应用
一.实现动画过渡效果的几种方式 实现动画必须要将要进行动画的元素利用<transition>标签进行包裹 1.利用CSS样式实现过渡效果 <transition name=" ...
- Vue 中的动画特效
Vue 中的动画特效 CSS 实现标签显隐 <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- Vue过渡和动画效果展示(案例、GIF动图演示、附源码)
前言 本篇随笔主要写了Vue过渡和动画基础.多个元素过渡和多个组件过渡,以及列表过渡的动画效果展示.详细案例分析.GIF动图演示.附源码地址获取. 作为自己对Vue过渡和动画效果知识的总结与笔记. 因 ...
- vue中使用动画vue-particles实现背景粒子酷炫效果
先来看我做的效果 我这个是用的背景色加上这个粒子效果实现的demo 平时我们做项目的话会添加背景图片这些,可能更加好看 看我的实现步骤 cnpm install -g vue-cli vue init ...
- vue中css动画原理
显示原理: <transition name='fade'> <div v-if='show'>hello world</div> </transition& ...
- CSS3中的动画效果记录
今天要记录的是CSS3中的三种属性transform.transition以及animation,这三个属性大大提升了css处理动画的能力. 一.Transform 变形 CSS中transform ...
- Android中的动画效果
动画的种类 透明动画alphaAnimation 在代码中配置动画: findViewById(R.id.btnAnimMe).setOnClickListener(new View.OnClickL ...
- css3实现的3中loading动画效果
一.css3中animation动画各种属性详解: animation Value: [<animation-name> || <animation-duration> ...
- css3中的动画效果
css3中的animation属性动画效果代码如下: <!DOCTYPE html> <html lang="en"> <head> <m ...
随机推荐
- python列表操作大全
Python列表操作大全 对于python列表的理解可以和C语言里面的数组进行比较性的记忆与对照,它们比较相似,对于python里面列表的定义可以直接用方括号里加所包含对象的方法,并且python的列 ...
- PC启动过程详解
系统启动过程 1. 预引导(Pre-Boot)阶段 2. 引导阶段 3. 加载内核阶段 4. 初始化内核阶段 5. 用户登录阶段 基本概念: BIOS:即“Basic Input/Output Sys ...
- element table中使用el-select
效果: 然后看代码: 注意事项: el-select的v-model要和option的value值对应,注意是string还是number类型哦- 此文转载别人
- Java并发 行级锁/字段锁/表级锁 乐观锁/悲观锁 共享锁/排他锁 死锁
原文地址:https://my.oschina.net/oosc/blog/1620279 前言 锁是防止在两个事务操作同一个数据源(表或行)时交互破坏数据的一种机制. 数据库采用封锁技术保证并发操作 ...
- Oracle数据的导入与导出
本文针对window操作系统与oracle12C的版本. 1.sqlplus执行单个sql文件 1.执行sqlplus登陆命令:sqlplus username/password@host:port/ ...
- GlusterFS分布式存储系统
一,分布式文件系统理论基础 1.1 分布式文件系统出现 计算机通过文件系统管理,存储数据,而现在数据信息爆炸的时代中人们可以获取的数据成指数倍的增长,单纯通过增加硬盘个数来扩展计算机文件系统的存储容量 ...
- mybatis3.1-[topic-16-17]-映射文件_增删改查_insert_获取自增主键的值
笔记要点出错分析与总结 /**测试第16章的增,删,改 的内容 * 错误1: <insert id="addEmp" parameterType="com.bean ...
- c++ vector容器基本用法
基本用法 #include<iostream> #include<string> #include<vector> using namespace std; cla ...
- 设置input 中placeholder的样式
::-webkit-input-placeholder { /* Chrome/Opera/Safari */ position: relative; top: 4px; } ::-moz-place ...
- python 查询每周最后一个工作日
背景: 做定时任务时,一般都是写死每周五XXXXX,但有时遇到节假日的情况,周五可能不是本周最后一个工作日 代码如下: import urllib2,datetime,json nowTime = d ...