Vue实现tab导航栏并支持左右滑动功能


Posted in Vue.js onJune 28, 2021

本文主要介绍:利用Vue实现tab导航栏,并且通过flex布局实现左右滑动,计算按钮的位置,当点击第一屏展示的最后一个且还有元素未展示时,自动滑动显示出未显示的元素。

tab导航栏布局:

<section class="theme-list">
  <div class="fixed-nav" ref="fixednav">
    <div class="fixed-nav-content">
      <p
        v-for="(item, index) in theme"
        :key="index"
        :class="['tab-title', activeId === index && 'select-tab']"
        @click="changeTab(index, $event)"
      >
        {{ item }}
      </p>
    </div>
  </div>
</section>
theme: ['CSDN博客', '博客园', '高考加油', '中考加油', '小欢喜', '七十周年'],
activeId: 0

导航栏样式代码:

.theme-list {
  margin-top: 12px;
}
.fixed-nav {
  overflow-x: scroll;
  -webkit-overflow-scrolling: touch;
}
.fixed-nav-content {
  display: flex;
}
.tab-title {
  padding: 0 13px;
  margin-right: 12px;
  color: #141414;
  border-radius: 13px;
  font-size: 12px;
  flex-shrink: 0;
  height: 0.52rem;
  line-height: 0.52rem;
}

此时我们可以实现下面的样式,并且可以左右滑动tab:

Vue实现tab导航栏并支持左右滑动功能

需要注意的是,在样式代码中需要添加flex-shrink : 0,这样才会当tab宽度大于外部容器宽度时不会收缩。

这样,我们基本的tab导航栏已经实现了,现在我们来实现:点击“中考加油”时,整个tab向左滑动,显示出剩下的tab元素。

changeTab(id, event) {
  // 如果选择的和当前激活的不同
  if (id !== this.activeId) {
    this.activeId = id;
    // 计算当前按钮的位置,看是否需要移动
    const spanLeft = event.clientX; // 当前点击的元素左边距离
    const divBox = document.querySelector(".select-tab").clientWidth / 2; // 点击的元素一半宽度
    const totalWidths = document.body.clientWidth; // 屏幕总宽度
    const widths = totalWidths / 2; // 一半的屏幕宽度
    const spanRight = totalWidths - spanLeft; // 元素的右边距离
    const scrollBox = document.querySelector(".fixed-nav"); // 获取最外层的元素
    const scrollL = scrollBox.scrollLeft; // 滚动条滚动的距离
    // 当元素左边距离 或者 右边距离小于100时进行滑动
    if (spanRight < 100 || spanLeft < 100) {
      scrollBox.scrollLeft = scrollL + (spanLeft - widths) + divBox;
    }
  }
}

通过这个方法可以实现tab的自动滚动了,但是此时还有一个问题是:在滑动的时候会显示出滚动条,显然是不太美观的。

/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/
::-webkit-scrollbar {
  width: 0.01rem;
  opacity: 0;
  display: none;
}
/*定义滚动条轨道 内阴影+圆角*/
::-webkit-scrollbar-track {
  background-color: #fff;
  opacity: 0;
}
/*定义滑块 内阴影+圆角*/
::-webkit-scrollbar-thumb {
  width: 0.01rem;
  border-radius: 0.01rem;
  opacity: 0;
}

这样,一个导航条就实现了,可以在结合公司的业务修改一下导航条的样式就可以啦!

到此这篇关于Vue实现tab导航栏,支持左右滑动的文章就介绍到这了,更多相关Vue左右滑动导航栏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
Vue router传递参数并解决刷新页面参数丢失问题
Dec 02 Vue.js
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
基于vue+echarts数据可视化大屏展示的实现
Dec 25 Vue.js
vue+vant 上传图片需要注意的地方
Jan 03 Vue.js
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
如何使用vue3打造一个物料库
May 08 Vue.js
详解Vue的options
May 15 Vue.js
vue使用Google Recaptcha验证的实现示例
Aug 23 Vue.js
Vue.Draggable实现交换位置
Apr 07 Vue.js
vue 给数组添加新对象并赋值
Apr 20 Vue.js
vue.js 使用原生js实现轮播图
Apr 26 Vue.js
vue递归实现树形组件
Jul 15 Vue.js
Vue3.0写自定义指令的简单步骤记录
vue.js Router中嵌套路由的实用示例
Jun 27 #Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
vue-router中hash模式与history模式的区别
Vue-Element-Admin集成自己的接口实现登录跳转
Vue + iView实现Excel上传功能的完整代码
Vue vee-validate插件的简单使用
Jun 22 #Vue.js
You might like
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
学习ExtJS Window常用方法
2009/10/07 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
jQuery页面加载初始化常用的三种方法
2014/06/04 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
浅谈js函数三种定义方式 &amp; 四种调用方式 &amp; 调用顺序
2017/02/19 Javascript
angularjs ui-router中路由的二级嵌套
2017/03/10 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
vue.js中使用echarts实现数据动态刷新功能
2019/04/16 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
Flask数据库迁移简单介绍
2017/10/24 Python
Python字符串的全排列算法实例详解
2019/01/07 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
python程序 线程队列queue使用方法解析
2019/09/23 Python
Python:slice与indices的用法
2019/11/25 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
用python发送微信消息
2020/12/21 Python
CSS3属性选择符介绍
2008/10/17 HTML / CSS
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
加拿大女包品牌:Matt & Nat
2017/05/12 全球购物
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
经济信息管理专业大学生求职信
2013/09/27 职场文书
旷课检讨书1000字
2014/02/14 职场文书
《草原》教学反思
2014/02/15 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
2021/04/13 Javascript
Java并发编程之详解CyclicBarrier线程同步
2021/06/23 Java/Android
Elasticsearch 聚合查询和排序
2022/04/19 Python
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js