Vue.js 过渡 & 动画
1.前言
Vue动画/过渡的本质: 在通过v-if/v-show指令插入/移除/显示/隐藏某个标签元素时,在这个标签上包裹一个transition标签,Vue会为这个标签动态添加css类名,为这些类名设置css样式,来达到过渡或动画效果
语法格式:
<transition>
<div v-if="flag"></div>
</transition>
Vue在元素显示与隐藏的过渡中,提供了 6 个 class 来切换:
v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。
v-enter-active / v-enter-to:在v-enter被移除的同时,会添加这两个css类名。过渡/动画结束后移除这两个类名
v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。
v-leave-active / v-leave-to:在v-leave被移除的同时,会添加这两个css类名。过渡/动画结束后移除这两个类名
这些类名本身不包含任何样式,需要用户自行编写,编写样式时可做以下参考:
在v-enter / v-leave中设置初始属性值
在v-enter-active / v-leave-active中设置过渡或动画
在v-enter-to / v-leave-to中设置最终属性值
例如:
.v-enter,.v-leave-to{
/* 刚进入时或完全离开后透明度为0 */
opacity: 0;
}
.v-enter-active,.v-leave-active{
/* 设置过渡 */
transition:all 3s linear;
}
.v-enter-to,.v-leave{
/* 刚离开时或完全进入后透明度为1 */
opacity: 1;
}
<body>
<div id="app" style="margin:30px auto;width:100px;">
<button type="button" class="btn" @click="flag=!flag">点我切换</button>
<transition>
<div v-show="flag">看我动画效果</div>
</transition>
</div>
</body>
效果:
可以看到,在元素显示过程中,添加了v-enter-active / v-enter-to这两个类(隐藏过程中则添加了v-leave-active / v-leave-to),在过渡完成时他们都被移除
PS: 在很多情况下,Vue 可以自动得出过渡效果的完成时机
2.自定义css类名
- 方法一:设置name属性,整体替换默认的类名前缀,例如name=fade,则v-enter替换成fade-enter,v-enter-active替换成fade-enter-active
代码:
渲染结果:
- 方法二:单独自定义某个css类名,语法为默认的类名="自定义类名",这种写法每个类名都需要单独设置,好处是灵活性强
<transition
enter-class="v-enter"
enter-active-class="v-enter-active"
enter-to-class="v-enter-to"
leave-class="v-leave"
leave-active-class="v-leave-active"
leave-to-class="v-leave-to"
>
<div v-show="flag">看我动画效果</div>
</transition>
3.使用第三方css动画库
- animate.css预置了很多css类,Animate中文网 可以在官网选择想要的类并查看相应的动画效果
- 例如:选中一个enter动画bounceIn,再选中一个leave动画bounceOut,将其分别替换默认的类名即可
//引入animate.css
<link href="https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel="stylesheet" type="text/css">
<body>
<div id="app" style="margin:30px auto;width:100px;">
<button type="button" class="btn" @click="flag=!flag">点我切换</button>
<transition
enter-active-class="animated bounceIn"
leave-active-class="animated bounceOut"
>
<div v-show="flag">看我动画效果</div>
</transition>
</div>
</body>
效果:
4.JavaScript 钩子
- 在过渡/动画执行的不同时机会执行不同的钩子函数
钩子函数 | 说明 |
---|---|
before-enter | 动画进入之前的回调 |
enter | 动画进入后的回调 |
before-leave | 动画离开前的回调 |
leave | 动画进入后的回调 |
- 基本使用
<transition
v-on:before-enter="beforeEnter"
v-on:enter="enter"
v-on:before-leave="beforeLeave"
v-on:leave="leave"
>
<!-- ... -->
</transition>
methods: {
beforeEnter: function (el) {
console.log('beforeEnter')
},
enter: function (el, done) {
console.log('enter')
},
beforeLeave: function (el) {
console.log('beforeLeave')
},
leave: function (el, done) {
console.log('leave')
},
afterLeave: function (el) {
}
}
渲染结果:
5.使用第三方js动画库
- 在回调函数中操作样式就可以做出动画效果,这里配合Velocity.js动画库进行演示,参考文档Velocity.js动画库
<script>
var vm = new Vue({
el:'#app',
data:{
flag:false
},
methods:{
beforeEnter: function (el) {
//设置初始属性值
el.style.opacity = 0
console.log('beforeEnter')
},
enter: function (el, done) {
//使用第三方函数添加动画效果 类似jquery的animate()函数
Velocity(el, {
opacity: 1
}, {
duration: 1000
})
console.log('enter')
},
beforeLeave: function (el) {
//设置初始属性值
el.style.opacity = 1
console.log('beforeLeave')
},
leave: function (el, done) {
//使用第三方函数添加动画效果 类似jquery的animate()函数
Velocity(el, {
opacity: 0
}, {
duration: 1000
})
console.log('leave')
}
}
})
</script>
6.初始渲染的过渡
- 默认情况下,初次渲染时没有过渡和动画效果,如果要开启,则在transition标签中添加appear属性即可
<transition appear>
<!-- ... -->
</transition>
效果(可以看到页面初始化有了节点过渡效果,且执行了相应的回调,说明他默认使用了进入/离开的回调或css类):
- 还可以自定义初始渲染时的 CSS 类名 和 JavaScript 钩子:
<transition
appear
appear-class="custom-appear-class"
appear-to-class="custom-appear-to-class"
appear-active-class="custom-appear-active-class"
>
</transition>
<transition
appear
v-on:before-appear="customBeforeAppearHook"
v-on:appear="customAppearHook"
v-on:after-appear="customAfterAppearHook"
v-on:appear-cancelled="customAppearCancelledHook"
>
</transition>
7.多个元素过渡
- transition标签内部渲染时最终只能有一个容器
- 如果插入了多个容器,通过v-if指令来2选1(多选一),
- 当有相同标签名的元素切换时,需要通过 key 特性设置唯一的值来标记以让 Vue 区分它
<transition name="xxx">
<li v-if="index===0" key="1">
<h1>第一屏</h1>
</li>
<li v-else key="2">
<h1>第二屏</h1>
</li>
</transition>
8.过渡模式 mode
- 前面说到,transition标签内部渲染时最终只能有一个容器,当2个元素切换时,一个元素进入也意味着另一个元素要离开。默认情况下,元素进入和元素离开同时发生,会出现两个元素同时出现在页面的情形。可以通过修改mode属性来成其他效果。
可选值 | 说明 |
---|---|
in-out | 新元素先进行过渡,完成之后当前元素过渡离开 |
out-in | 当前元素先进行过渡,完成之后新元素过渡进入 |
<body>
<div id="app" style="margin:30px auto;width:100px;">
<button type="button" class="btn" @click="flag=!flag">点我切换</button>
<transition
enter-active-class="animated slideInRight"
leave-active-class="animated slideOutLeft"
>
<div v-if="flag" key="1">CSS3动画库</div>
<div else key="2">使用也很简单</div>
</transition>
</div>
</body>
默认效果:
out-in:先出后进
<transition mode="out-in">
...
</transition>
- in-out:先进后出,模式不是经常用到,但对于一些稍微不同的过渡效果还是有用的
PS:本例中2个容器div,独占一行,所以2个元素同时出现时,第二个元素会被挤到第二行。可以设置成绝对定位就不会出现这样的问题
9.列表过渡
- (1)列表过渡使用transition-group标签,他不像transition标签最多只能渲染一个元素,他可以渲染多个,且它会以一个真实元素呈现:默认为一个 span,你也可以通过 tag属性设置成其他标签
- (2)过渡模式不可用,因为我们不再相互切换特有的元素
- (3)他同样需要为每个元素提供唯一的 key
- (4)CSS过渡的类将会应用在内部的元素中,而不是这个组/容器本身
下面通过简单的例子来演示:
html代码:
CSS代码:
js代码:
效果图:
可以看到,transition-group被渲染成div标签,CSS过渡的类将会应用在内部的元素中,而不是这个组/容器本身。但是仍有一点不足,当添加和移除元素的时候,周围的元素会瞬间移动到他们的新布局的位置,而不是平滑的过渡,我们下面会解决这个问题。
分析:当插入元素的瞬间,周围的元素之所以会瞬移到新位置,是因为他们没有设置过渡属性,所以只要给本例中的item类加上即可
效果:
而删除元素时,周围的元素之所以迟迟没动静,那是因为他们要等到过渡完全结束才开始行动,而我们需要的是过渡开始的瞬间就开始移动到新位置。此时只要让被删除元素过渡开始的瞬间脱离文档流,周围的元素自然会'立即行动'
css代码:
效果图:
Vue.js 过渡 & 动画的更多相关文章
- vue.js 过渡&动画
9-17 在add ,update, remove DOM时 提供多种方式的应用过度效果. 包括以下可选工具:(2大类,css和js) 在css过度和动画中自动应用class 配合使用第三方css动画 ...
- VUE:过渡&动画
VUE:过渡&动画 vue动画的理解 1)操作css的 trasition 或 animation 2)vue会给目标元素添加/移除特定的class 3)过渡的相关类名 xxx-enter-a ...
- Vue相关(过渡动画)
Vue 过渡 && 动画 一.CSS过渡 1.transition标签可以用来封装需要过渡的元素,添加entering/leaving 过渡, 条件是: (1)使用条件渲染语句 v-i ...
- vue.js之动画篇
本文引入类库的方式均采用CND的方式,可直接复制代码到编辑器中学习和测试 不使用动画切换元素 <div id="app"> <input type="b ...
- vue.js过度&动画、混入&插件
1.vue 过度动画 1.过度 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.Vue 提供了内置的过渡封装组件,该组件用于包裹要实现过渡效果的组件. 语法格式: < ...
- vue的过渡动画在除了chrome浏览器外的浏览器下不正常的问题
为过渡动画添加mode="out-in"在其它浏览器下面就能正常的使用了
- (私人收藏)Vue.js手册及教程
(私人收藏)Vue.js手册及教程 https://pan.baidu.com/s/1XG1XdbbdBQm7cyhQKUIrRQ5lrt Vue.js手册及教程 Vue.js 教程 Vue.js 安 ...
- vue three.js 结合tween.js 实现动画过渡
参考地址:https://www.jianshu.com/p/d6e3b4b153bb https://www.jqhtml.com/10513.html 官方文档:https://github.co ...
- Vue.js动画在项目使用的两个示例
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 李萌,16年毕业,Web前端开发从业者,目前就职于腾讯,喜欢node.js.vue.js等技术,热爱新技术,热 ...
- Vue过渡动画—Vue学习笔记
要求:要通过Vue使用过渡动画我们要把需要过度的元素放在<transition name='变量名'></transition>中. 原理:通过在特定的时刻增加/移除样式实现. ...
随机推荐
- DNN、CNN、RNN的区别
参考1:CNN.RNN.DNN区别 参考2:一文读懂 CNN.DNN.RNN 内部网络结构区别 一张图解释所有: 感知机(输入层.输出层.一个隐藏层)-->不能解决复杂的函数-->神经网络 ...
- 面试官:谈谈你对 IoC 和 AOP 的理解!
本文摘录自笔者开源的 Java 学习&面试指南(Github 收获146k star):JavaGuide . 这篇文章会从下面从以下几个问题展开对 IoC & AOP 的解释 什么是 ...
- Windows系统环境变量
添加环境变量: 添加系统变量,机器要重新启动 添加用户变量,机器不用重启: 一般添加环境变量都添加在用户变量中,但只针对这一用户生效 为了使的所有用户都能正常使用软件,通常添加系统变量
- ant-design-vue 登录表单校验
最近刚刚上手了 Vue3 的 antdv ui框架,来做个简单的登录校验练练手 安装 antdv 依赖 npm install ant-design-vue --save 在 main.ts/js 中 ...
- bpftool使用方法简介
1.安装bpftool工具 看起来,在不同的linux发行版里,bpftool在不同的软件包里,ubuntu 22上,bpftool是linux-tools-generic的一部分,而树莓派里bpft ...
- CSharp的lambda表达式的使用
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...
- docker打包镜像,上传镜像仓库,使用rancher发布
步骤一.首先将项目打包放在指定目录下 项目jar包名称为 micro-app.jar 步骤二.将jar包名称改为指定名称,执行命令 docker build -t micro-gateway: ...
- 妙用编辑器:使用Notepad--列编辑功能批量生成维护命令
应用场景 在日常工作中,维护人员可能会要批量生成一些配置命令,示例如下:添加12个分组 ADD GROUP:GID=1,FCN=646322; ADD GROUP:GID=1,FCN=646322; ...
- jenkins构建pytest持续集成环境时,遇到的一些问题及处理
前言: 构建的项目为pytest+appium+allure,在pycharm里面已将环境代码调试并测试完毕,放到jenkins里执行的一些问题整理 问题1.pycharm里可以正常运行代码,到了je ...
- php 对二维数组按照汉字首字母排序
1 /** 2 * 取汉字的第一个字的首字母 3 * @param type $str 4 * @return string|null 5 */ 6 function _getFirstCharter ...