按箭头上下左右来实现简单二层级树形结构

news2024/11/25 2:02:26

按箭头上下左右来实现简单二层级树形结构
按↓键
按↓键选中站点3

.vue template内容

<div class="nav-container">
      <ul class="nav-list" :class="{ 'border-glow': status == 'F' }">
        <li
          v-for="(item, index) in items"
          :key="index"
          @click="selectItem(index)"
          :class="{ active: activeIndex === index }"
        >
          {{ item.name }}
          <ul
            v-if="isVisible(index)"
            :class="[
              isVisible(index) ? 'children-selected' : 'children',
              status == 'C' ? 'border-glow' : '',
            ]"
          >
            <li
              v-for="(child, ind) in item.children"
              @click="selectChildrenItem(ind)"
              :key="ind"
              :class="{ active: activeChildrenIndex === ind }"
            >
              {{ child.name }}
            </li>
          </ul>
        </li>
      </ul>
    </div>

script中内容

export default {
  data() {
    return {
      activeIndex: 0, // 用于跟踪当前展开的子列表的父项索引
      activeChildrenIndex: 0,
      status: "F",
      items: [
        {
          name: "站点1",
          hasChildren: true,
          children: [
            {
              id: 1,
              name: "10kV"
            },
            {
              id: 2,
              name: "20kV"
            },
          ],
        },
        {
          name: "站点2",
          hasChildren: false
        },
        {
          name: "站点3",
          hasChildren: false,
        },
        {
          name: "站点4",
          hasChildren: false
        },
      ],
    };
  },
  methods: {
    selectItem(index) {
      this.activeIndex = index;
    },
    selectChildrenItem(index) {
      this.activeChildrenIndex = index;
    },
    isVisible(index) {
      // 根据activeIndex判断当前项的子列表是否应该显示
      return this.activeIndex === index;
    },
    handleKeyDown(event) {
      const length = this.items.length ? this.items.length : 0;
      const currentItem = this.items[this.activeIndex];
      const childrenLength =
        currentItem && Array.isArray(currentItem.children)
          ? currentItem.children.length
          : 0;
      // 根据按键来移动当前索引
      if (event.key === "ArrowDown") {
        if (this.status == "F") {
          this.activeIndex = (this.activeIndex + 1) % length;
        } else {
          if (length > 0) {
            this.activeChildrenIndex =
              (this.activeChildrenIndex + 1) % childrenLength;
          }
        }
      } else if (event.key === "ArrowUp") {
        if (this.status == "F") {
          this.activeIndex = (length + this.activeIndex - 1) % length;
        } else {
          this.activeChildrenIndex =
            (childrenLength + this.activeChildrenIndex - 1) % childrenLength;
        }
      } else if (event.key === "ArrowLeft") {
        // 选中父列表状态为F,选中子列表状态为C
        if ((this.status = "C")) {
          this.status = "F";
          // 让子项归为0
          this.activeChildrenIndex = 0;
          // 加入选中样式
        }
      } else if (event.key === "ArrowRight") {
        event.preventDefault();
        if ((this.status = "F")) {
          this.status = "C";
          // 加入样式
        }
      } else if (event.key === "Enter") {
        this.$router.push({
          path: "xxx",
        });
      }
      // 可以根据需要添加ArrowLeft等其他按键处理
    }
  },
  mounted() {
    // 监听键盘事件
    document.addEventListener("keydown", this.handleKeyDown);
  },
  beforeDestroy() {
    // 移除事件监听器
    document.removeEventListener("keydown", this.handleKeyDown);
  },
};

style

.item {
  position: relative; /* 使得子列表可以相对于父项定位 */
  display: flex; /* 使用flex布局来让文本和箭头/按钮并排显示 */
  align-items: center; /* 垂直居中 */
  /* 其他样式... */
}
/* 隐藏默认的下拉列表样式(如果需要的话) */
.children {
  display: none;
}

/* 当子列表应该显示时,使用CSS类来覆盖上面的display: none */
.children-selected {
  display: block; /* 或者使用flex、grid等其他布局方式 */
  position: absolute;
  background-color: #142bf7b6;
  left: 50%;
  width: 200px;
  height: auto;
}
/* 隐藏默认的下拉列表样式(如果需要的话) */
.childrenD {
  display: none;
}

/* 当子列表应该显示时,使用CSS类来覆盖上面的display: none */
.childrenD-selected {
  display: block; /* 或者使用flex、grid等其他布局方式 */
  position: absolute;
  background-color: #142bf7b6;
  left: 100%;
  width: 200px;
  height: auto;
}
.nav-container {
  display: flex;
  width: 25%;
  list-style: none;
  padding: 0;
  margin: 10% 0 0 25%;
}

.nav-list {
  flex: 1;
}
.nav-list li {
  padding: 10px;
  font-size: 18px;
  border: 1px solid rgba(204, 204, 204, 0.014);
  margin-bottom: -1px; /* 移除相邻元素之间的双边框 */
  cursor: pointer;
  background-color: #6eb6f1a6;
}

.nav-list li.active {
  font-size: 18px;
  background-color: #064ccf;
  color: white;
}
.border-glow {
  /* 使用CSS来创建发光效果 */
  border: 2px solid #42b983; /* 举例:绿色边框 */
  box-shadow: 0 0 10px #42b983; /* 举例:绿色发光效果 */
}

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

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

相关文章

iOS 18降级后遭遇“白苹果”?可试试这几种解决办法

随着苹果iOS系统的不断升级&#xff0c;用户们总是满怀期待地尝试最新的系统版本&#xff0c;但偶尔也会因为某些原因选择降级回旧版本。然而&#xff0c;iOS 18降级后遇到“白苹果”问题&#xff0c;无疑给许多用户带来了困扰。今天&#xff0c;我们就来探讨一下&#xff0c;当…

CAD二次开发IFoxCAD框架系列(26)- 分段测量多段线长度和计算多边形的面积

#region 分段测量多段线长度private static double textHight 10;[CommandMethod(nameof(PolylineDemo))]public void PolylineDemo(){using var tr new DBTrans();if(!tr.LayerTable.Has("标注")){tr.LayerTable.Add("标注",1);}var pso new PromptSel…

开绕组永磁电机驱动系统零序电流抑制策略研究(7)——基于零矢量重新分布的120°矢量解耦/中间六边形调制零序电流抑制策略

1.前言 很久没有更新过开绕组电机的仿真了。在一年前发了开绕组的各种调制策略。开绕组电机最常见的两种解耦调制就是120矢量解耦/中间六边形调制和180矢量解耦/最大六边形调制。 我当时想的是&#xff0c;180解耦调制/最大六边形调制的电压利用率最高&#xff0c;所以我就一直…

docker部署project-exam-system

使⽤docker部署project-exam-system 1. 背景&#xff0c;在⼀台主机之内&#xff0c;实现容器的编排&#xff0c;发布考试系统 2. 环境准备 1. docker 1. vim /etc/docker/daemon.json 2. docker-compos 3. 普通的部署 1. 镜像 1. 前端&#xff1a;nginx latest服务 1. 拉取…

Python实现贝叶斯优化器(Bayes_opt)优化深度森林(Deep Forest)分类模型(deepforest分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 深度森林是一种基于集成学习的机器学习方法&#xff0c;其设计灵感来源于深度学习的成功。它通过堆叠多…

2024年四款必备的Windows录屏工具推荐!

无论你是教育工作者、游戏主播、还是企业培训师&#xff0c;一款好的录屏工具都能让你的工作事半功倍。今天&#xff0c;我们就来探讨录屏工具几种不同的使用情境&#xff0c;并推荐几款适合相应情境的Windows录屏工具&#xff01; 福昕录屏大师 直达链接&#xff1a;www.fox…

云联惠涉传!商家联盟再起新秀!某店模式 三年百亿销售额!

大家好&#xff0c;我是吴军&#xff0c;任职于一家致力于软件开发领域的公司&#xff0c;担任产品经理的职位。 今天&#xff0c;我想和大家探讨一下曾经风靡一时的云联惠平台。在其全盛时期&#xff0c;该平台吸引了超过一千万的用户&#xff0c;并且资金规模达到了6000亿的…

食品种类检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

食品种类检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

100%结构化输出——OpenAI新功能大幅增强工具调用

告别杂乱输出&#xff0c;OpenAI引领大模型的精准时代 ©作者|Steven 来源|神州问学 作为一名大模型的使用者&#xff0c;你是否曾通过编写极其复杂的提示词&#xff0c;以规范化模型输出的内容&#xff0c;然而结果普遍是模型输出格式与要求的格式相差甚远&#xff0c;导…

[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-27浅谈XILINX BRAM的基本使用

软件版本&#xff1a;VIVADO2021.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA 实验平台&#xff1a;米联客-MLK-H3-CZ08-7100开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http…

0826-0901 各种面试笔试题算法题整理

目录 1. 最长回文子串 2. 设计模式里和单一职责原则冲突的是&#xff1f; 3. int array[] {10,20,30} cout<<-2[array-1] 是多少 4. python 定义 class method 直接对类修改变量值和建立对象后通过对象修改变量值&#xff0c;最后的结果是多少 5. LRU缓存 6. 二叉…

Kafka【六】Linux下安装Kafka集群

Kafka从早期的消息传输系统转型为开源分布式事件流处理平台系统&#xff0c;所以很多核心组件&#xff0c;核心操作都是基于分布式多节点的。本文这里采用三台虚拟机模拟真实物理主机搭建Zookeeper集群和kafka集群。 VMware可以使用户在一台计算机上同时运行多个操作系统&…

继承(CPP)

引言 继承是CPP的一个重要语法。在现实生活中存在“子承父业”的说法&#xff0c;在CPP中同样存在这样的语法&#xff0c;而继承就是这种语法。 面向对象的三大特征&#xff1a;封装、继承、多态 本文将通过以下要素&#xff0c;进行继承的深入讲解 1.继承的概念及定义 2.基…

什么是网络准入控制系统?四款网络准入控制系统推荐 干货满满!

在当今的企业网络环境中&#xff0c;随着设备类型的多样化和远程办公的普及&#xff0c;网络安全面临的挑战愈加复杂。网络准入控制系统&#xff08;Network Access Control, NAC&#xff09;应运而生&#xff0c;成为企业保障网络安全的重要工具。本文就带你详细了解这一系统&…

4 款基于Python的鼠标键盘自动化工具,可解决Windows、macOS和Linux下的桌面自动化问题

在日常工作中&#xff0c;自动化工具可以极大地提升我们的工作效率&#xff0c;尤其是当面对重复性任务时。今天&#xff0c;我们将详细介绍四款基于Python的鼠标键盘自动化工具&#xff0c;帮助你在各种平台上轻松实现自动化操作。这些工具分别是 PyAutoGUI、KeymouseGo、Keyl…

《Nature》重磅发布:ChatGPT在学术研究和写作中的最佳应用指南

在论文写作过程中&#xff0c;ChatGPT 已成为许多研究人员的得力助手。知名生物医学教授 Milton Pividori 博士在《Nature》杂志上发表的文章《Chatbots in Science: What Can ChatGPT Do for You?》详细探讨了如何通过精心设计的提示词来有效利用 ChatGPT 提高学术写作的效率…

支付宝线上小程序打开异常

1. 其他手机都可以正常访问线上版本&#xff0c;只有一个安卓手机不行&#xff08;排除支付宝低版本以及手机系统问题&#xff09; 2. 出现访问异常的手机都可以正常访问体验版以及开发版本 3. 尝试去关闭该手机的联调设置以及清除开发版缓存&#xff0c;成功访问线上版本 需要…

如何彻底关闭Chrome浏览器自动更新

1.首先找到桌面 中Google Chrome浏览器的图片,鼠标右键打开文件所在的位置 2.选择Google 目录 选择 Update 目录 右键 选择属性 右键 选择属性 点击确定 修改成功 3.继续 第(2)步 选择 高级 4.点击禁用继承 !!!!!!! 测试 再次点击 Update 文件夹 弹出 你当前无权访问该文件夹…

一文1400字Jmeter实现mqtt协议压力测试

1. 下载jmeter&#xff0c;解压 https://jmeter.apache.org/download_jmeter.cgi 以 5.4.3 为例&#xff0c;下载地址&#xff1a; https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.zip linux下解压&#xff1a; unzip apache-jmeter-5.4.3.zip 2. 下载m…

如何在 Github 上找到心仪的开源项目?

Github&#xff0c;全球最大的开源社区&#xff0c;集中了目前最多、最优质的各种开源代码。 我们经常说不要重复造轮子&#xff0c;但如果不知道怎么找到已有的轮子&#xff0c;那就没有前提&#xff0c;对自己来说什么轮子都是新的。所以&#xff0c;搞开发&#xff0c;首先要…