当前位置: 首页 > Web前端 > CSS

简单实用的vue自定义tab介绍

时间:2023-03-30 22:29:19 CSS

本文是根据vue官方文档整理而来,分别是:动态组件&异步组件、槽、进入/离开&列表过渡章节链接说明要实现tab动画,首先要了解什么vue中的元素/那些组件在那些条件下适合做动画效果条件渲染(使用v-if)条件显示(使用v-show)动态组件组件根节点vue官方文档有这样的例子Togglehello

当你在transition上添加指定的name时,Vue在进入/离开的transition中会有6个类开关,分别是:name-enter,name-enter-active,name-enter-to,name-leave,name-leave-active,name-leave-to如图:v-enter:定义start进入转换状态。元素插入前生效,元素插入后下一帧移除。v-enter-active:定义进入转换激活时的状态。在整个进入过渡阶段应用,在插入元素之前应用,并在过渡/动画完成后移除。此类可用于将处理时间、延迟和曲线函数定义为转换。v-enter-to:2.1.8及以上版本定义了enter过渡的结束状态。在插入元素后应用下一帧(同时移除v-enter),在过渡/动画完成后移除。v-leave:定义离开转换的开始状态。退出转换被触发后,它会立即在下一帧被删除。v-leave-active:定义离开转换激活时的状态。在整个退出过渡阶段应用,在触发退出过渡时立即应用,并在过渡/动画完成后移除。此类可用于定义离开转换的处理时间、延迟和曲线函数。v-leave-to:2.1.8及以上版本定义离开过渡的结束状态。在离开过渡被触发后应用下一帧(同时v-leave被移除),在过渡/动画完成后被移除。所以如果我们要实现tab切换动画,只需要在transition1中为我们每个单独的tab页添加子组件即可。使用ul(无序列表)在tab上方创建导航{{item.desc}}/ul>Definitionindatadata(){return{currentTabComponent:'tab1',//tab页默认显示第一个itemtabIndex:0,transitionName:''//tab按照既定格式定义tabs:[{id:'tab1',desc:'主页'},{id:'tab2',desc:'联系我们'},{id:'tab3',desc:'与我相关'}]}},设置li水平布局,我创建的时候是把各个导航名称放到data里面,用v-for做一个循环2.具体设置各个tab页
组件功能是vue项目的一大特色。组件可以扩展html元素并封装可重用代码。我们使用is属性对其进行扩展,使其可以在这些受限制的html元素中使用。is会将currentTabComponent的值转换成指定的组件形式:如果currentTabComponent是my-component转换后:修改tab导航被点击时的tabIndex,监听此时tabIndex的变化。当目标值>原始值时,向右滑动,否则向左滑动tabIndex(to,from){letthat=this;that.transitionName=(to>from)?'forward':'backward';}设置vue动画六种状态的class效果。因为这个项目有两个滑动状态,所以有12个classes.forward-enter-active,.forward-leave-active{transition:0.5sallease;transform:translateX(0);}.forward-enter{transform:translateX(100%);}.forward-enter-to{transform:translateX(0);}.forward-leave{transform:translate3d(0,0,0);}.forward-leave-to{transform:translate3d(-100%,0,0);}.backward-enter-active,.backward-leave-active{transition:all0.5s;}.backward-leave{transform:translate3d(0,0,0);}.backward-leave-to{transform:translate3d(100%,0,0);}.backward-enter{transform:translate3d(-100%,0,0);}。向后进入{transform:translate3d(0,0,0);}遇到一个问题:两个tab页相互切换时,当前div没有被移除,会导致下一个一直存在于当前div中,直到消失,所以我用position:absolute让每个div都浮在上面,但是我遇到的问题是最外面的盒子不能随着单个内层标签页的高度变化,所以我用js动态分配标签页的高度到outerLayerdiv,暂时还没有想到更好的解决办法。最后,我封装了组件。使用时只需要传入tab的title数组和一个单独的tab页即可使用。??:github地址可以查看代码github