Vue实列之过渡和动画,标签过渡,多组件过渡,列表过渡

过渡和动画

过渡和动画的概念

过渡:顾名思义,从一个状态向另外一个状态的过程,新的状态替换了旧的状态。不懂你就理解字面的意思,过渡就完事了。。。
动画: 就是比过渡功能更多更强大一点,实在懒得解释了,往后看吧~ 💭😭👍

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>

未经允许,禁止转载 ~ 今天就先这样吧,实在太困啦,后面没写的会补充的,仙女也是要睡觉觉的🤦‍♀️
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值