小程序左右侧边栏

news2024/11/27 20:48:59

效果

点击左侧边栏,右侧会定位到对应内容;
右侧滑动,左侧也会显示对应的高亮;
也就是左右联动的效果
在这里插入图片描述

项目场景

tocc-app 应急巡检
传入数据:
在这里插入图片描述

左侧点击,右侧滚动到对应位置

点击左侧导航条,就计算出右侧要的

      toggleActive(index) {
        this.isSidebarClick = true
        this.scActiveIndex = index
        // .map返回数组,里面的元素是每个对象中scContentData的长度  [6,6,6,6,6]
        // 然后 .reduce 来求和 计算总的长度
        this.scContentScrollTop =
          this.scDataList
            .slice(0, index)
            .map((item) => item.scContentData.length)
            .reduce((total, length) => total + length, 0) *
            41 +
            // 因为右边除了数据,还要展示小标题,所以要再加上前面的标题
          this.scDataList.slice(0, index).length * 41
      },

完整代码

<template>
  <view class="sc-tabs">
    <!-- 左侧侧边栏 -->
    <view class="menu-aside-tab-box">
      <scroll-view class="menu-aside-tab" scroll-y>
        <view
          v-for="(item, index) in scDataList"
          :class="scActiveIndex === index ? 'aside-active' : 'aside-line'"
          :key="item.barId"
          class="aside-bar"
          @click="toggleActive(index)">
          <!-- :style="{ 'border-left': scActiveIndex === index ? '3px #3c9cff solid' : 'none' }" -->
          <view
            :style="{
              'border-left': scActiveIndex === index ? '3px #3c9cff solid' : 'none',
              'font-size': scActiveIndex === index ? '15px' : '13px',
              width: '100%',
              height: '12px',
              'line-height': '12px'
            }">
            {{ item.barTitle }}
          </view>
        </view>
      </scroll-view>
    </view>
    <!-- 右侧内容 -->
    <view class="scContent-box">
      <scroll-view class="scContent" scroll-y :scroll-top="scContentScrollTop" @scroll="ScHandleContentScroll">
        <view v-for="(item, index) in scDataList" :key="item.barId" class="content-bar">
          <view class="bar-title">
            <view class="br-title-line"></view>
            <text>{{ item.barTitle }}</text>
          </view>
          <view class="line"></view>
          <!-- 此处为内容栏每行,可以按需将view修改为card或list -->
          <view v-for="subItem in item.scContentData" :key="subItem.id" class="content-bar-item">
            <view style="height: 41px; line-height: 29px">{{ subItem.name }}</view>
            <view class="stateBox">
              <!-- 正常按钮 -->
              <button
                class="state"
                v-show="!subItem.isShowAddButton"
                :style="{ backgroundColor: buttonBgcMap[subItem.state[0]] }">
                {{ subItem.state[0] }}
              </button>

              <!-- 异常按钮 -->
              <button
                class="state"
                @click="errorButtonClick(item.barId, subItem.id)"
                :disabled="subItem.isShowAddButton"
                :style="{ backgroundColor: buttonBgcMap[subItem.state[1]] }">
                {{ subItem.state[1] }}
              </button>

              <!-- 添加按钮 -->
              <button
                class="state"
                v-show="subItem.isShowAddButton"
                @click="addClick"
                :style="{ backgroundColor: buttonBgcMap['添加'] }">
                添加
              </button>
            </view>
          </view>
          <!--  -->
        </view>
      </scroll-view>
    </view>
  </view>
</template>
<script>
  export default {
    name: 'yhuNavigation',
    props: {
      scPassingArray: {
        type: Array,
        required: true
      }
    },
    data() {
      return {
        scActiveIndex: 0,
        scDataList: [], //数据
        scContentScrollTop: 0, // 内容栏滚动位置
        ScContentHeight: 0, // 内容栏高度
        isSidebarClick: false, // 是否通过点击侧边栏触发滚动事件
        buttonBgcMap: {
          异常: '#FF5252',
          添加: '#1484E8',
          正常: '#25BE00'
        }
      }
    },
    created() {
      this.scDataList = [...this.scPassingArray]
    },
    mounted() {
      this.calculateContentHeight()
    },
    methods: {
      calculateContentHeight() {
        this.ScContentHeight =
          this.scDataList.map((item) => item.scContentData.length).reduce((total, length) => total + length, 0) * 30 +
          this.scDataList.length * 40
      },
      toggleActive(index) {
        this.isSidebarClick = true
        this.scActiveIndex = index
        console.log('this.scDataList.slice(0, index)', this.scDataList.slice(0, index))
        console.log(
          'this.scDataList.slice(0, index).map((item) => item.scContentData.length)',
          this.scDataList.slice(0, index).map((item) => item.scContentData.length)
        )

        this.scContentScrollTop =
          this.scDataList
            .slice(0, index)
            .map((item) => item.scContentData.length)
            .reduce((total, length) => total + length, 0) *
            41 +
          this.scDataList.slice(0, index).length * 41
      },
      ScHandleContentScroll(event) {
        // 通过点击侧边栏触发的滚动事件,不执行后续的处理
        if (this.isSidebarClick) {
          this.isSidebarClick = false
          return
        }
        const scrollTop = event.detail.scrollTop
        let ScAccumulatedHeight = 0
        let index = 0
        for (let i = 0; i < this.scDataList.length; i++) {
          const ScitemHeight = this.scDataList[i].scContentData.length * 30 + 40
          if (scrollTop >= ScAccumulatedHeight && scrollTop < ScAccumulatedHeight + ScitemHeight) {
            index = i
            break
          }
          ScAccumulatedHeight += ScitemHeight
        }
        this.scActiveIndex = index
      },

      // 异常按钮点击
      errorButtonClick(itemBarId, subItemId) {
        this.$emit('changeIsShowAddButton', { itemBarId, subItemId })
        // this.isShowAddButton = true
        // console.log('isShowAddButton', this.isShowAddButton)
      },

      //   点击添加按钮
      addClick() {
        console.log('点击了添加按钮!!')
      }
    }
  }
</script>

<style>
  /deep/.uni-scroll-view::-webkit-scrollbar {
    display: none;
    width: 0 !important;
    height: 0 !important;
    overflow: auto !important;
    appearance: auto !important;
    background: transparent;
  }
  .sc-tabs {
    display: flex;
    width: 100%;
    height: 100vh;
    /* margin-top: -5px; */
    border-top: 1px solid #eeeeee;
  }
  .menu-aside-tab-box {
    width: 22%;

    /* width: 88px; */
    height: 100%;
  }
  .menu-aside-tab {
    /* width: 20vh; */
    width: 88px;
    height: 100vh;
    background-color: transparent;
  }
  .aside-bar {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 40px;
    font-family: Alibaba-PuHuiTi, Alibaba-PuHuiTi;
    font-size: 13px;
    font-weight: normal;
    line-height: 18px;
    text-align: center;
  }
  .aside-active {
    position: relative;
    width: 100%;
    height: 40px;
    font-size: 15px;
    font-weight: 600;
    line-height: 40px;
    color: #3c9cff;
    background-color: #ffffff;
  }
  .aside-active-beforecontent {
    position: absolute;
    width: 3px;
    background-color: #008bff;
  }
  .aside-line {
    font-family: Alibaba-PuHuiTi, Alibaba-PuHuiTi;

    /* width: 95%; */

    /* height: 18px; */

    font-size: 13px;
    font-weight: normal;
    line-height: 18px;
    color: #333333;
  }
  .scContent-box {
    /* width: 80vh; */
    flex: 1;
    height: 100vh;
  }
  .scContent {
    width: 100%;
    height: 100%;
  }
  .content-bar {
    /* padding: 0px 60px; */
    padding-left: 12px;

    /* padding-bottom: 10px; */
    background: #ffffff;
  }
  .content-bar-item {
    display: flex;
    justify-content: space-between;
    width: 96%;
    height: 41px;
    padding-top: 5px;

    /* position: relative; */

    line-height: 30px;
    border-bottom: 1px solid #eeeeee;
    /* border: 1px solid red; */
  }
  .bar-title {
    display: flex;
    align-items: center;

    /* width: 300px; */
    width: 100%;
    height: 40px;
    font-family: Alibaba-PuHuiTi, Alibaba-PuHuiTi;
    font-size: 14px;
    font-weight: 600;
    line-height: 10px;
    color: #333333;
  }
  .br-title-line {
    width: 8px;
    height: 8px;
    margin-right: 6px;
    border: 2px solid #3c9cff;
    border-radius: 4px;
  }
  .line {
    width: calc(100% - 11px);
    height: 1px;
    background: #eeeeee;
  }
  .stateBox {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    width: 90px;
    height: 41px;
    padding-top: 3px;

    /* border: 1px solid red; */
    overflow: hidden;
  }
  .state {
    width: 40px;
    height: 22px;
    padding: 0 6px;
    font-family: Alibaba-PuHuiTi, Alibaba-PuHuiTi;
    font-size: 14px;
    font-weight: normal;
    line-height: 22px;
    color: #ffffff;
    text-align: center;
    border-radius: 2px;
  }
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript面向对象编程的奥秘揭秘:掌握核心概念与设计模式

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-面向对象 目录 什么是面向对象&#xff1f; 类与对象的主要区别 创建…

【数据结构】- 详解哈夫曼树(用 C 语言实现哈夫曼树的构造和哈夫曼编码)

目录 一、哈夫曼树的基本概念 二、哈夫曼树的构造算法 2.1 - 哈夫曼树的构造过程 2.2 - 哈夫曼树的存储表示 2.3 - 算法实现 三、哈夫曼编码 3.1 - 哈夫曼编码的主要思想 3.2 - 哈夫曼编码的性质 3.3 - 算法实现 一、哈夫曼树的基本概念 哈夫曼树的定义&#xff0c;涉…

电脑字体大小怎么设置?学会这3个方法,轻松调节!

“感觉我近视又加深了&#xff0c;最近看电脑居然感觉字体有点小。我想把字体放大一点但却不知道应该怎么操作&#xff0c;有没有朋友可以指导一下我呀&#xff1f;” 在我们的日常生活中&#xff0c;电脑已经成为我们获取信息、交流和娱乐的重要工具。字体大小作为电脑显示的基…

厦门基础城建中排水管网作用,助力提升城市韧性

在厦门这个美丽的海滨城市&#xff0c;城市建设与发展日新月异&#xff0c;其中&#xff0c;城市生命线下的排水管网监测系统作为城市基础设施的重要组成部分&#xff0c;对保障城市安全、提升城市品质发挥着关键作用。 对于厦门城市建设中的排水管网监测系统安装策略 1. 合理…

【头歌系统数据库实验】实验2 MySQL软件操作及建库建表建数据

目录 第1关&#xff1a;创建数据库 第2关&#xff1a;创建供应商表S&#xff0c;并插入数据 第3关&#xff1a;创建零件表P&#xff0c;并插入数据 第4关&#xff1a;创建工程项目表J&#xff0c;并插入数据 第5关&#xff1a;创建供应情况表SPJ&#xff0c;并插入数据 …

软件开发文档的内容

软件开发文档是开发过程中用于记录、指导和沟通的重要工具。它可以包含多个文档&#xff0c;每个文档都有其特定的格式和目的。以下是一些常见的软件开发文档及其可能的格式&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#…

模拟目录管理 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C++ 题目描述 实现一个模拟目录管理功能的软件,输入一个命令序列,输出最后一条命令运行结果。 支持命令: 1)创建目录命令: mkdir 目录名称,如mkdir abc为在当前目录创建abc目录,如果已存在同名目录则不执行任何操作…

HTML程序大全(2):通用注册模版

一、正常情况效果 二、某项没有填写的效果 三、没有勾选同意项的效果 四、代码 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>注册</title><style>body {font-family: Arial, sans-serif;background-color…

小航助学题库白名单竞赛考级蓝桥杯等考scratch(16级)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09; 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;

【重点】【矩阵】48. 旋转图像

题目 参考答案 法1&#xff1a;辅助矩阵 class Solution {public void rotate(int[][] matrix) {int n matrix.length;int[][] newMatrix new int[n][];for (int i 0;i < n; i) {newMatrix[i] matrix[i].clone();}for (int i 0; i < n; i) {for (int j 0; j <…

代码随想录算法训练营第四十四天 _ 动态规划_完全背包问题、518.零钱兑换II、377.组合总和IV。

学习目标&#xff1a; 动态规划五部曲&#xff1a; ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录&#xff01; 60天训练营打卡计划&#xff01; 学习内容&#xff1a; 完全背包问题 – 二维dp数组 动…

sklearn随机森林 测试 路面点云分类

一、特征5个坐标 坐标-特征-类别 训练数据 二、模型训练 记录分享给有需要的人&#xff0c;代码质量勿喷 import numpy as np import pandas as pd import joblib#region 1 读取数据 dir D:\\py\\RandomForest\\ filename1 trainRS filename2 .csv path dirfilename1file…

C# 图解教程 第5版 —— 第16章 接口

文章目录 16.1 什么是接口16.2 声明接口16.3 实现接口16.4 接口是引用类型16.5 接口和 as 运算符16.6 实现多个接口16.7 实现具有重复成员的接口16.8 多个接口的引用&#xff08;*&#xff09;16.9 派生成员作为实现&#xff08;*&#xff09;16.10 显示接口成员实现16.11 接口…

Matlab 曲线动态绘制

axes(handles.axes1); % 选定所画坐标轴 figure也可 h1 animatedline; h1.Color b; h1.LineWidth 2; h1.LineStyle -; % 线属性设置 for i 1 : length(x)addpoints(h1,x(i),y(i)); % x/y为待绘制曲线数据drawnow;pause(0.01); % 画点间停顿 end 示例&#xff1a; figure…

如何在Web应用中添加一个JavaScript Excel查看器

前言 在现代的Web应用开发中&#xff0c;Excel文件的处理和展示是一项常见的需求。为了提供更好的用户体验和功能&#xff0c;经常需要在Web应用中添加一个JavaScript Excel查看器&#xff0c;小编今天将为大家展示如何借助葡萄城公司的纯前端表格控件——SpreadJS来创建一个E…

Spark RDD惰性计算的自主优化

原创/朱季谦 RDD&#xff08;弹性分布式数据集&#xff09;中的数据就如final定义一般&#xff0c;只可读而无法修改&#xff0c;若要对RDD进行转换或操作&#xff0c;那就需要创建一个新的RDD来保存结果。故而就需要用到转换和行动的算子。 Spark运行是惰性的&#xff0c;在…

网络安全(四)--Linux 主机防火墙

7.1. 介绍 防火墙&#xff08;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网&#xff08;US5606668&#xff08;A&#xff09;1993-12-15&#xff09;。 它是一种位于内部网络与外部网络之间的网络安全…

clickhouse数据库磁盘空间使用率过高问题排查

一、前言 clickhouse天天触发磁盘使用率过高告警&#xff0c;所以需要进行排查&#xff0c;故将排查记录一下。 二、排查过程 1、连接上进入clickhouse 2、执行语句查看各库表使用磁盘情况 SELECT database, table, formatReadableSize(sum(bytes_on_disk)) as disk_space F…

数据库加密产品都有哪些功能?

数据库加密产品的主要功能是保护数据库中的敏感数据&#xff0c;确保其机密性和完整性。以下是数据库加密产品可能具备的一些功能&#xff1a; 数据加密&#xff1a;对数据库中的敏感数据进行加密&#xff0c;使得未经授权的人员无法读取或篡改数据。加密算法可以包括对称加密、…

2024 年 20 款最佳免费视频转换器软件 [安全快速有效]

最佳视频转换器软件的功能和定价的回顾和比较。从顶级付费和免费在线视频转换器工具列表中选择&#xff0c;可以快速轻松地转换任何视频&#xff1a; 什么是视频转换器&#xff1f; 视频转换工具允许您将视频从一种格式转换为另一种格式。第一个商业上成功的视频格式是 Quad&…