本文基于vue官方文档,分别为:动态组件 & 异步组件插槽进入/离开 & 列表过渡 章节链接描述

要想实现tab动画,首先要了解vue中哪些元素/那些组件适合在那些条件下实现动画效果

  • 条件渲染 (使用 v-if)
  • 条件展示 (使用 v-show)
  • 动态组件
  • 组件根节点

vue官方文档中有这样一个例子

<div id="demo">
<button v-on:click="show = !show">
Toggle
</button>
<transition name="fade"><!--用transition包裹要添加动画的元素/组件-->
<p v-if="show">hello</p>
</transition>
</div>

当你在transition上添加指定的name后,vue在进入/离开的过渡中,会有 6 个 class 切换,分别为:
name-enter、name-enter-active、name-enter-to、name-leave、name-leave-active、name-leave-to

如图所示:

v-enter:定义进入过渡的开始状态。在元素被插入之前生效,在元素被插入之后的下一帧移除。

v-enter-active:定义进入过渡生效时的状态。在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。

v-enter-to: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入之后下一帧生效 (与此同时 v-enter
被移除),在过渡/动画完成之后移除。

v-leave: 定义离开过渡的开始状态。在离开过渡被触发时立刻生效,下一帧被移除。

v-leave-active:定义离开过渡生效时的状态。在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。

v-leave-to: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发之后下一帧生效 (与此同时 v-leave
被删除),在过渡/动画完成之后移除。

所以我们要想实现tab切换动画,只需要在transition中添加我们每个单独tab页的子组件

1.用ul(无序列表)创建tab上方导航

<ul class="tabNav">
<li v-for="(item, index) in tabs" :class="{'active' : tabIndex === index}" @click="changeTab(index)">{{item.desc}}</li>
</ul>

data中的定义

data () {
return {
currentTabComponent: 'tab1',
// tab页默认显示第一项
tabIndex: 0,
transitionName: ''
// tab根据既定格式定义
tabs: [
{
id: 'tab1',
desc: '首页'
},
{
id: 'tab2',
desc: '联系我们'
},
{
id: 'tab3',
desc: '与我相关'
}
]
}
},

设置li横向排布,我创建的时候是把每个导航名称放在data里,用v-for做循环

2.具体设置每个tab页

<!-- slot中间表示插槽内容为空时显示的默认值 -->

<!-- 每一个tab页的展示, keep-alive使得标签的组件实例能够在它们第一次被创建的时候缓存下来-->

<div class="content">
<keep-alive>
<transition :name="transitionName">
<component v-bind:is="currentTabComponent"></component>
</transition>
</keep-alive>
</div>

组件功能是vue项目的一大特色。组件可以扩展html元素,可以封装可重用的代码。我们用is特性来扩展,从而达到可以在这些受限制的html元素中使用。is会将currentTabComponent的值转换成指定的组件形式:
如果currentTabComponent为my-component
<component v-bind:is="currentTabComponent"></component>
转化后为:<my-component></mu-component>

在tab导航点击时修改tabIndex,此时监听tabIndex的变化,当目的值>原始值,向右滑动,反之向左滑动

tabIndex (to, from) {
let that = this;
that.transitionName = (to > from) ? 'forward' : 'backward';
}

设置vue动画六个状态的class的效果,此项目中因为存在两种滑动状态,所以有12个class

.forward-enter-active,.forward-leave-active{
transition: 0.5s all ease;
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: all 0.5s;
}
.backward-leave {
transform: translate3d(0, 0, 0);
}
.backward-leave-to {
transform: translate3d(100%, 0, 0);
}
.backward-enter {
transform: translate3d(-100%, 0, 0);
}
.backward-enter-to {
transform: translate3d(0, 0, 0);
}


遇到问题:
在两个tab页相互切换时,当前div没被移走,将会导致下一个将会一直存在于当前div消失才一上来,所以我用了position:absolute,使每个div都飘在上面,但是遇到的问题是最外层的盒子不能随内层单个tab页高度变化,所以我用了js动态把tab页高度赋值给外层div,目前还没想到更好的方案。

最后我封装了一下组件,使用时只需要传入tab的标题数组和单独的tab页即可使用

⚠️:github地址可查看代码github

简易实践的vue自定义tab入门的更多相关文章

  1. Vue可自定义tab组件

    在工作中我们常常要用到tab组件,如果有用第三方组件库的话一般都会有这个组件,但如果没有使用第三方组件库,或者想要自定义tab,那么或许这个无依赖的tab组件将会极大地节约你的开发时间.     如何 ...

  2. vue自定义插件封装,实现简易的elementUi的Message和MessageBox

    vue自定义插件封装示例 1.实现message插件封装(类似简易版的elementUi的message) message组件 <template>     <transition  ...

  3. Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js快速入门(二)

    Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js快速入门(二) 前言 上篇文章对Vue.js有了初步理解,接下来我们把Vue.js基础语法快速的过一遍,先混个脸熟留个印象就 ...

  4. Vue自定义组件实现v-model指令

    Tips: 本文所描述的Vue均默认是Vue2版本 在我们初次接触Vue的时候,一定会了解到一个语法糖,那就是v-model指令,它带给我们的第一印象就是它可以实现双向绑定 那么,什么是双向绑定?通俗 ...

  5. 使用vue实现tab操作

    在使用jQuery类库实现tab功能时,是获取鼠标在mousenter或click时的index值,然后切换到当前的标题和内容,把其他的标题和内容的状态去掉: $('.tab .title').fin ...

  6. Vue的简单入门

    Vue的简单入门 一.什么是Vue? vue.js也一个渐进式JavaScript框架,可以独立完成前后端分离式web项目 渐进式:vue可以从小到控制页面中的一个变量后到页面中一块内容再到整个页面, ...

  7. Nuxt/Vue自定义导航栏Topbar+标签栏Tabbar组件

    基于Vue.js实现自定义Topbar+Tabbar组件|仿咸鱼底部凸起导航 最近一直在倒腾Nuxt项目,由于Nuxt.js是基于Vue.js的服务端渲染框架,只要是会vue,基本能很快上手了. 一般 ...

  8. vue自定义指令实例使用(实例说明自定义指令的作用)

    在写vue项目的时候,我们经常需要对后台返回的数据进行大量的渲染操作,其中就包含了大量的对特殊数据的进一步处理,比如说时间戳.图片地址.特殊数据显示等等特殊数据处理改进. 其实遇到这种情况,通过Vue ...

  9. vue自定义指令

    Vue自定义指令: Vue.directive('myDr', function (el, binding) { el.onclick =function(){ binding.value(); } ...

随机推荐

  1. shell+Zabbix export应用之AD环境删除离职人员登录主机之资料

    以实际环境:维护环境172.30网段主机 Zabbix hosts export出主机信息至 /tmp/ip.txt shell筛选出ip [root@server ~]# cat /tmp/ip.t ...

  2. 浅谈Object.assign()

    Object.assign()方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.返回值为目标对象. 1 Object.assign 是 ES6 新添加的接口,主要的用途是用来合并多个 Ja ...

  3. vBox Arch UEFI LVM安装

    Table of Contents 介绍 配置 基础 VirtualBox配置 安装准备 基础 分区 格式化 挂载 安装 选择镜像 安装基本系统 配置 fstab chroot 一些配置 lvm2 网 ...

  4. maven的依赖特性

    若排版紊乱可查看我的个人博客原文地址 maven的依赖特性很多很杂,这里大概总结一下,maven的依赖特性主要是依赖范围和传递依赖,前者会影响后者,这篇文章会介绍传递依赖的传递原则,出现冲突传递依赖默 ...

  5. selemiun 自动化测试登录验证码处理

    selemiun 自动化测试登录验证码处理 一.软件及插件的安装 1.火狐浏览器版本(55.0(x64 zh-CN):https://www.cnblogs.com/sandysun/p/783811 ...

  6. DevExpress v18.2新版亮点——Reporting篇(二)

    行业领先的.NET界面控件——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress Reporting v18.2 的新功能,新版3 ...

  7. js★★★【面向对象的使用方法】*****************★★★★ 相当重要

    标准用法: function Sprite(){ //函数内容部设置属性 this.name='shimily'; } //原型上设置方法 Sprite.prototype.show=function ...

  8. cocso引擎整体流程

    任何程序都有入口,mian.cpp; Cocos2d也不免俗,在win32平台下,有一个mian.cpp 入口,从这里进入cocos的世界. #ifndef __MAIN_H__ #define __ ...

  9. sql嵌套查询

    嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询.其中外层查询也称为父查询,主查询.内层查询也称子查询,从查询. ...

  10. 精进之路之CAS

    CAS (Compare And Swap) 即比较交换, 是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术,本文将深入的介绍CAS的原理. 其算法核心思想如下 执行函数: ...