【Vue】使用html、css实现鱼骨组件

news2025/1/17 16:04:26

文章目录

  • 组件
  • 测试案例
  • 预览图

组件

<template>
  <div class="context">
    <div class="top">
      <div class="label-context">
        <div class="label" v-for="(item, index) in value" :key="index">
          <div class="label-text" v-if="index % 2 === 0">
            {{ item.label }}
          </div>
          <div class="connect-line-box" v-if="index % 2 === 0">
            <div class="connect-line"><i class="center-line-icon"></i></div>
          </div>
        </div>
      </div>
    </div>
    <div class="center-line">

      <div class="icon-box" v-for="(item, index) in value" :key="index">
        <i class="center-line-icon"></i>
      </div>

    </div>
    <div class="bottom">
      <div class="label-context">
        <div class="label" v-for="(item, index) in value" :key="index">
          <div class="connect-line-box" v-if="index % 2 === 1">
            <div class="connect-line"></div>
          </div>
          <div class="label-text" v-if="index % 2 === 1">
            {{ item.label }}
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name: 'FishBoneComponent',
  props: {
    value: {
      type: Array,
      default: () => [
        {
          time: '2024-06-13 15:27:30',
          label: ''
        },
        {
          time: '2024-06-12 15:27:30',
          label: ''
        },
        {
          time: '2024-06-12 15:27:30',
          label: ''
        },
        {
          time: '2024-06-12 15:27:30',
          label: ''
        },
        {
          time: '2024-06-12 15:27:30',
          label: ''
        },
        {
          time: '2024-06-12 15:27:30',
          label: ''
        },
        {
          time: '2024-06-12 15:27:30',
          label: ''
        },
        {
          time: '2024-06-12 15:27:30',
          label: ''
        },
        {
          time: '2024-06-12 15:27:30',
          label: ''
        },
        {
          time: '2024-06-12 15:27:30',
          label: ''
        },
      ]
    }
  },
  mounted() {
    this.value = this.value.sort((a, b) => {
      return new Date(a.time) - new Date(b.time);
    });
    console.log(this.value)
  }
}
</script>
<style lang="scss" scoped>
$center-color: #1890ff;
$text-box-width: 200px;
$text-margin-left: 10px;
$line-height: 40px;
$add-width: 0px;
$line-icon-size: 13px;

.context {
  width: 100%;
  padding: 0.5%;
  height: 100%;
}

.center-line {
  position: absolute;
  height: 2px;
  background-color: $center-color;
  width: 98%;
  display: flex;
  align-items: center;
  justify-content: left;
}

.center-line::after {
  content: '';
  position: absolute;
  top: 50%;
  right: -10px;
  width: 0;
  height: 0;
  border-top: 5px solid transparent;
  border-bottom: 5px solid transparent;
  border-left: 10px solid $center-color;
  transform: translateY(-50%);
}

.center-line .icon-box:first-child {
  margin-left: $text-margin-left;
  width: $text-box-width/2 + $line-icon-size/2;
  flex-shrink: 0;

  i {
    float: right;
    width: $line-icon-size;
    height: $line-icon-size;
    flex-shrink: 0;
  }
}

.center-line .icon-box:not(:first-child) {
  margin-left: $text-margin-left - $line-icon-size/2;
  width: $text-box-width/2 + $line-icon-size/2;
  flex-shrink: 0;

  i {
    float: right;
    width: $line-icon-size;
    height: $line-icon-size;
    flex-shrink: 0;
  }
}

.center-line-icon {
  width: $line-icon-size;
  height: $line-icon-size;
  background-color: $center-color;
  border-radius: 50%;
}

.top .label-context {
  display: flex;
  flex-direction: row;
  justify-content: normal;
}

.connect-line-box {
  display: flex;
  flex-direction: row;
  text-align: center;
  justify-content: center;
}

.connect-line {
  width: 2px;
  height: $line-height;
  background-color: #1d71fa;
}

.top .label {
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  margin-left: $text-margin-left;
}

.label > div {
  width: $text-box-width;
  margin-left: $add-width;
  white-space: normal;
}

.bottom .label-context {
  display: flex;
  flex-direction: row;
  justify-content: normal;
  margin-left: $text-box-width/2;
}

.bottom .label {
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  margin-left: $text-margin-left;
}

.label-text {
  padding: 6px;
  background-color: rgb($center-color, 0.08);
  border-radius: 3px;
  color: black;
  font-size: 15px;
}
</style>

测试案例

<template>
  <div class="card">
    <div class="title-box">
      <span class="title">
        大事记
      </span>
      <div style="float: right;">
        <el-button type="primary" icon="el-icon-edit" size="mini">更多</el-button>
      </div>
    </div>
    <FishBoneComponent :value="data"></FishBoneComponent>
  </div>
</template>

<script>
import FishBoneComponent from "@/views/FishBoneComponent";

export default {
  name: "FishBone",
  components: {FishBoneComponent},
  data(){
    return{
      data: [
        {
          time: '2024-06-13 15:27:30',
          label: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试11'
        },
        {
          time: '2024-06-12 15:27:30',
          label: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试22'
        },
        {
          time: '2024-06-12 15:27:30',
          label: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试33'
        },
        {
          time: '2024-06-12 15:27:30',
          label: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试44'
        },
        {
          time: '2024-06-12 15:27:30',
          label: '55'
        },
        {
          time: '2024-06-12 15:27:30',
          label: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试66'
        },
        {
          time: '2024-06-12 15:27:30',
          label: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试77'
        },
        {
          time: '2024-06-12 15:27:30',
          label: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试'
        },
        {
          time: '2024-06-12 15:27:30',
          label: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试'
        },
        {
          time: '2024-06-12 15:27:30',
          label: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试'
        },
      ]
    }
  }
}
</script>

<style scoped>
.card{
  padding: 8px;
}

.title-box{
  margin-bottom: 8px;
}

.title{
  font-size: 18px;
  font-weight: bold;
  color: #1890ff;
}
</style>

预览图

在这里插入图片描述

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

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

相关文章

启动Nuxt-hub-starter: Failed to initialize wrangler bindings proxy write EOF

重新安装 node.js 这样做可以确保下载到了适合的 Windows 框架、Chocolatey&#xff08;一款Windows包管理工具&#xff09;、Python 等资源。 这个错误与Node版本、pnpm/yarn 的版本无关&#xff01; Node.js — Download Node.js (nodejs.org)

实证分析影响关系研究40+回归模型汇总整理

研究自变量X与因变量Y的影响关系时&#xff0c;回归模型是常用的方法。但是不同的回归模型其适用条件不同、种类繁多。SPSSAU目前提供了40多种不同的回归模型&#xff0c;如何选择适合的模型成为关键问题&#xff1b;此外&#xff0c;如何有效分析回归模型的结果也是研究中的重…

智能座舱相关问答

一、基本概念与理解 智能座舱的定义 回答&#xff1a;智能座舱是指在现代交通工具中&#xff0c;通过应用智能技术&#xff0c;实现对乘客座舱环境和服务进行智能化管理和优化的系统。它不仅提供更加舒适的乘坐体验&#xff0c;还能通过精确的数据分析和实时监控&#xff0c;提…

在Stimulsoft 报告中连接来自 MySQL 的数据

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…

软件测试最全面试题及答案整理(2024最新版)

1、你的测试职业发展是什么? 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&#xff0c;不断…

【Python机器学习】算法链与管道——通用的管道接口

Pipeline类补单可以用于预处理和分类&#xff0c;实际上还可以将任意数量的估计器连接在一起。例如&#xff0c;我们可以构建一个包含特征提取、特征选择、缩放和分类的管道&#xff0c;总共有4个步骤。同样的&#xff0c;最后一步可以用聚类或回归代替。 对于管道中估计器的唯…

Python学习笔记28:进阶篇(十七)常见标准库使用之质量控制中的代码质量与风格第二部分

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 教程链接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 质量控制…

旅游系统(附管理端+前台)PHP源码

一. 前言 今天小编给大家带来了一款可学习&#xff0c;可商用的&#xff0c;旅游系统 源码&#xff0c;支持二开&#xff0c;无加密。支持景点管理&#xff0c;登录&#xff0c;景点预定&#xff0c;意见反馈&#xff0c;统计等功能。详细界面和功能见下面视频演示。 二. 视频…

spdlog一个非常好用的C++日志库(四): 源码分析之logger类

目录 1.简介 2.类图关系 3.logger数据成员 4.logger函数成员 4.1.构造与析构 4.1.1.构造函数 4.1.2.拷贝构造、移动构造 4.2.交换操作 4.3.log()记录日志消息 4.3.1.格式串 4.3.2.普通字符串 4.3.3.日志级别 4.3.4.宽字符支持 4.4.sink_it_&#xff1a;将log消息…

android应用的持续构建CI(二)-- jenkins集成

一、背景 接着上一篇文章&#xff0c;本文我们将使用jenkins把所有的流程串起来。 略去了对android应用的加固流程&#xff0c;重点是jenkins的job该如何配置。 二、配置jenkins job 0、新建job 选择一个自由风格的软件项目 1、参数赋值 你可以增加许多参数&#xff0c;这…

免费的鼠标连点器哪个好用?5款2024年最新鼠标连点器分享

鼠标连点器是电脑网络游戏爱好者并不陌生的游戏辅助工具&#xff0c;他在FPS、RTS、moba等游戏种类中发挥着重要作用。可以帮助玩家的鼠标完成各种简单点击动作。轻松实现游戏刷机升级。让你游戏升级不再“肝”&#xff0c;轻松刷图升级&#xff0c;秒表大佬不是梦&#xff01;…

中国东方资产管理25届秋招北森测评笔试如何高分通过?真题考点分析看完这篇就够了

一、东方资管校招测评题型分析 中国东方资产管理股份有限公司&#xff08;中国东方资管&#xff09;的校园招聘测评题型主要包括以下几个部分&#xff1a; 1. **计分题&#xff0c;行测知识**&#xff1a;这部分题量大约在56-57题左右&#xff0c;分为不同的模块进行计时测试。…

探索设计的未来:了解设计师对生成式人工智能(AIGC)工具的采用

在数字化浪潮的推动下&#xff0c;设计行业正经历着一场革命性的变革。随着生成式人工智能&#xff08;AIGC&#xff09;技术的发展&#xff0c;设计师们迎来了前所未有的机遇与挑战。这些工具不仅重塑了传统的设计流程&#xff0c;还为设计师们提供了更广阔的创意空间和更高效…

航模插头篇

一、常见的电池插头&#xff08;电调端 是公头 电池端 是母头&#xff09; 电池总是被插的 1.XT60头 过流大 安全系数高 难插拔 2.T插 插拔轻松 过流比较小 容易发烫 电调端 是公头 电池端 是母头 3.香蕉头插孔 过流够 插拔轻松 但 容易插反 爆炸 4.TX90(和XT60差…

如何快速选择短剧系统源码:高效构建您的在线短剧平台

在数字化时代&#xff0c;短剧作为一种新兴的娱乐形式&#xff0c;受到了广泛的欢迎。随着市场需求的增长&#xff0c;构建一个在线短剧平台成为了很多创业者和开发者的目标。而选择正确的短剧系统源码则是实现这一目标的关键步骤。本文将为您提供一些实用的指导&#xff0c;帮…

C++ 文达校内党员管理系统-计算机毕业设计源码20855

目 录 摘要 1 绪论 1.1研究背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 文达校内党员管理系统系统分析 2.1 可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 系统流程分析 2.4.1 数据流程 2.5.2 业务流程 2.…

智能井盖采集装置 开启井下安全新篇章

在现代城市的脉络之下&#xff0c;错综复杂的管网系统如同城市的血管&#xff0c;默默支撑着日常生活的有序进行。而管网的监测设备大多都安装在井下&#xff0c;如何给设备供电一直是一个难题&#xff0c;选用市电供电需经过多方审批&#xff0c;选用电池供电需要更换电池包&a…

【深入理解Java虚拟机】判断垃圾-引用计数法及其缺陷

什么是引用计数法 引用计数法用来判断对象是否存活 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器的值加一&#xff1b;当引用失效时&#xff0c;计数器的值就减一&#xff0c;任何时刻计数器为0的对象是不可能在被使用的。&#xff08;存…

项目进度管理(信息系统项目管理师)

定义活动的输出&#xff1a;活动清单、活动属性、里程碑清单定义活动的输入包括进度管理计划、范围基准、事业环境因素、组织过程资产定义活动的工具与技术包括专家判断、分解、滚动式规划、会议分解是一种把项目范围和项目可交付成果逐步划分为更小、更便于管理的组成部分的技…