Vue多元素过渡
前面的话
前面分别介绍了单元素过渡的CSS过渡和JS过渡,本文将详细介绍Vue多元素过渡
常见示例
最常见的多标签过渡是一个列表和描述这个列表为空消息的元素:
<transition>
<table v-if="items.length > 0">
<!-- ... -->
</table>
<p v-else>Sorry, no items found.</p>
</transition>
下面是一个例子
<style>
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition:opacity .5s;}
</style>
<div id="demo">
<button @click="clear">清空数据</button>
<button @click="reset">重置</button>
<transition name="fade">
<ul v-if="items.length > 0">
<li v-for="item in items">{{item}}</li>
</ul>
<p v-else>Sorry, no items found.</p>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
items: ['html','css','js']
},
methods:{
clear(){
this.items.splice(0);
},
reset(){
history.go();
}
}
})
</script>
同标签名称
如果是相同标签名的元素切换时,Vue 为了效率只会替换相同标签内部的内容
<style>
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition:opacity .5s;}
</style>
<div id="demo">
<button @click="show = !show">toggle</button>
<transition name="fade">
<p v-if="show">我是小火柴</p>
<p v-else>我不是小火柴</p>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
show:true
},
})
</script>
由下面的示例可知,两个相同的p元素切换时,无过渡效果
因此,对于具有相同标签名的元素切换的情况,需要通过 key 特性设置唯一的值来标记以让 Vue 区分它们
<div id="demo">
<button @click="show = !show">toggle</button>
<transition name="fade">
<p v-if="show" key="trueMatch">我是小火柴</p>
<p v-else key="falseMatch">我不是小火柴</p>
</transition>
</div>
替代if
在一些场景中,可以给通过给同一个元素的 key 特性设置不同的状态来代替 v-if 和 v-else
<transition>
<button v-if="isEditing" key="save">Save</button>
<button v-else key="edit">Edit</button>
</transition>
上面的例子可以重写为
<transition>
<button v-bind:key="isEditing">
{{ isEditing ? 'Save' : 'Edit' }}
</button>
</transition>
下面是一个例子
<style>
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition:opacity .5s;}
</style>
<div id="demo">
<button @click="isEditing = !isEditing">toggle</button>
<transition name="fade">
<p v-bind:key="isEditing">
{{ isEditing ? 'Save' : 'Edit' }}
</p>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
isEditing:true
},
})
</script>
使用多个 v-if 的多个元素的过渡可以重写为绑定了动态属性的单个元素过渡
<transition>
<button v-if="docState === 'saved'" key="saved">Edit</button>
<button v-if="docState === 'edited'" key="edited">Save</button>
<button v-if="docState === 'editing'" key="editing">Cancel</button>
</transition>
可以重写为
<transition>
<button v-bind:key="docState">{{ buttonMessage }}</button>
</transition>
computed: {
buttonMessage: function () {
switch (this.docState) {
case 'saved': return 'Edit'
case 'edited': return 'Save'
case 'editing': return 'Cancel'
}
}
}
下面是一个例子
<style>
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition:opacity .5s;}
</style>
<div id="demo">
<button @click="change">change</button>
<transition name="fade">
<p v-bind:key="docState">{{ message }}</p>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
index:0,
isEditing:true,
arr:['saved','edited','editing']
},
computed: {
docState(){
return this.arr[this.index];
},
message() {
switch (this.docState) {
case 'saved': return 'Edit'
case 'edited': return 'Save'
case 'editing': return 'Cancel'
}
}
},
methods:{
change(){
this.index = (++this.index)%3;
}
}
})
</script>
过渡模式
先看下面这个例子
<style>
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition:opacity .5s;}
</style>
<div id="demo">
<transition name="fade">
<button :key="isOn" @click="isOn = !isOn">{{ isOn ? 'On' : 'Off' }}</button>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
isOn: true
},
})
</script>
在 “on” 按钮和 “off” 按钮的过渡中,两个按钮都被重绘了,一个离开过渡的时候另一个开始进入过渡。这是 <transition> 的默认行为 - 进入和离开同时发生
同时生效的进入和离开的过渡不能满足所有要求,所以 Vue 提供了过渡模式
in-out: 新元素先进行过渡,完成之后当前元素过渡离开。
out-in: 当前元素先进行过渡,完成之后新元素过渡进入。
【in-out】
下面使用in-out来重写之前的开关按钮过渡
<div id="demo">
<transition name="fade" mode="in-out">
<button :key="isOn" @click="isOn = !isOn">{{ isOn ? 'On' : 'Off' }}</button>
</transition>
</div>
【out-in】
下面使用out-in来重写之前的开关按钮过渡
<div id="demo">
<transition name="fade" mode="out-in">
<button :key="isOn" @click="isOn = !isOn">{{ isOn ? 'On' : 'Off' }}</button>
</transition>
</div>
滑动过渡
当元素设置为绝对定位,并互相覆盖,实现透明度过渡效果
<style>
#demo{position:relative;}
#demo button{position:absolute;left:40px;}
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition: 1s;}
</style>
<div id="demo">
<transition name="fade" >
<button :key="isOn" @click="isOn = !isOn">{{ isOn ? 'On' : 'Off' }}</button>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
isOn: true
},
})
</script>
下面是一个使用absolute和translate实现的类似滑动
<style>
#demo{position:relative;}
#demo button{position:absolute;left:40px;}
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter{transform:translateX(30px);}
.fade-leave-to{transform:translateX(-30px);}
.fade-enter-active,.fade-leave-active{transition: 1s;}
</style>
如果设置in-out模式,将实现更酷的滑动效果
<style>
#demo{position:relative;}
#demo button{position:absolute;left:40px;}
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter{transform:translateX(30px);}
.fade-leave-to{transform:translateX(-30px);}
.fade-enter-active,.fade-leave-active{transition: 1s;}
</style>
<div id="demo">
<transition name="fade" mode="in-out">
<button :key="isOn" @click="isOn = !isOn">{{ isOn ? 'On' : 'Off' }}</button>
</transition>
</div>
<script>
new Vue({
el: '#demo',
data: {
isOn: true
},
})
</script>
多组件过渡
多个组件的过渡简单很多,不需要使用 key 特性。相反,只需要使用动态组件
下面是一个例子
<style>
.fade-enter,.fade-leave-to{opacity:0;}
.fade-enter-active,.fade-leave-active{transition: .5s;}
</style>
<div id="example">
<button @click="change">切换页面</button>
<transition name="fade" mode="out-in">
<component :is="currentView"></component>
</transition>
</div>
<script>
new Vue({
el: '#example',
data:{
index:0,
arr:[
{template:`<div>ComponentA</div>`},
{template:`<div>ComponentB</div>`},
{template:`<div>ComponentC</div>`}
],
},
computed:{
currentView(){
return this.arr[this.index];
}
},
methods:{
change(){
this.index = (++this.index)%3;
}
}
})
</script>
Vue多元素过渡的更多相关文章
- vue 单元素过渡
demo <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- 066_末晨曦Vue技术_过渡 & 动画之多个元素的过渡
多个元素的过渡 点击打开视频讲解更加详细 我们之后讨论多个组件的过渡,对于原生标签可以使用 v-if/v-else.最常见的多标签过渡是一个列表和描述这个列表为空消息的元素: <transiti ...
- vue总结 04过渡--进入/离开 列表过渡
进入/离开 & 列表过渡 概述 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.包括以下工具: 在 CSS 过渡和动画中自动应用 class 可以配合使用第三方 CS ...
- Vue API 4 (过渡和动画)
transition name 用于自动生成 CSS 过渡类名.例如:name: fade 将自动拓展为 .fade-enter ,.fade-enter-active等.默认类名为 "v& ...
- Vue可复用过渡和动态过渡
前面的话 本文将详细介绍Vue可复用过渡和动态过渡 可复用过渡 过渡可以通过 Vue 的组件系统实现复用.要创建一个可复用过渡组件,需要做的就是将 <transition> 或者 < ...
- vue单元素/组件的过渡
(1)过渡的类名 v-enter:定义进入过渡的开始状态.在元素被插入之前生效,在元素被插入之后的下一帧移除. v-enter-active:定义进入过渡生效时的状态.在整个进入过渡的阶段中应用,在元 ...
- Vue入门笔记#过渡
Vue过渡,可以在元素从DOM中移除,插入时自动调用过渡效果.根据设定,会适时的触发过渡效果. 在使用的目标标签里添加 transition: <div transition="my_ ...
- vue总结05 过渡--状态过渡
状态过渡 Vue 的过渡系统提供了非常多简单的方法设置进入.离开和列表的动效.那么对于数据元素本身的动效呢,比如: 数字和运算 颜色的显示 SVG 节点的位置 元素的大小和其他的属性 所有的原始数字都 ...
- Vue——关于css过渡和动画那些事
1. 单元素/组件的过渡transition Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡 条件渲染 (使用 v-if) 条件展示 (使用 v ...
随机推荐
- vijos1051题解
题目: 圣诞老人回到了北极圣诞区,已经快到12点了.也就是说极光表演要开始了.这里的极光不是极地特有的自然极光景象.而是圣诞老人主持的人造极光. 轰隆隆--烟花响起(来自中国的浏阳花炮之乡).接下来就 ...
- Java学习之路----计算圆形的面积和周长
题目:计算圆形的面积,其中圆形的半径是随意指定. 源代码以及所有的分析思路都如下: import java.util.Scanner; //引入Scanner类 public class TestAr ...
- Java8学习(3)- Lambda 表达式
猪脚:以下内容参考<Java 8 in Action> 本次学习内容: Lambda 基本模式 环绕执行模式 函数式接口,类型推断 方法引用 Lambda 复合 上一篇Java8学习(2) ...
- 【学习笔记】C# 构造和析构
构造方法 构造方法是一个特殊的方法,负责初始化对象 构造方法名必须和类名一致 构造方法没有返回值,但可以有参数,能够重载 构造方法可以不写,系统会自动为类添加一个无参的默认构造 如果将构造方法设置为P ...
- UglyNumber - 找“丑数”
uglynumber的定义是只能被1,2,3,5整除的数 规定1是第一个uglynumber:以此类推,1 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 ...
- HashMap TreeMap ConcurrentHashMap 源码
1 HashMap java se 1.6 1.1 父类 java.lang.Object 继承者 java.util.AbstractMap<K,V> 继承者 java.util.Has ...
- thinkphp 面向切面编程-行为拓展
thinkphp的CBD模式 核心保留了最关键的部分,并在重要位置设置了标签用以标记,其他功能都采用行为扩展和驱动的方式组合,开发人员可以根据自己的需要,对某个标签位置进行行为扩展或者替换,就可以方便 ...
- 用Maven创建web项目
使用eclipse插件创建一个web project 首先创建一个Maven的Project如下图 我们勾选上Create a simple project (不使用骨架) 这里的Packing 选择 ...
- 管理 Machine - 每天5分钟玩转 Docker 容器技术(47)
用 docker-machine 创建 machine 的过程很简洁,非常适合多主机环境.除此之外,Docker Machine 也提供了一些子命令方便对 machine 进行管理.其中最常用的就是无 ...
- HBase(0.96以上版本)过滤器Filter详解及实例代码
说明: 本文参考官方Ref Guide,Developer API和众多博客,并结合实测代码编写,详细总结HBase的Filter功能,并附上每类Filter的相应代码实现. 本文尽量遵从Ref Gu ...