JavaScript:点击导航栏未显示完整的tab自动滚动并显示完整

提醒
本文实例使用vue开发的

一、需求场景

开发商品分类页面需求如下:

  1. 顶部显示商品分类导航栏,可左右自由滑动,点击左边或右边未显示完整的tab自动滚动显示完整;
  2. 点击顶部显示商品分类导航栏tab,下面列表数据显示对应的分类商品(SKU);

二、需求分析

  1. 顶部显示商品分类导航栏是分类数量是可变的;
  2. 需要计算tab距离父级布局左边和右边的距离 ,以此判断点击的分类tab是否显示完整。
  3. 点击顶部显示商品分类导航栏tab更新下面列表数据;

三、技术方案

  1. vue是数据绑定的,使用v-for,示例代码:
    v-for="(item, index) in tabList:key="index
  2. 使用getBoundingClientRect()方法,获取元素的位置以及其他相关信息。

四、实例效果图

最右边tab未显完整
在这里插入图片描述

点击后自动滚动并显示完整
在这里插入图片描述

五、实例代码

testTab.vue文件代码

<template>
    <div class="content-wrap">
        <div class="tool-bar">
            <div class="tool-bar-back">返回</div>
            <div class="tool-bar-title">热销商品</div>
        </div>
        <div id="navTab" class="nav-tab-wrap">
            <div class="tabs-btn" id="navTabs">
                <div style="padding-right: 0.16rem;" v-for="(item, index) in tabList" :key="index"
                    :id="'tabItem' + item.id" @click="swithtab(item.id)">
                    <div class="item" :class="{ 'item-active': tabId == item.id }">
                        {{ item.name }}
                    </div>
                </div>
            </div>
            <div id="list" class="list-wrap" v-for="(item, index) in skuList" :key="index">
                <div class="list-item-wrap">
                    <div class="list-item-name">{{ item.name }}</div>
                    <div class="list-item-desc">{{ item.desc }}</div>
                </div>
            </div>
        </div>

    </div>

</template>
<script>
export default {
    data() {
        return {
            typeData: [
                {
                    id: "0",
                    name: "水果",
                    skuList: [{
                        skuId: "123000",
                        name: "哈密瓜",
                        desc: "新鲜水果,果汁甜"
                    },
                    {
                        skuId: "123001",
                        name: "苹果",
                        desc: "新鲜水果,红苹果"
                    },
                    {
                        skuId: "123002",
                        name: "葡萄",
                        desc: "新鲜水果,紫色圆圆"
                    },
                    {
                        skuId: "123003",
                        name: "火龙果",
                        desc: "新鲜水果,果汁甜"
                    },
                    {
                        skuId: "123004",
                        name: "蓝莓",
                        desc: "新鲜水果,有护眼功效"
                    }
                    ]
                },
                {
                    id: "1",
                    name: "蔬菜",
                    skuList: [{
                        skuId: "223000",
                        name: "西红柿",
                        desc: "新鲜蔬菜,健康"
                    },
                    {
                        skuId: "223001",
                        name: "西芹",
                        desc: "新鲜蔬菜,健康"
                    },
                    {
                        skuId: "223002",
                        name: "娃娃菜",
                        desc: "新鲜蔬菜"
                    },
                    {
                        skuId: "223003",
                        name: "四季豆",
                        desc: "新鲜蔬菜,"
                    },
                    {
                        skuId: "223004",
                        name: "胡萝卜",
                        desc: "新鲜,有机蔬菜"
                    }
                    ]
                },
                {
                    id: "2",
                    name: "肉类",
                    skuList: [
                        {
                            skuId: "223003",
                            name: "牛腱",
                            desc: "新鲜牛肉"
                        },
                        {
                            skuId: "223004",
                            name: "五花肉",
                            desc: "新鲜猪肉"
                        },
                    ],
                },
                {
                    id: "3",
                    name: "粮油",
                    skuList: [
                        {
                            skuId: "323003",
                            name: "花生油",
                            desc: "炒菜香"
                        },
                    ],
                },
                {
                    id: "4",
                    name: "居家用品",
                    skuList: [
                        {
                            skuId: "423003",
                            name: "高压锅",
                            desc: "安全,使用级别"
                        },
                        {
                            skuId: "423003",
                            name: "炒锅",
                            desc: "不粘锅"
                        },
                    ],
                },
                {
                    id: "5",
                    name: "饮品",
                    skuList: [
                        {
                            skuId: "523003",
                            name: "有机纯牛奶",
                            desc: "高蛋白质"
                        },
                        {
                            skuId: "523004",
                            name: "雪碧",
                            desc: "碳酸饮料"
                        },
                    ],
                }
            ],
            tabList: [],
            skuList: [],
            tabId: 0,
        }

    },
    mounted() {
        this.initData()
    },
    methods: {
        initData() {
            this.tabList = this.typeData
            this.skuList = this.typeData[this.tabId].skuList;
        },

        swithtab(id) {
            let navTabsDiv = document.getElementById("navTabs")
            let navTabItemDiv = document.getElementById(`tabItem${id}`)

            let navTabsRect = navTabsDiv.getBoundingClientRect()
            let navTabItemRect = navTabItemDiv.getBoundingClientRect()

            if (navTabItemRect.left < 36) {
                navTabsDiv.scrollBy(-(navTabsRect.left - navTabItemRect.left + 40), 0)
            } else if (navTabItemRect.right > navTabsRect.right) {
                if (id == this.tabList.length - 1) {
                    navTabsDiv.scrollBy(navTabItemRect.right - navTabsRect.right, 0)
                } else {
                    navTabsDiv.scrollBy(navTabItemRect.right - navTabsRect.right + 40, 0)
                }
            }

            this.tabId = id;
            this.skuList = this.typeData[id].skuList;
        },
    }


}
</script>
<style scoped lang="scss">
.content-wrap {
    background-color: #f5f5f5;
}

.tool-bar {
    position: fixed;
    top: 0;
    left: 0;
    display: flex;
    flex-direction: row;
    width: 100%;
    height: 88px;
    line-height: 88px;
    font-size: 16px;
    color: black;
    align-items: flex-end;
    background-color: #fff;
    z-index: 9999;
}

.tool-bar-back {
    width: 44px;
    height: 88px;
    line-height: 88px;
    text-align: center;
    margin-left: 16px;
    align-items: center;
}

.tool-bar-title {
    flex: 1;
    font-weight: bold;
    margin-right: 60px;
    align-items: center;
    text-align: center;
}

.nav-tab-wrap {
    width: 3.43rem;
    background: #FFF;
    border-radius: 8px;
    margin: .16rem auto 0;
    padding-top: .16rem;
    min-height: 6.5rem;
}

::-webkit-scrollbar {
    height: 0;
}

.tabs-btn {
    padding: 0 .16rem;
    margin-top: .16rem;
    overflow-x: scroll;
    overflow-y: hidden;
    display: flex;
    padding-bottom: 16px;
    border-bottom: #eee solid 1px;

    .item {
        padding: .05rem .12rem;
        font-size: .14rem;
        line-height: .2rem;
        font-weight: 400;
        color: #333333;
        background: #f5f5f5;
        border-radius: .15rem;
        white-space: nowrap;
    }

    .item-active {
        font-weight: 600;
        color: #FFFFFF;
        background: #FF594A;
    }
}

.list-wrap {
    position: relative;
    display: flex;
    flex-direction: column;
    border-radius: 8px;
    background-color: white;
    margin-top: 16px;
    overflow-y: scroll;
}

.list-item-wrap {
    display: flex;
    flex-direction: column;
    padding: 10px;
    align-items: flex-start;
    flex: 1;
    border-bottom: #eee solid 1px;
}

.list-item-name {
    font-size: 14px;
    font-weight: bold;
    color: black;
}

.list-item-desc {
    font-size: 12px;
    color: black;
    margin-top: 8px;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/912296.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】详解RAII思想与智能指针

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 丢掉幻想&#xff0c;准备斗争 目录 引言 内存泄漏 内存泄漏的危害 内存泄漏的处理 一、RAII思想 二、智能指针 1.auto_ptr 实现原理 模拟实现 弊端…

力扣: 144 二叉树 -- 先序遍历

二叉树 – 先序遍历 描述&#xff1a; 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例&#xff1a; 先序遍历&#xff1a;根左右 何解&#xff1f; 1、递归 : 无需多言一看就懂 2、遍历法 中序查找时&#xff0c;最先出入的节点是左子树中的最左侧二叉…

从0开始搭建一个生产级SpringBoot2.0.X项目(十)SpringBoot 集成RabbitMQ

前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot集成RabbitMQ RabbitMQ中的一些角色&#xff1a; publisher&#xff1a;生产者 consumer&#xff1a;消费者 exchange个&#xff1a;交换机&#xff0c;负责消息路由 queue&#xff1a;队列…

github高分项目 WGCLOUD - 运维实时管理工具

GitHub - tianshiyeben/wgcloud: Linux运维监控工具&#xff0c;支持系统硬件信息&#xff0c;内存&#xff0c;CPU&#xff0c;温度&#xff0c;磁盘空间及IO&#xff0c;硬盘smart&#xff0c;GPU&#xff0c;防火墙&#xff0c;网络流量速率等监控&#xff0c;服务接口监测&…

CDN到底是什么?

文章目录 CDN到底是什么&#xff1f;一、引言二、CDN的基本概念1、CDN的定义2、CDN的作用3、代码示例&#xff1a;配置CNAME记录 三、CDN的工作原理1、请求流程2、代码示例&#xff1a;DNS解析过程3、完整的CDN工作流程 四、总结 CDN到底是什么&#xff1f; 一、引言 在互联网…

DeFi 4.0峥嵘初现:主权金融时代的来临

近年来&#xff0c;Web3领域的创新似乎遇到了瓶颈&#xff0c;DeFi&#xff08;去中心化金融&#xff09;从热潮的巅峰逐渐进入了一个沉寂期。我们再也没有见到像DeFi Summer那样的行业兴奋&#xff0c;资本市场的动荡和Meme币的出现&#xff0c;似乎让人们忘记了曾经的区块链技…

Linux:调试器 gdb/cgdb 的使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、调试前的预备二. 使用&#xff08;gdb的常用命令&#xff09;三. 推荐安装cgdb总结 前言 本文主要讲解如何在Linux环境下面来对代码进行调试 一、调试前的…

知识中台赋能法律咨询服务:八大核心优势

法律咨询服务领域&#xff0c;知识中台以其独特的功能和优势&#xff0c;为行业发展注入了新的活力。以下是知识中台在法律咨询服务中展现的八大核心优势&#xff1a; 一、法律知识资源的全面整合 知识中台致力于收集、整理和整合各类法律知识资源&#xff0c;包括法律法规、…

03集合基础

目录 1.集合 Collection Map 常用集合 List 接口及其实现 Set 接口及其实现 Map 接口及其实现 Queue 接口及其实现 Deque 接口及其实现 Stack类 并发集合类 工具类 2.ArrayList 3.LinkedList 单向链表的实现 1. 节点类&#xff08;Node&#xff09; 2. 链表类&a…

VBA高级应用30例应用3在Excel中的ListObject对象:插入行和列

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

万字长文详解JavaScript基础语法--前端--前端样式--JavaWeb

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 今天毛毛张带来的前端教程的第三期&#xff1a;JavaScript 文章目录 4.JavaScript4.1 JS简介4.1.1 JS起源4.1.2 JS 组成部分4.1.3 JS的引入方式 4.2 JS的数据类型和运…

工业主板在汽车制造中的应用

工业主板在汽车制造中的应用非常广泛&#xff0c;主要得益于其高稳定性、高集成性、以及强大的计算和处理能力。以下是对工业主板在汽车制造中应用的详细分析&#xff1a; 一、应用场景 自动驾驶车辆&#xff1a; 工业主板作为自动驾驶车辆的核心计算平台&#xff0c;负责处…

post sim下如何将timing信息反标到仿真工具

文章目录 0 前言1 调用格式2 option介绍2.1 sdf_file (**必须**)2.2 module_instance (**可选**)2.3 config_file (**可选**)2.4 log_file (**可选**)2.5 mtm_spec (**可选**)2.6 scale_factors (**可选**)2.7 scale_type (**可选**) 0 前言 跑post sim时需要带入timing信息&a…

软件设计师-上午题-15 计算机网络(5分)

计算机网络题号一般为66-70题&#xff0c;分值一般为5分。 目录 1 网络设备 1.1 真题 2 协议簇 2.1 真题 3 TCP和UDP 3.1 真题 4 SMTP和POP3 4.1 真题 5 ARP 5.1 真题 6 DHCP 6.1 真题 7 URL 7.1 真题 8 浏览器 8.1 真题 9 IP地址和子网掩码 9.1 真题 10 I…

VLAN 高级技术实验

目录 一、实验背景 二、实验任务 三、实验步骤 四、实验总结 一、实验背景 假如你是公司的网络管理员&#xff0c;为了节省内网的IP地址空间&#xff0c;你决定在内网部署VLAN聚合&#xff0c;同时为了限制不同业务之间的访问&#xff0c;决定同时部署MUX VLAN。 二、实验…

一文快速预览经典深度学习模型(一)——CNN、RNN、LSTM、Transformer、ViT

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要简要并通俗地介绍了几种经典的深度学习模型&#xff0c;如CNN、RNN、LSTM、Transformer、ViT&#xff08;Vision Transformer&#xff09;等&#xff0c;便于大家初探深度学习的相关知识&#xff0c;并更好地理解深度学…

这是一个bug求助帖子--安装kali 遇坑

第一个报错 介质&#xff1a;kali-linux-2024.1-live-amd64 环境&#xff1a;Dell笔记本 i510代cpu 现象及操作 安装完以后 然后我换了个国内的源进行了以下操作 apt-get update&#xff1a;更新源列表 apt-get upgrade&#xff1a;更新所有可以更新的软件包 然后进行清理。…

qt QClipboard详解

1、概述 QClipboard是Qt框架中的一个类&#xff0c;它提供了对窗口系统剪贴板的访问能力。剪贴板是一个临时存储区域&#xff0c;通常用于在应用程序之间传递文本、图像和其他数据。QClipboard通过统一的接口来操作剪贴板内容&#xff0c;使得开发者能够方便地实现剪切、复制和…

PyTorch核心概念:从梯度、计算图到连续性的全面解析(三)

文章目录 Contiguous vs Non-Contiguous TensorTensor and ViewStrides非连续数据结构&#xff1a;Transpose( )在 PyTorch 中检查Contiguous and Non-Contiguous将不连续张量&#xff08;或视图&#xff09;转换为连续张量view() 和 reshape() 之间的区别总结 参考文献 Contig…

DeBiFormer实战:使用DeBiFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…