文章目录
过渡和动画
过渡和动画的概念
过渡:顾名思义,从一个状态向另外一个状态的过程,新的状态替换了旧的状态。不懂你就理解字面的意思,过渡就完事了。。。
动画: 就是比过渡功能更多更强大一点,实在懒得解释了,往后看吧~ 💭😭👍
transition 组件
过渡类型 | 说明 |
---|---|
v-enter | 进入过渡的开始状态,作用于开始的一帧 |
v-enter-active | 进入过渡生效时的状态,作用整个过程 |
v-enter-to | 进入过渡的结束状态,作用于结束的一帧 |
v-leave | 离开过渡的开始状态,作用于开始的一帧 |
v-leave-active | 离开过渡生效时的状态,作用于整个过程 |
v-leave-to | 离开过渡的结束状态,作用于结束的一帧 |
<style>
.chart{
width: 200px;
height: 50px;
background-color: hotpink;
}
/* 进入和离开的整个过程*/
.box-enter-active,.box-leave-active{
transition: width 3s;
}
/*进入初始状态和离开的结束状态*/
.box-enter,.box-leave-to{
width: 0px;
}
/*进入的结束状态和离开的开始状态*/
.box-enter-to,.box-leave{
width: 200px;
}
</style>
<body>
<div id="app">
<button @click='toggle'>改变图形宽度 yzx</button>
<hr/> <!--水平线,为了好看一点,可以不写-->
<transition name="box">
<!--设置添加过渡的div 标签-->
<div class="chart" v-if='show'></div>
</transition>
</div>
<script>
var vm = new Vue({
el:'#app',
data:{
show:true
},
methods:{
toggle(){
this.show = ! this.show;
}
}
})
</script>
</body>
自定义类名
Vue 中 transition 组件可以使用自定义的类名。
进入:enter-class,enter-active-class,enter-to-class
离开:leave-class,leave-active-class,leave-to-class
animate.css 是一个跨浏览器的 CSS 动画库,内置了很多经典 CSS3 动画。
需要写个link : “ < link href=“https://unpkg.com/animate.css@3.5.2/animate.min.css” rel=“stylesheet”/>”
<div id='app'>
<button @click="show=!show">显示和隐藏</button>
<transition appear appear-active-class="animated swing"
enter-active-class="animated bounceInLeft" leave-active-class="animated bunceOutLeft">
<p v-if="show">过渡文字效果 yzx </p>
</transition>
</div>
<script>
var vm = new Vue({
el:'#app',
data:{
show:true
}
})
</script>
@keyframes 创建 CSS 动画
@keyframes 规则创建动画,就是将一套 CSS 样式逐步演变成另一种样式,在创建动画的过程中可以多次改变 CSS 样式,通过百分比或关键词 from 和 to (等价于 0% 和 100%)来规定动画的状态。
<style>
div.circular{
width: 100px;
height: 100px;
background-color:blueviolet;
margin-top: 20px;
border-radius: 50%;
text-align: center;
line-height: 100px;
color: #fff;
}
.bounce-enter-active{
animation: Anim 3s;
}
.bounce-leave-active{
animation: Anim 3s reverse;
}
@keyframes Anim{
0%{
transform: scale(0);
background:blueviolet;
}
100%{
transform: scale(1);
background: red;
}
}
</style>
</head>
<body>
<div id="app">
<button @click="show=!show">使用@keyframes 创建 CSS yzx</button>
<transition name="bounce" >
<div class="circular" v-if="show">圆形啊</div>
</transition>
</div>
<script>
var vm = new Vue({
el:'#app',
data:{
show:true
}
})
</script>
</body>
有点抱歉,显示效果背景有点小bug ,好像是浏览器渲染问题吧,评论区求个答案,我找半天没搞好,抱歉😣😣😣
多个元素过渡
不同标签元素过渡
不同标签元素可以使用 v-if 和 v- else 进行过渡
<div id="app">
<transition>
<ul v-if="items.length >0">
<li>yzx 01</li>
<li>yzx 02</li>
</ul>
<p v-else>抱歉,没有找到哦~</p>
</transition>
</div>
<script>
var vm = new Vue({
el:'#app',
data:{
items:[]
}
})
</script>
相同标签元素过渡
当有相同标签的元素切换时,需要通过 key 特性设置唯一值来标记。
<div id="app">
<button @click="saving=!saving">切换编辑或保存yzx</button>
<transition >
<button v-if="saving" key="save">保存</button>
<button v-else key="edit"> 编辑</button>
</transition>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
saving: true
}
})
</script>
过渡模式
过渡模式原理,设置有序的过渡而不是同数发生过渡,在transition 中加入 mode 属性,该属性有以下两个值:
in-out:表示新元素先进性过渡,完成之后当前元素过渡离开
out-in:表示当前元素先进行过渡,完成之后新元素过渡进入
<style>
.fade-enter,.fade-leave-to{
opacity: 0;
}
.fade-enter-active,.fade-leave-active{
transition: opacity .5s;
}
</style>
-------------------------------------------------
<body>
<div id="app">
<transition name="fade" mode="out-in">
<button :key="isOff" @click="isOff=!isOff">{{isOff? 'Off': 'On'}}</button>
</transition>
</div>
<script>
var vm = new Vue({
el:'#app',
data:{
isOff:false
}
})
</script>
</body>
多个组件过渡
多个组件之间的过渡,只需要使用动态组件即可,动态组件需要通过 Vue 中, < component>元素绑定 is 元素来实现多组件的过渡。
<style>
.fade-enter,.fade-leave-to{
opacity: 0;
}
.fade-enter-active,.fade-leave-active{
transition: opacity .5s ease;
}
</style>
--------------------------------------------------------------------
<body>
<template id='example1'><span>我是登录组件</span></template>
<template id='example2'><span>我是注册组件</span></template>
<div id="app">
<a href="javascript:;" @click="compontentName='example1'">登录 yzx</a>
<a href="javascript:;" @click="compontentName='example2'">注册 yzx</a>
<transition name="fade" mode="in-out">
<component :is="compontentName"></component> <!--绑定 is 属性-->
</transition>
</div>
<script>
Vue.component('example1',{
template:'#example1'
})
Vue.component('example2',{
template:'#example2'
})
var vm = new Vue({
el:'#app',
data:{
compontentName:''
}
})
</script>
点注册时,登录组件先进来再出去,in-out ,注意观察效果理解。
列表过渡
写一个列表的进入和离开过渡:
<style>
.list-item {
display: inline-block;
margin-right: 20px;
background-color:hotpink;
border-radius: 50%;
width: 30px;
height: 30px;
text-align: center;
line-height: 30px;
color: #fff;
}
.list-enter-active,.list-leave-active{
transition: all 1s;
}
.list-enter,.list-leave-to{
opacity: 0;
transform: translateY(30px);
}
</style>
------------------------------
<body>
<div id="app">
<button @click="add">随机插入一个数字</button>
<button @click="remove">随机移除一个数字</button>
<transition-group name="list" tag="p">
<span v-for="item in items" :key="item" class="list-item">{{item}}</span>
</transition-group>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
items:[1,2,3,4,5],
netNum:6
},
methods:{
randomindex(){
return Math.floor(Math.random()*this.items.length)
},
add(){
this.items.splice(this.randomindex(),0,this.netNum++)
},
remove(){
this.items.splice(this.randomindex(),1)
}
}
})
</script>
上述的代码有些许生硬,所以我们加一行代码,让过渡变得自然一点:
.list-move{
transition: transform 1s;
}
列表的排序过渡
Vue使用了FLIP简单动画队列来实现排序过渡,所以即使没有插入或者移除元素,对于元素顺序的变化也支持过渡动画。FLIP动画能提高动画的流畅度,可以解决动画的卡顿、闪烁等不流畅的现象,它不仅可以实现单列过渡,也可以实现多维网格的过渡。FLIP代表First、Last、lnvert、Play。
这是lodash.js 的链接:
< script src=“https://cdn.bootcss.com/lodash.js/4.17.4/lodash.min.js”>< /script>
实现一个 随机排序的效果:
<body>
<style>
.list-item {
display: inline-block;
margin-right: 20px;
background-color:hotpink;
border-radius: 50%;
width: 30px;
height: 30px;
text-align: center;
line-height: 30px;
color: #fff;
}
.list-move{
transition: transform 1s;
}
</style>
------------------------------------------------------------
<body>
<div id="app">
<button @click="shuffle"> 点击随机排序 yzx</button>
<transition-group name="list" tag="p">
<span v-for="item in items" :key="item" class="list-item">{{item}}</span>
</transition-group>
</div>
<script>
var vm = new Vue({
el:"#app",
data:{
items:[1,2,3,4,5]
},
methods:{
shuffle(){
//shuffle 会对数组重新排序
this.items = _.shuffle(this.items);
}
}
})
</script>
列表的交错过渡
在Vue中可以实现列表的交错过渡效果,它是通过data属性与JavaScript通信来实现的。接下来我们通过案例来讲解如何使用钩子函数结合Velocity.js库实现搜索功能,根据关键字来筛选出符合要求的列表数据,并添加过渡效果。
< script src=“https://cdnjs.cloudflare.com/ajax/libs/velocity/1.5.0/velocity.min.js”></ script>
先说抱歉,有点小问题,就是你输入仙女可以查到,你删掉女,然后显示就有点报错了,应该跟我这个链接文件有点关系吧,正常查没有问题的。
<script>
var vm = new Vue({
el:"#app",
data(){
return {
query:'',
items:[{
msg:'仙女'
},{
msg:'仙气飘飘'
},{
msg:'可可爱爱'
},{
msg:'没有脑袋'
},{
msg:'仙女本人'
}
]
}
},
computed:{
resultList(){
//根据用户输入的内容,查询 items
var query = this.query;
var items = this.items;
return items.filter(function(item){
return item.msg.indexOf(query) !== -1;
})
}
},
returnList(){
//根据用户输入的内容,查询 items
var query = this.query;
var items = this.items;
return items.filter(function(item){
return item.msg.indexOf(query) !== -1;
})
},
methods:{
beforeEnter(el){
el.style.opactity = 0
el.style.height = 0
},
enter(el,done){
//交错过渡,每个 li 都有延迟
var deplay = el.dataset.index *150;
setTimeout(function(){
Velocity(el,{
opactity:1,
height:'1.6em'
},{
complete:done
});
})
},
leave(el,done){
var deplay = el.dataset.index *150;
setTimeout(function(){
Velocity(el,{
opactity:0,
height:0
},{
complete:done
});
})
}
}
})
</script>
未经允许,禁止转载 ~ 今天就先这样吧,实在太困啦,后面没写的会补充的,仙女也是要睡觉觉的🤦♀️