iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue可滑动的tab组件使用详解
  • 764
分享到

vue可滑动的tab组件使用详解

2024-04-02 19:04:59 764人浏览 安东尼
摘要

本文实例为大家分享了Vue可滑动tab组件使用的具体代码,供大家参考,具体内容如下 需求: 1. 每个tab-item的间距是相同的,可定制 2. 每一个tab-item的宽度是随着

本文实例为大家分享了Vue可滑动tab组件使用的具体代码,供大家参考,具体内容如下

需求:

1. 每个tab-item的间距是相同的,可定制

2. 每一个tab-item的宽度是随着文字的增多而宽度增大

3. 当tab-item小于等于4个时,tab-item填满当前屏幕,平分剩余空间;当tab-item超过4个时,tab可滑动选择

4. 点击tab-item时,底部横线居中显示,跟随在点击的tab-item底部

5. 从上一个页面点击一级分类,进入此页面,显示上一页面点击的一级分类名称,居中显示,样式高亮

先展示效果截图

前期知识点

1)offsetLeft:子元素相对于父元素最左上角侧的横向偏离位置

2)offsetWidth: 元素的宽度

3)scrollLeft: 滑动到对应的x坐标

4)定位元素style.left的运用

5)vux组件之滑动tab的运用 (需要用到组件自带的onItemClick()方法,通过dom,可以起到点击该tab-item的作用)

难点

1)使用vux的可滑动的tab,修改组件css,如何令到每一个tab的间距为响应式的。

原本vux的可滑动的tab是根据scrollWidth的长度来自动计算每一个tab-item的宽度的,因为包含这tab-item的tabBox这个div使用的是flex布局,而tab-item是它的子元素,它会自动沾满tabBox。如果文字超出了tab-item的宽度,文字就会被隐藏。

可以通过修改vux-tab-item这个样式来自定义样式,把子元素的弹性属性去除,并且设置他的padding,这样可以呈现出文字能显示全,并且每个tab-item间距相同的效果,CSS如下:


.mpm-container .vux-tab .vux-tab-item {
  display: inline-block;
  width: auto;
  height: 100%;
  padding: 0 10px;
  flex: none;
  background: transparent;
  overflow: hidden;
}

2)这个组件最核心之一的就是底部bar的精准定位跟随

因为上面的1)改变了布局,所以导致底部bar跟随不准确的情况,我们可以定制bar。在vux里面,bar是一个div,它有滑动的动画,我的做法是这样的,首先通过right让它置于tab的最左侧,然后通过按钮点击事件获得相对应的tab-item元素的下标,然后使用for循环从第一tab-item开始寻找,如果不为改元素,则把它的元素宽度进行累加,直到找到该需激活的tab-item,然后通过数学计算可把bar定位在该元素的底部并且居中,代码如下:

onItemClick(keyWord, index) {
      let barLeft = 0;
      document.getElementsByClassName('vux-tab-ink-bar')[0].style.right = '100%';
      for (let i = 0; i < this.list.length; i++) {
        if (document.getElementsByClassName('vux-tab-item')[i].innerText === keyword) {
          barLeft += document.getElementsByClassName('vux-tab-item')[i].offsetWidth / 2;
          //为什么是15?因为底部bar长度为30px,这样做可以让bar的中心对齐tab-item的中心
          barLeft -= 15;
          break;
        }
        barLeft += document.getElementsByClassName('vux-tab-item')[i].offsetWidth;
      }
      document.getElementsByClassName('vux-tab-ink-bar')[0].style.left = (barLeft + 'px');
    },

3)从前一个页面点击一级分类进入商品列表页,自动选中并在屏幕居中显示被选中的tab-item

当超出手机的可视宽度时,获取当前屏幕宽度,然后评分长度,计算之后,平均分给tab-item,因为每一个tab-item自己的样式中有设置的padding属性,所以间距相同,不需要额外为间距分配空间。

否则则不需要分配宽度,因为是flex布局的子元素,每一个tab-item会根据自己的文字得到自己的宽度。

附完整代码:

<template>
  <div class="mpm-container">
    <div style="width: 100%;overflow:scroll; -WEBkit-overflow-scrolling:touch;">
      <tab ref="tabBox" bar-active-color="#149c81" active-color="#149c81" :line-width="4" :custom-bar-width="getBarWidth" v-model="tabD" :style="{width: tabWidth + 'px'}">
        <tab-item v-for="(item,index) in list" :key="index" @on-item-click="onItemClick(item, index)">{{item}}
        </tab-item>
      </tab>
    </div>
  </div>
</template>
 
<script>
import {
  Tab, TabItem
} from 'vux';
 
export default {
  data() {
    return {
      list: ['打印机', '订书机11111111', '订书机5', '打印机333333', '复读机333333',],
      tabD: 0,
      // tab标签div长度
      tabWidth: document.body.clientWidth,
    }
  },
  computed: {},
  components: {
    Tab, TabItem
  },
  mounted() {
    setTimeout(() => {
      this.$refs.tabBox.$children[0].onItemClick();
    }, 200)
    this.setTabWidth();
  },
  methods: {
    setTabWidth() {
      // 页面完成刷新之后
      this.$nextTick(() => {
        var realW = 0, offW = 0;
        // realW为每一个tab-item的长度总和,因为tab-item的父级为flex布局,而tab-item的flex: none,所以初始化的时候,tab-item会根据自己的字体长度,自动扩张宽度。
        for (let i = 0; i < this.$refs.tabBox.$children.length; i++) {
          realW += this.$refs.tabBox.$children[i].$el.offsetWidth;
        }
        // 同样是计算初始化的时候,每一个tab-item的总宽度,但当tab-item总长度大于tab的总长度时,立马退出程序
        for (let i = 0; i < this.$refs.tabBox.$children.length; i++) {
          offW += this.$refs.tabBox.$children[i].$el.offsetWidth;
          if (offW > (document.body.clientWidth)) break
        }
        // 假如tab-item的总宽度小于显示tabwidth,则评分tab的剩余空间,加到每一个tab-item中
        if (offW < (document.body.clientWidth)) {
          var offD = (document.body.clientWidth) - offW;
          for (let i = 0; i < this.$refs.tabBox.$children.length; i++) {
            this.$refs.tabBox.$children[i].$el.style.width = this.$refs.tabBox.$children[i].$el.clientWidth + offD / this.$refs.tabBox.$children.length + 'px';
          }
        } else {
          this.tabWidth = realW;
        }
      })
    },
    getBarWidth() {
      // 函数控制tab-bar的宽度,如果tab标签页数量为1,则隐藏tab-bar
      if (this.list && this.list.length === 1) {
        return '0px';
      }
      return '30px';
    },
    onItemClick(keyword, index) {
      let barLeft = 0;
      document.getElementsByClassName('vux-tab-ink-bar')[0].style.right = '100%';
      for (let i = 0; i < this.list.length; i++) {
        if (document.getElementsByClassName('vux-tab-item')[i].innerText === keyword) {
          barLeft += document.getElementsByClassName('vux-tab-item')[i].offsetWidth / 2;
          //为什么是15?因为底部bar长度为30px,这样做可以让bar的中心对齐tab-item的中心
          barLeft -= 15;
          break;
        }
        barLeft += document.getElementsByClassName('vux-tab-item')[i].offsetWidth;
      }
      document.getElementsByClassName('vux-tab-ink-bar')[0].style.left = (barLeft + 'px');
    },
 
  }
}
 
</script>
 
<style scoped lang="less">

.mpm-container .vux-tab .vux-tab-item {
  display: inline-block;
  width: auto;
  height: 100%;
  padding: 0 10px;
  flex: none;
  background: transparent;
  overflow: hidden;
}
</style>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: vue可滑动的tab组件使用详解

本文链接: https://www.lsjlt.com/news/164771.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • vue可滑动的tab组件使用详解
    本文实例为大家分享了vue可滑动tab组件使用的具体代码,供大家参考,具体内容如下 需求: 1. 每个tab-item的间距是相同的,可定制 2. 每一个tab-item的宽度是随着...
    99+
    2024-04-02
  • Vue可左右滑动按钮组组件使用详解
    本文实例为大家分享了基于Vue可左右滑动按钮组组件,供大家参考,具体内容如下 左右两箭头控制按钮组左右移动,双击到最左或最右边,功能比较简单。如下所示 <template&g...
    99+
    2024-04-02
  • vue滑动解锁组件使用方法详解
    本文实例为大家分享了vue滑动解锁组件的使用,供大家参考,具体内容如下 这是一个pc端的滑动解锁组件 效果图: 话不多说,直接上代码 html部分 <template>...
    99+
    2024-04-02
  • Vue滑块解锁组件使用方法详解
    本文实例为大家分享了Vue滑块解锁组件的使用,供大家参考,具体内容如下 依据 JS拖动滑块验证 开发的 Vue 滑块解锁组件。 <template>   <div ...
    99+
    2024-04-02
  • Vue可左右滑动按钮组组件怎么用
    这篇文章将为大家详细讲解有关Vue可左右滑动按钮组组件怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下左右两箭头控制按钮组左右移动,双击到最左或最右边,功能比较简单。如下所示<tem...
    99+
    2023-06-29
  • Vue 可拖拽组件Vue Smooth DnD的使用详解
    目录简介和 Demo 展示API: Container属性生命周期回调事件API: Draggable实战简介和 Demo 展示 最近需要有个拖拽列表的需求,发现一个简单好用的 Vu...
    99+
    2024-04-02
  • vue使用动态组件实现TAB切换效果
    目录问题描述 什么是vue的动态组件 应用场景描述 实现步骤 第一步(新建组件并引入注册) 第二步(布局,上面放tab点击的标签,下面放组件呈现对应内容)第三步(写好上面的tab点击...
    99+
    2024-04-02
  • vue components 动态组件详解
    目录总结总结数组发生变化时,动态加载相应数据 场景:点击不同组件名称,界面显示相应组件 步骤一:导入所需组件 步骤二:点击 tab 选项卡,将对应组件名添加进数组 步骤三:使用动态组...
    99+
    2024-04-02
  • Vue加载中动画组件使用方法详解
    本文实例为大家分享了Vue加载中动画组件的使用,供大家参考,具体内容如下 (模仿ant-design加载中样式)效果图如下: ①创建Loading.vue组件: <templ...
    99+
    2024-04-02
  • vue使用动态组件实现TAB切换效果完整实例
    目录一、方法1:使用Vant组件库的tab组件二、 方法2:手动创建tab切换效果三、完整代码总结一、方法1:使用Vant组件库的tab组件 Vant 2 - Mobile UI C...
    99+
    2023-05-20
    vue tab切换组件 vue tab切换 vue动态组件切换
  • vue中router-view组件的使用详解
    在开发vue项目中经常需要实现一个页面里面可以切换着展现不同的组件页面 例如:下图中通过点击侧边栏不同的组件路由到不同的组件页,而侧边栏和顶部部分是不变的,切换的只是组件页面。 这...
    99+
    2024-04-02
  • Android自定义滑动解锁控件使用详解
    最近的项目里用到了,在网上找不到合适的,于是自己写了个简单的,带回弹效果:可以自定义的属性有:<!-- 滑动解锁控件 xml配置属性 --><declare-styleable name="SlideToUnlockVie...
    99+
    2023-05-30
    android 滑动解锁 roi
  • vue实现鼠标滑动预览视频封面组件示例详解
    目录组件效果组件设计1、视频截取关键帧2、鼠标移入封面时显示对应关键帧3、视频和封面的状态切换功能实现1、视频截取关键帧图片列表1.1 截取指定帧1.2 截取stepNums张关键帧...
    99+
    2024-04-02
  • Vue提示框组件vue-notification使用详解
    先看下演示效果: 安装方法:通过 npm install vue-notification 就能使用了。 导入方法: import Notifications from 'vue-...
    99+
    2023-03-20
    Vue提示框vue notification Vue提示框组件
  • vue3动态组件使用详解
    目录vue2vue3markRow:标记一个对象,使其不能成为一个响应式对象。toRaw:将响应式对象(由 reactive定义的响应式)转换为普通对象。shallowRef:只处理...
    99+
    2023-02-27
    vue3中动态组件 vue3动态加载组件 vue3动态添加组件
  • vue-seamless-scroll无缝滚动组件使用方法详解
    本文实例为大家分享了vue无缝滚动组件vue-seamless-scroll的具体实现代码,供大家参考,具体内容如下 下载 cnpm i -S vue-seamless-scrol...
    99+
    2024-04-02
  • vue使用Split封装通用拖拽滑动分隔面板组件
    目录前言开始基础布局数据绑定事件绑定优化优化一 抖动问题优化二 鼠标样式优化三 滑动限制优化四 面板默认宽度和滑动器宽度优化五 插槽优化六 禁止选中结束组件完整代码组件使用示例前言 ...
    99+
    2024-04-02
  • 详细解读VUE父子组件的使用
    目录1.递归组件2.组件之间的循环使用二,深层次的问题**1.父传子****2.子传父***3.兄弟关系** 4.子组件复用5.父组件通过ref调用子组件的方法我们对父子组...
    99+
    2023-05-19
    VUE 组件 VUE父子组件
  • vue组件component的注册与使用详解
    目录1.什么是Vue组件(1)定义(2)父子关系2.Vue组件使用(注册方式)1.局部注册(私有组件注册)2.全局注册3.使用组件的步骤:1.什么是Vue组件 (1)定义 组件是Vu...
    99+
    2022-11-13
    vue组件component vue组件注册使用
  • 详解Vue新增内置组件的使用
    目录一、Teleport1.1 Teleport 介绍1.2 使用 Teleport1.3 预览效果二、Suspense2.1 介绍 Suspense2.2 使用 Suspense2...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作