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.js桌面端自定义滚动条组件之美化滚动条VScroll
Dec 01 Vue.js
vue实现滚动鼠标滚轮切换页面
Dec 13 Vue.js
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 Vue.js
Vue中computed和watch有哪些区别
Dec 19 Vue.js
vue项目中openlayers绘制行政区划
Dec 24 Vue.js
vue使用require.context实现动态注册路由
Dec 25 Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
详解Vue3.0 + TypeScript + Vite初体验
Feb 22 Vue.js
Vue vee-validate插件的简单使用
Jun 22 Vue.js
Vue监视数据的原理详解
Feb 24 Vue.js
教你部署vue项目到docker
Apr 05 Vue.js
vue css 相对路径导入问题级踩坑记录
Jun 05 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
网页里控制图片大小的相关代码
2006/06/25 Javascript
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
Mootools 1.2教程 Tooltips
2009/09/15 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
JavaScript闭包详解
2015/02/02 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
详解Node.js:events事件模块
2016/11/24 Javascript
js+html获取系统当前时间
2017/11/10 Javascript
create-react-app修改为多页面支持的方法
2018/05/17 Javascript
vue debug 二种方法
2018/09/16 Javascript
使用JavaScript破解web
2018/09/28 Javascript
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
python引用DLL文件的方法
2015/05/11 Python
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
python3连接kafka模块pykafka生产者简单封装代码
2019/12/23 Python
opencv之颜色过滤只留下图片中的红色区域操作
2020/06/05 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
python中os.remove()用法及注意事项
2021/01/31 Python
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
Pamela Love官网:纽约设计师Pamela Love的精美、时尚和穿孔珠宝
2020/10/19 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
财务管理专业推荐信
2013/11/19 职场文书
《陶罐和铁罐》教学反思
2014/02/19 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
社区学习雷锋活动总结
2014/04/25 职场文书
产品售后服务承诺书
2014/05/21 职场文书
幼儿园小班教师个人工作总结
2015/02/06 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书