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 相关文章推荐
8个非常实用的Vue自定义指令
Dec 15 Vue.js
Vue——前端生成二维码的示例
Dec 19 Vue.js
vue中父子组件的参数传递和应用示例
Jan 04 Vue.js
如何使用RoughViz可视化Vue.js中的草绘图表
Jan 30 Vue.js
用vite搭建vue3应用的实现方法
Feb 22 Vue.js
开发一个封装iframe的vue组件
Mar 29 Vue.js
idea编译器vue缩进报错问题场景分析
Jul 04 Vue.js
Vue自定义铃声提示音组件的实现
Jan 22 Vue.js
Vue+Flask实现图片传输功能
Apr 01 Vue.js
vue使用wavesurfer.js解决音频可视化播放问题
Apr 04 Vue.js
vue修饰符.capture和.self的区别
Apr 22 Vue.js
vue使用watch监听属性变化
Apr 30 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
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
php上传文件并显示上传进度的方法
2015/03/24 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
Aster vs KG BO3 第二场2.18
2021/03/10 DOTA
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
2014/01/11 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
JavaScript SHA512加密算法详细代码
2016/10/06 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
2019/01/08 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
详解Python中time()方法的使用的教程
2015/05/22 Python
python实现下载文件的三种方法
2017/02/09 Python
python django事务transaction源码分析详解
2017/03/17 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
Python登录注册验证功能实现
2018/06/18 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
自强之星事迹材料
2014/05/12 职场文书
自我管理的活动方案
2014/08/25 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
基于Python实现将列表数据生成折线图
2022/03/23 Python
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏