前端 鱼骨图 elenemt ui

news2024/9/20 23:56:53

展示图

在这里插入图片描述

代码

<template>
  <div>
    <div
      class="fishbone"
      :style="{ height: `calc((${topChiderH} + ${topChiderH}) + 33px)` }"
    >
      <div class="top-box">
        <div
          class="flex-items"
          ref="topChilderen"
          :style="{ height: topChiderH }"
        >
          <template v-for="(item, index) in leftArr">
            <ul
              class="itme-childeren"
              v-if="item.i % 2"
              :key="index"
              :class="active >= item.i ? 'border-color' : ''"
            >
              <li class="item-title">
                <el-popover
                  placement="top-start"
                  title="标题"
                  width="200"
                  trigger="hover"
                  content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。"
                >
                  <div
                    class="title border-box"
                    :class="active >= item.i ? 'border-color bag' : ''"
                    slot="reference"
                  >
                    {{ item.lable }}
                  </div>
                </el-popover>
              </li>
              <li class="flex-items" v-for="(o, i) in item.childeren" :key="i">
                <div
                  class="border-box"
                  :class="active >= item.i ? 'border-color' : ''"
                >
                  {{ o.lable }}
                </div>
                <span
                  class="bag-line"
                  :class="active >= item.i ? 'bag' : ''"
                ></span>
              </li>
            </ul>

            <ul
              class="itme-childeren bottom-itme-childeren"
              :style="{ bottom: `-${topChiderH}` }"
              :class="active >= item.i ? 'border-color' : ''"
              v-else
              :key="index"
            >
              <li class="flex-items" v-for="(o, i) in item.childeren" :key="i">
                <div
                  class="border-box"
                  :class="active >= item.i ? 'border-color ' : ''"
                >
                  {{ o.lable }}
                </div>
                <span
                  class="bag-line"
                  :class="active >= item.i ? 'bag' : ''"
                ></span>
              </li>

              <li class="item-title">
                <div
                  class="border-box bottom-title"
                  :class="active >= item.i ? 'border-color bag' : ''"
                >
                  {{ item.lable }}
                </div>
              </li>
            </ul>
          </template>
        </div>
      </div>
      <div class="line-box">
        <div class="line"></div>
        <div
          class="line-color"
          :style="{
            width: widths,
          }"
        ></div>
        <div class="date-box">{{ currentTime }}</div>
      </div>
    </div>
    <div @click="next">下一步</div>
  </div>
</template>
<script>
import { getcurrentTime } from "@/utils/index.js";
export default {
  data() {
    return {
      topChiderH: "",
      botChiderH: "",
      leftArr: [
        {
          lable: "标题", //标题
          i: 1,
          bag: "", //背景颜色
          childeren: [
            {
              lable: "早餐订单",
            },
            {
              lable: "午餐订单",
            },
            {
              lable: "晚餐订单",
            },
          ],
        },
        {
          lable: "标题", //标题
          bag: "", //背景颜色
          i: 2,
          childeren: [
            {
              lable: "早餐订单",
            },
            {
              lable: "早餐订单",
            },
            {
              lable: "早餐订单",
            },
          ],
        },
        {
          lable: "标题", //标题
          bag: "", //背景颜色
          i: 3,
          childeren: [
            {
              lable: "早餐订单",
            },
            {
              lable: "早餐订单",
            },
          ],
        },
        {
          lable: "标题", //标题
          bag: "", //背景颜色
          i: 4,
          childeren: [
            {
              lable: "净菜数量",
            },
            {
              lable: "损耗控制",
            },
          ],
        },
        {
          lable: "标题", //标题
          bag: "", //背景颜色
          i: 5,
          childeren: [
            {
              lable: "出餐数量",
            },
            {
              lable: "损耗控制",
            },
          ],
        },
        {
          lable: "标题", //标题
          i: 6,
          bag: "", //背景颜色
          childeren: [
            {
              lable: "早餐订单",
            },
            {
              lable: "午餐订单",
            },
            {
              lable: "晚餐订单",
            },
          ],
        },
        {
          lable: "标题", //标题
          bag: "", //背景颜色
          i: 7,
          childeren: [
            {
              lable: "午餐订单",
            },
            {
              lable: "午餐订单",
            },
            {
              lable: "午餐订单",
            },
          ],
        },
        {
          lable: "标题", //标题
          bag: "", //背景颜色
          i: 8,
          childeren: [
            {
              lable: "午餐订单",
            },
            {
              lable: "午餐订单",
            },
          ],
        },
        {
          lable: "标题", //标题
          bag: "", //背景颜色
          i: 9,
          childeren: [
            {
              lable: "午餐订单",
            },
            {
              lable: "午餐订单",
            },
          ],
        },
        {
          lable: "标题", //标题
          bag: "", //背景颜色
          i: 10,
          childeren: [
            {
              lable: "午餐订单",
            },
            {
              lable: "午餐订单",
            },
          ],
        },
      ],

      active: 0,
      currentTime: getcurrentTime(new Date()),
      nowtime: null,
    };
  },
  computed: {
    widths() {
      const active = this.active;
      return active == 1
        ? "13.6%"
        : active == 2
        ? `calc(11% * ${active})`
        : active == 3
        ? `calc(10.2% * ${active})`
        : active == 4
        ? `calc(9.75% * ${active})`
        : active == 5
        ? `calc(9.51% * ${active})`
        : active == 6
        ? `calc(9.33% * ${active})`
        : active == 7
        ? `calc(9.22% * ${active})`
        : active == 8
        ? `calc(9.13% * ${active})`
        : active == 9
        ? `calc(9.06% * ${active})`
        : `calc(10% * ${active})`;
    },
  },
  mounted() {
    // 获取元素最高度
    let topHeight =
      window.getComputedStyle(this.$refs.topChilderen).height || "";
    // let bottomHeight =
    //   window.getComputedStyle(this.$refs.botChilderen).height || "";
    this.topChiderH = topHeight;
    // this.botChiderH = bottomHeight;
    // 获取当前日期  定时器
    this.nowtime = setInterval(() => {
      const date = new Date();
      this.currentTime = getcurrentTime(date);
    }, 1000);
  },

  destroyed() {
    clearInterval(this.nowtime);
  },
  methods: {
    next() {
      console.log(23423);
      if (this.active++ > 9) this.active = 0;
    },
  },
};
</script>
<style lang="scss" scoped>
ul {
  padding: 0;
  margin: 0;
}

.fishbone {
  $bnoe-color: #169bd5;
  $bne-color: #ccc;
  position: relative;
  margin-top: 32px;
  .top-box {
    position: relative;
    z-index: 2;
    margin: 0 30px;
    width: 85%;
  }
  .item-title {
    position: absolute;
    top: -34px;
    left: 60%;
  }
  .line {
    height: 2px;
    width: 100%;
    background: #ccc;
  }
  ul {
    position: relative;
  }
  ul li {
    list-style: none;
    width: auto;
    transform: skewX(-45deg);
    text-align: center;
    padding: 2px 0;
    width: 100%;
  }
  .border-box {
    border: 1px solid $bne-color;
    padding: 5px;
    border-radius: 10px;
    width: 100%;
  }
  .title {
    text-align: center;
  }
  .bag-line {
    display: inline-block;
    background: $bne-color;
    width: 40px;
    height: 2px;
  }
  .bag {
    background: $bnoe-color;
    color: #fff;
  }
  .itme-childeren {
    border-right: 2px solid $bne-color;
    transform: skewX(45deg);
    display: flex;
    flex-direction: column;
    justify-content: center;
    height: 100%;
    // margin: 0 20px;
    // padding: 10px 0;
    // padding-left: 20px;
    width: calc(100% / 10);
    // border-bottom: 1px solid #cccc;
  }

  .bottom-itme-childeren {
    transform: skewX(-45deg);
    // width: calc(100% / 4);
    // border-top: 1px solid #cccc;
    border-bottom: none;
    position: relative;
    bottom: -106px;
    li {
      transform: skewX(45deg);
    }
    .bottom-title {
      position: absolute;
      // right: -50px;

      bottom: -33px;
    }
    .item-title {
      position: absolute;
      bottom: 0px;
      left: 50%;
      top: auto;
    }
  }
  .line-color {
    background: $bnoe-color;
    position: absolute;
    top: 0;
    height: 2px;
  }
  .border-color {
    border-color: $bnoe-color;
  }
}
.line-box {
  position: relative;
  top: -1px;
  z-index: -1;
}
.date-box {
  position: absolute;
  right: 0;
  top: 50%;
  transform: translate(0%, -50%);
  line-height: 25px;
  width: 160px;
  text-align: center;
  background: #b6f2fd;
  padding: 20px 5px;
  font-size: 20px;
  border-radius: 10px;
  color: #333;
}
</style>

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

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

相关文章

使用预训练CNN生成图像嵌入(image embeddings)

文章目录 什么是图像嵌入&#xff1f;来自 Kaggle 的狗品种图像数据集从狗品种图像数据集生成图像嵌入参考 什么是图像嵌入&#xff1f; 图像嵌入是图像的低维表示。换句话说&#xff0c;它是图像的密集向量表示&#xff0c;可用于分类等许多任务。 例如&#xff0c;这些深度…

(0020) H5-Vue-router+Element-ui 搭建非常简单的dashboard

参考学习&#xff1a; Vue Vue-router Element-ui 搭建一个非常简单的dashboard demo demo参考&#xff1a;https://github.com/wangduanduan/vue-el-dashboard 在线预览 效果图&#xff1a; 使用到的技术&#xff1a; Vue Vue-router Element-ui webpack Normalize.css v…

final关键字 抽象类

final关键字 可以修饰类、属性、方法和局部变量【参数】。 使用场景 1、当不希望 类被继承时&#xff0c;可以用final修饰。比如不希望子类重写父类时。 2、当不希望子类重写父类的某个方法。注意&#xff1a;此时不能重写但能继承父类此方法使用。 3、当不希望类的某个属…

windows下在注册表中添加右键pycharm打开目录

1、winregedit打开注册表&#xff0c;并在shell下创建项&#xff0c;修改如下图右侧内容 2、在PyCharm下创建command项&#xff0c;并修改其内容 3、重启电脑 4、显示

比ping还好用的排障命令

遇到网络故障的时候&#xff0c;你一般会最先使用哪条命令进行排障&#xff1f; 除了Ping&#xff0c;还有Traceroute、Show、Telnet又或是Clear、Debug等等。 今天安排的&#xff0c;是Traceroute排障命令详解&#xff0c;给你分享2个经典排障案例哈。 01 Traceroute原理和功…

Cisco ISR 4000 Series IOS XE Release Dublin-17.11.1a ED

Cisco ISR 4000 Series IOS XE Release Dublin-17.11.1a ED 思科 4000 系列集成服务路由器 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-isr-4000/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 思科 4000 系列…

Matlab无人机算法开发套件上新,快速实现控制算法到无人机平台的移植

在现有的旋翼无人机市场中&#xff0c;绝大部分可二次开发的产品都只提供C、C等SDK&#xff0c;但在科研类无人机这一细分领域中&#xff0c;更多的开发者偏好或善于使用Matlab进行算法的开发和验证。为了助力从事控制算法理论研究的开发者&#xff0c;能够独立完成控制算法到无…

举例说明什么是循环神经网络

循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种处理时间序列数据和自然语言等具有顺序信息的数据的神经网络模型。与普通的前馈神经网络&#xff08;Feedforward Neural Network&#xff09;不同&#xff0c;RNN具有循环连接&#xff0c;使得网络能…

【Java】-【IDEA 编译项目时报错:GC overhead limit exceeded】

文章目录 问题简述问题分析解决方案解决方案一解决方案二 问题简述 以前项目启动都是好好的&#xff0c;没有任何问题&#xff0c;最近启动时却报错&#xff1a; java.lang.OutOfMemoryError: ...(此处忽略) GC overhead limit exceeded问题分析 错误是发生在编译阶段&#…

STM32单片机CAN总线汽车灯光控制系统远近光刹车双闪

实践制作DIY- GC0151---CAN总线汽车灯光控制系统 基于STM32单片机设计---CAN总线汽车灯光控制系统 二、功能介绍&#xff1a; OLED主控板&#xff1a;STM32F103C系列最小系统OLED显示3个按键&#xff08;大灯开关、大灯自动/手动、大灯近光/远光&#xff09;左转按键右转按键双…

docker学习(七)docker daemon

1.Docker 的CS模式 1.1.Docker 的C/S模式介绍 在 Docker Client 中来运行 Docker 的各种命令&#xff0c;这些命令会传送给在 Docker 的宿主机上运行的 Docker 守护进程。而 Docker 守护进程是负责实现 Docker 各种功能的。 如图所示&#xff0c;Docker 守护进程运行在宿主机…

超参数调试、Batch正则化和程序框架

1、归一化网络的激活函数&#xff08;Normalizing activations in a network &#xff09; 规范化&#xff0c;方法如下&#xff0c;减去均值再除以标准偏差&#xff0c;为了使数值稳定&#xff0c; 通常将&#x1d700;作为分母&#xff0c;以防&#x1d70e; 0的情况 &…

使用maven profile 实现一次打包多版本依赖的fat jar

基于一种特殊情况: 需要开发通用代码,但底层依赖的jar有不同版本,使用一次maven 命令编译来同时生成多个fat jar。 测试代码结构: log4j-v1/log4j-v2 有一个同名类被maintest引用。 maintest pom.xml如下 <?xml version="1.0" encoding="UTF-8"…

Docker的安装以及Docker私有仓库的搭建

Docker的安装 # 1、yum 包更新到最新 yum update # 2、安装需要的软件包&#xff0c; yum-util 提供yum-config-manager功能&#xff0c;另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3、 设置yum源 yum-config-manage…

基于QT设计的无人机地面站(摄像头录像拍摄)

一、功能需求 通过QT设计一款无人机地面站软件,需要包含基本的RTSP拉流功能,对接无人机平台的RTSP流。此外,需要完成拍照、录像、OSD叠加功能;完成按钮控制云台进行拍照、录像、变焦、指点运动等。在此基础上,完成对应的目标跟踪识别。 技术要求 (1)采用QT平台,设计W…

一、QT主界面简介和创建一个QT工程

QT从入门到实战学习笔记 一、QtCreator主界面简介1、欢迎界面2、编辑界面3、设计界面4、Debug界面5、帮助界面6、主界面左下角按钮 二、创建QT工程1、创建一个新的project2、模板选择3、项目介绍和位置4、定义所建的系统文件类型5、创建类信息&#xff08;Details&#xff09;6…

Redis【实战篇】---- 秒杀优化

Redis【实战篇】---- 秒杀优化 1. 秒杀优化-异步秒杀思路2. 秒杀优化-Redis完成秒杀资格判断3. 秒杀优化-基于阻塞队列完成秒杀优化 1. 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c…

HNU-小学期工训-STC-B焊接质量分析报告

质量分析报告 焊接情况简单概述 同学们都按时按质量地完成了焊接工作&#xff0c;在测试过程中无短路问题 学习班焊接质量、报修等情况统计 焊接质量较好&#xff0c;焊锡基本圆润光滑&#xff0c;经测试无短路现象 报修情况统计&#xff1a; 测试情况统计 部分同学存在故…

Sqlite创建表、查看表

前面已经学习了Sqlite&#xff1b; 图解SQLite教程_bcbobo21cn的博客-CSDN博客 下面复习一下&#xff1b; 启动和创建数据库&#xff1b;.tables查看表&#xff0c;此时没有&#xff1b; 创建一个表并插入数据&#xff1b; 再创建一个表并插入数据&#xff1b;带小数点的数据…

如何防止数据泄露,保护企业内部文件的安全

现在全球数据泄露事件频发&#xff0c;而且很大一部分都是由于内部员工造成的数据外泄&#xff0c;对企业造成的损失和打击很大&#xff0c;企业一旦出现数据泄露问题&#xff0c;所遭受的不仅仅是经济损失&#xff0c;可能还会对企业的声誉造成负面影响&#xff0c;企业内部的…