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防抖与节流
Nov 24 Vue.js
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 Vue.js
vue 动态创建组件的两种方法
Dec 31 Vue.js
vue调用微信JSDK 扫一扫,相册等需要注意的事项
Jan 03 Vue.js
深入了解Vue动态组件和异步组件
Jan 26 Vue.js
vscode自定义vue模板的实现
Jan 27 Vue.js
vue首次渲染全过程
Apr 21 Vue.js
Vue中插槽slot的使用方法与应用场景详析
Jun 08 Vue.js
Vue+TypeScript中处理computed方式
Apr 02 Vue.js
VUE解决跨域问题Access to XMLHttpRequest at
May 06 Vue.js
vue router 动态路由清除方式
May 25 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 伪造本地文件包含漏洞的代码
2011/11/03 PHP
PHP转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
通过javascript设置css属性的代码
2009/12/28 Javascript
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
详解JavaScript中Date.UTC()方法的使用
2015/06/12 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
2016/02/18 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
爬山算法简介和Python实现实例
2014/04/26 Python
python根据出生日期获得年龄的方法
2015/03/31 Python
Python实现简单的四则运算计算器
2016/11/02 Python
Python 搭建Web站点之Web服务器网关接口
2016/11/06 Python
轻松掌握python设计模式之策略模式
2016/11/18 Python
python编写微信远程控制电脑的程序
2018/01/05 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
2018/05/29 Python
Python重新加载模块的实现方法
2018/10/16 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
2020/06/05 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
2021/02/07 Python
canvas如何绘制钟表的方法
2017/12/13 HTML / CSS
Ramy Brook官网:美国现代女装品牌
2019/06/18 全球购物
人事主管岗位职责范本
2013/12/04 职场文书
服务承诺口号
2014/05/22 职场文书
党员检讨书范文
2014/12/27 职场文书
个人培训总结
2015/03/05 职场文书
2015年营销工作总结范文
2015/04/23 职场文书
500字作文之周记
2019/12/13 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android