折线图实现柱状阴影背景的demo

news2024/12/26 23:07:19

这个是一个由官网的基础折线图实现的流程,将涉及到的知识点附上个人浅薄的见解,源码在最后,需要的可自取。

折线图

  • 成果展示
  • 代码注解
    • 参数
    • backgroundColor
    • dataZoom
    • legend
    • title
    • xAxis
    • yAxis
    • grid
    • series
  • 源码

成果展示

官网的基础折线图:
在这里插入图片描述
最终效果图:
在这里插入图片描述

代码注解

参数

xdata :x轴数据
ydata1 :第一条折线line1数据
ydata2 :第二条折线line2数据
bgdata :柱状阴影条的数据,这里统一设置为40,是因为ydata1和 ydata2的最大值都在40范围内,以达到阴影撑满图标高度的效果,同时,也可设置yAxis的max值与bgdata 里的值一致
threshold :用于存放每个x轴数据对应的line1和line2相差的最大值
average :总平均时长
historyAveraged :步骤平均耗时
averageCount :步骤总数

这里的值均为固定值,后期可根据自身需求添加数据逻辑

var xdata = ["第1步 步骤名称","第2步 步骤名称","第3步 步骤名称","第4步 步骤名称","第5步 步骤名称",
        "第6步 步骤名称","第7步 步骤名称","第8步 步骤名称","第9步 步骤名称","第10步 步骤名称","第11步 步骤名称",
        "第12步 步骤名称","第13步 步骤名称","第14步 步骤名称","第15步 步骤名称","第16步 步骤名称","第17步 步骤名称",
        "第18步 步骤名称", "第19步 步骤名称","第20步 步骤名称","第21步 步骤名称","第22步 步骤名称","第23步 步骤名称","第24步 步骤名称",
      ];
      var ydata1 = [21,20,34,31,22,18,18,18,18,18,18,21,15,34,31,
        22,18,18,18,18,18,18,18,18,
      ];
      var ydata2 = [18,16,25,30,15, 18,18,18,18,18,18,18,
        16,25,30,15,18,18,18,18,18, 18,18,18,
      ];
      var bgdata = [40,40,40,40,40,40,40,40,40,40,40,
        40,40,40,40,40,40,40,40,40,40,40, 40,40,
      ];
      var threshold = 7;
      var average = 140,
        historyAveraged = 5.6,
        averageCount = 2.5;

backgroundColor

官网api可查看具体参数:点击跳转至官网查看backgroundColor
这里直接配置颜色参数。

backgroundColor: "transparent",//透明背景色,跟随父盒子颜色,看板中比较常用
backgroundColor: "#375a84",//成果主图的背景颜色

dataZoom

官网api可查看具体参数:点击跳转至官网查看dataZoom
dataZoom 就是可用于缩放和平移数据的组件,可以用于对大量数据进行局部放大或整体滚动查看。dataZoom 可以水平或垂直放置在图表的底部或侧边,并支持拖拽、滚动、点击等交互操作。

dataZoom: [
          {
            type: "slider", // 设置为滑动条
            show: true, // 显示滑动条
            start: 0, // 滑动条起始位置
            end: 100 / (12 - 10) - 1, // 滑动条结束位置
            bottom: 10, // 滑动条距离底部的距离
            textStyle: {
              color: "#fff",
            },
            backgroundColor: "#acb7c3", // 设置背景颜色
            handleStyle: {
              color: "#2a82e4", // 设置左右两边的可滑动收缩竖线颜色
            },
          },
        ],

legend

官网api可查看具体参数:点击跳转至官网查看legend
legend 用于展示图表中不同系列的标识和名称的组件,通过legend,用户可以快速了解每个系列所代表的含义,并可以通过点击图例项来切换显示或隐藏对应的数据系列。

legend: {
          data: ["步骤平均时长", "步骤历史平均时长"],
          orient: "vertical", // 设置图例垂直排列
          right: 10, // 调整图例距离右侧的距离
          top: "top", // 设置图例位于上方
          itemWidth: 10, // 设置宽度
          itemHeight: 10, // 设置高度
          textStyle: {//设置字体样式
            color: "#fff",//字体颜色
          },
        },

title

官网api可查看具体参数:点击跳转至官网查看title
title 是用于设置图表标题的组件,可以用来展示整个图表的主题或概要信息。通过 title 组件,用户可以自定义图表的标题文字、样式、位置等属性。
可以通过设置 left、top、right、bottom 等属性,可以调整标题的位置。并且Echarts 中的 title 组件是能单独存在的,也能放在整个 option 配置对象中的任何位置。
可根据自己需求调整title的位置。

title: {
          // 添加title属性
          text:
            "总平均时长" +
            average +
            "s\n\n步骤总数" +
            averageCount +
            "\n\n步骤平均耗时" +
            historyAveraged +
            "s", // 自定义的文字内容
          //subtext: '副标题', // 设置副标题文字
          //left: 'center' // 设置标题水平居中
          orient: "vertical", // 设置图例垂直排列
          right: 10, // 调整图例距离右侧的距离
          top: 80, // 设置图例位于上方
          itemWidth: 10, // 设置宽度
          itemHeight: 10, // 设置高度
          textStyle: {
            color: "#fff",
            fontSize: 12,//设置字体大小
          },
        },

xAxis

官网api可查看具体参数:点击跳转至官网查看xaxis
xAxis(x 轴)用于显示水平方向的坐标轴,通常用于表示类目数据或数值数据。在 ECharts 中,可以通过配置 xAxis 属性来对 x 轴进行设置。
以下是一些常见的 xAxis 配置选项:

type: x 轴类型,可以是 ‘value’(数值轴)、‘category’(类目轴)、‘time’(时间轴)等。
data: 类目轴的数据,在 type 为 ‘category’ 时使用。
axisLabel: x 轴刻度标签的设置,可以设置字体颜色、字体大小等样式。
axisLine: x 轴线的样式设置,可以设置线条颜色、粗细等。
name: x 轴名称。
nameTextStyle: x 轴名称的样式设置,可以设置颜色、字体大小等。
splitLine: 分隔线的设置,可以显示或隐藏 x 轴的分隔线。

xAxis: {
          type: "category",// 横轴类型为类目轴,适用于离散的类目数据
          data: xdata,// 设置 x 轴的数据,即类目轴的数据源
          axisLabel: {// 设置 x 轴标签的样式
            formatter: function (value) {
              return value.split(" ").join("\n"); // 自定义轴标签格式化函数,使用换行符拆分字符串并重新连接
            },
            textStyle: {// 设置轴标签文字的样式
              fontSize: 12, // 设置 x 轴字体大小为 12px
              color: function (params) {// 根据条件动态设置文字颜色
                if (params == "第3步 步骤类型") {
                  return "rgba(190, 53, 59, 1)";// 如果标签为"第3步 位置管控",设置颜色为红色
                } else {
                  return "rgba(255, 255, 255, 0.16)";// 其他标签设置为灰色
                }
              },
            },
          },
          axisLine: {// 设置轴线的样式
            lineStyle: {
              color: "#fff", // 设置轴线颜色为白色
            },
          },
        },

yAxis

官网api可查看具体参数:点击跳转至官网查看yAxis
yAxis(纵轴)用于配置直角坐标系中的纵轴属性,包括坐标轴类型、刻度分隔、标签样式等。

type: 指定了纵轴的类型,例如’value’表示数值轴。
name: 设置纵轴的名称,用于描述纵轴所代表的数据意义。
axisLabel: 定义了纵轴标签的样式,包括文字颜色和大小等。
splitLine: 控制分隔线的显示与样式,可以设置是否显示分隔线以及分隔线的样式。

通过配置 yAxis,可以灵活地控制纵轴的显示方式、标签样式以及分隔线的展示,从而使得图表能够清晰地呈现数据,并满足不同的可视化需求。

yAxis: {
          type: "value",// 纵轴类型为数值轴,适用于连续的数值数据
          name: "second",// 设置 y 轴的名称为"second"
          splitLine: {
            show: false,// 是否显示 y 轴的分隔线,这里设为隐藏
          },
          axisLabel: { // 设置 y 轴标签的样式
            textStyle: {
              color: "#ffffff", // 设置 y 轴字体颜色为 #fff
              fontSize: 12, // 设置 y 轴字体大小为 14px
            },
          },
          axisLine: {// 设置 y 轴线条的样式
            lineStyle: {
              color: "#ffffff", // 设置 y 轴线条颜色为 #fff
            },
          },
          nameTextStyle: {// 设置 y 轴名称的样式
            color: "#ffffff", // 设置 y 轴名称颜色为 #fff
          },
        },

grid

官网api可查看具体参数:点击跳转至官网查看grid
grid(网格)组件用于控制直角坐标系的布局,可以通过 grid 来调整坐标系的位置、大小以及间距等。

left / right / top / bottom: 分别设置 grid 组件距离容器的左、右、上、下边距的距离,可以是像素值或百分比。
containLabel: 控制 grid 区域是否包含坐标轴的刻度标签,默认为 false。
backgroundColor: 设置 grid 区域的背景颜色,可以是颜色值或者渐变色。
borderWidth: 设置 grid 区域的边框线宽。
borderColor: 设置 grid 区域的边框颜色。

通过配置 grid,可以灵活地调整图表的布局,使得图表在页面中的位置和大小符合需求,并且能够美观地展示数据。

grid: {
          left: "3%",
          right: "10%",
          bottom: "10%",
        },

series

官网api可查看具体api:点击跳转至官网查看series
折线图后面的柱状阴影重点在与series数组的第三个对象,这里设置了一个单独柱状图(type为bar)的类型,并设置其颜色效果,以达到阴影效果。

series: [
          {
            name: "步骤平均时长",
            data: ydata1,
            type: "line",
            symbol: "rect", // 将折线图的拐点符号设置为方形
            symbolSize: 10, // 设置方形的大小为8
            lineStyle: {
              color: "#ffffff", // 设置第一条线的颜色为 #00baad
            },
            itemStyle: {
              color: "#ffffff", // 设置第一条线的方形颜色为 #ffffff
            },
            label: {
              // 添加对应值显示
              show: true,
              position: "top", // 显示在拐点上方
            },
            z: 2,
          },
          {
            name: "步骤历史平均时长",
            data: ydata2,
            type: "line",
            symbol: "rect", // 将折线图的拐点符号设置为方形
            symbolSize: 10, // 设置方形的大小为8
            lineStyle: {
              color: "#00baad", // 设置第一条线的颜色为 #00baad
            },
            itemStyle: {
              color: "#00baad", // 设置第一条线的方形颜色为 #ffffff
            },
            label: {
              // 添加对应值显示
              show: true,
              position: "bottom",
              color: "#00baad",
            },
            z: 2,
          },
          {//这里是柱状阴影的关键部分
            data: bgdata,
            type: "bar",// 柱状图类型
            barWidth: 68,// 柱宽度
            // itemStyle: {
            //   color: "rgba(0,0,0,0.16)",
            // },
            itemStyle: {
              normal: {
                color: function (params) {
                  var aValue = ydata1[params.dataIndex];
                  var bValue = ydata2[params.dataIndex];
                  if (Math.abs(aValue - bValue) > threshold) {//若差值大于最大差值,则设置其字体颜色为红色
                    return "rgba(102, 77, 107,0.6)";
                  } else {
                    return "rgba(0,0,0,0.16)";
                  }
                },
              },
            },
          },
        ],

源码

      var xdata = [
        "第1步 步骤名称",
        "第2步 步骤名称",
        "第3步 步骤名称",
        "第4步 步骤名称",
        "第5步 步骤名称",
        "第6步 步骤名称",
        "第7步 步骤名称",
        "第8步 步骤名称",
        "第9步 步骤名称",
        "第10步 步骤名称",
        "第11步 步骤名称",
        "第12步 步骤名称",
        "第13步 步骤名称",
        "第14步 步骤名称",
        "第15步 步骤名称",
        "第16步 步骤名称",
        "第17步 步骤名称",
        "第18步 步骤名称",
        "第19步 步骤名称",
        "第20步 步骤名称",
        "第21步 步骤名称",
        "第22步 步骤名称",
        "第23步 步骤名称",
        "第24步 步骤名称",
      ];
      var ydata1 = [
        21,
        20,
        34,
        31,
        22,
        18,
        18,
        18,
        18,
        18,
        18,
        21,
        15,
        34,
        31,
        22,
        18,
        18,
        18,
        18,
        18,
        18,
        18,
        18,
      ];
      var ydata2 = [
        18,
        16,
        25,
        30,
        15,
        18,
        18,
        18,
        18,
        18,
        18,
        18,
        16,
        25,
        30,
        15,
        18,
        18,
        18,
        18,
        18,
        18,
        18,
        18,
      ];
      var bgdata = [
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
        40,
      ];
      var threshold = 7;
      var average = 140,
        historyAveraged = 5.6,
        averageCount = 2.5;
      option = {
        backgroundColor: "#375a84",
        dataZoom: [
          {
            type: "slider", // 设置为滑动条
            show: true, // 显示滑动条
            start: 0, // 滑动条起始位置
            end: 100 / (12 - 10) - 1, // 滑动条结束位置
            bottom: 10, // 滑动条距离底部的距离
            textStyle: {
              color: "#fff",
            },
            backgroundColor: "#acb7c3", // 设置背景颜色
            handleStyle: {
              color: "#2a82e4", // 设置左右两边的可滑动收缩竖线颜色
            },
          },
        ],
        legend: {
          legend: {
            data: ["步骤平均时长", "步骤历史平均时长"],
          },
          orient: "vertical", // 设置图例垂直排列
          right: 10, // 调整图例距离右侧的距离
          top: "top", // 设置图例位于上方
          itemWidth: 10, // 设置宽度
          itemHeight: 10, // 设置高度
          textStyle: {
            color: "#fff",
          },
        },
        title: {
          // 添加title属性
          text:
            "总平均时长" +
            average +
            "s\n\n步骤总数" +
            averageCount +
            "\n\n步骤平均耗时" +
            historyAveraged +
            "s", // 自定义的文字内容
          orient: "vertical", // 设置图例垂直排列
          right: 10, // 调整图例距离右侧的距离
          top: 80, // 设置图例位于上方
          itemWidth: 10, // 设置宽度
          itemHeight: 10, // 设置高度
          textStyle: {
            color: "#fff",
            fontSize: 12,
          },
        },
        xAxis: {
          type: "category",
          data: xdata,
          axisLabel: {
            formatter: function (value) {
              return value.split(" ").join("\n"); // 使用换行符拆分字符串并重新连接
            },
            textStyle: {
              fontSize: 12, // 设置 x 轴字体大小为 12px
              color: function (params) {
                if (params == "第3步 位置管控") {
                  return "rgba(190, 53, 59, 1)";
                } else {
                  return "rgba(255, 255, 255, 0.16)";
                }
              },
            },
          },
          axisLine: {
            lineStyle: {
              color: "#fff", // 设置 x 轴线条颜色为 #fff
            },
          },
        },
        yAxis: {
          type: "value",
          name: "second",
          splitLine: {
            show: false, // 隐藏y轴的横向线条
          },
          axisLabel: {
            textStyle: {
              color: "#ffffff", // 设置 y 轴字体颜色为 #fff
              fontSize: 12, // 设置 y 轴字体大小为 14px
            },
          },
          axisLine: {
            lineStyle: {
              color: "#ffffff", // 设置 y 轴线条颜色为 #fff
            },
          },
          nameTextStyle: {
            color: "#ffffff", // 设置 y 轴名称颜色为 #fff
          },
        },
        grid: {
          left: "3%",
          right: "10%",
          bottom: "10%",
        },
        series: [
          {
            name: "步骤平均时长",
            data: ydata1,
            type: "line",
            symbol: "rect", // 将折线图的拐点符号设置为方形
            symbolSize: 10, // 设置方形的大小为8
            lineStyle: {
              color: "#ffffff", // 设置第一条线的颜色为 #00baad
            },
            itemStyle: {
              color: "#ffffff", // 设置第一条线的方形颜色为 #ffffff
            },
            label: {
              // 添加对应值显示
              show: true,
              position: "top", // 显示在拐点上方
            },
            z: 2,
          },
          {
            name: "步骤历史平均时长",
            data: ydata2,
            type: "line",
            symbol: "rect", // 将折线图的拐点符号设置为方形
            symbolSize: 10, // 设置方形的大小为8
            lineStyle: {
              color: "#00baad", // 设置第一条线的颜色为 #00baad
            },
            itemStyle: {
              color: "#00baad", // 设置第一条线的方形颜色为 #ffffff
            },
            label: {
              // 添加对应值显示
              show: true,
              position: "bottom",
              color: "#00baad",
            },
            z: 2,
          },
          {
            data: bgdata,
            type: "bar",
            barWidth: 68,
            // itemStyle: {
            //   color: "rgba(0,0,0,0.16)",
            // },
            itemStyle: {
              normal: {
                color: function (params) {
                  var aValue = ydata1[params.dataIndex];
                  var bValue = ydata2[params.dataIndex];
                  if (Math.abs(aValue - bValue) > threshold) {
                    return "rgba(102, 77, 107,0.6)";
                  } else {
                    return "rgba(0,0,0,0.16)";
                  }
                },
              },
            },
          },
        ],
      };

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

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

相关文章

Android之Handler原理解析与问题分享

一、Handler运行原理剖析 1.关系剖析图 如果把整个Handler交互看做一个工厂,Thread就是动力MessageQueue是履带Looper是转轴Loooper的loop方法就是开关,当调用loop方法时整个工厂开始循环工作,处理来自send和post提交到MessageQueue的消息&a…

Nodejs 第四十五章(redis发布订阅+事务)

发布订阅 发布-订阅是一种消息传递模式,其中消息发布者(发布者)将消息发送到频道(channel),而订阅者(订阅者)可以订阅一个或多个频道以接收消息。这种模式允许消息的解耦&#xff0…

006-CSS-常见问题汇总

常见问题汇总 1、伪元素与伪类2、偏门但好用的样式3、文字溢出三个点展示4、空白折叠问题5、文字的垂直居中6、 Vue项目中 在父组件中修改子组件样式7、BFC 概念7.1、兄弟元素外边距合并7.2、父子元素外边距塌陷 8、box-sizing8.1、box-sizing: border-box8.2、box-sizing: con…

11. Nginx进阶-HTTPS

简介 基本概述 SSL SSL是安全套接层。 主要用于认证用户和服务器,确保数据发送到正确的客户机和服务器上。 SSL可以加密数据,防止数据中途被窃取。 SSL也可以维护数据的完整性,确保数据在传输过程中不被改变。 HTTPS HTTPS就是基于SSL来…

1.1_2 性能指标——速率、带宽、吞吐量

文章目录 1.1_2 性能指标——速率、带宽、吞吐量(一)速率(二)带宽(三)吞吐量 1.1_2 性能指标——速率、带宽、吞吐量 (一)速率 速率即数据率或称数据传输率或比特率。 速率就是“快…

【代码】Python3|无GUI环境中使用Seaborn作图的学习路线及代码(阴影折线图)

我有个需求是需要画图,让GPT帮我生成了一下学习计划。 学习路线依照GPT的来的,使用的Prompt工具是https://github.com/JushBJJ/Mr.-Ranedeer-AI-Tutor。 文章目录 PrerequisiteMain Curriculum1.1 Seaborn介绍Seaborn基础保存图形为文件练习 1.2 单变量数…

瑞芯微RK3588 C++部署Yolov8检测和分割模型

最近这一个月在研究国产瑞芯微板子上部署yolov8的检测和分割模型,踩了很多坑,记录一下部署的过程和遇到的一些问题: 1 环境搭建 需要的环境和代码主要包括: (1)rknn-toolkit2-1.5.2:工具链&am…

uniapp开发android原生插件

一、下载原生开发SDK Android 离线SDK - 正式版 | uni小程序SDK (dcloud.net.cn)、 https://nativesupport.dcloud.net.cn/AppDocs/download/android.html 将开发uniappa原生android的插件解压到ben本地目录,目录结构如下: 接下就可以使用 UniPlugin-Hel…

12 状态优先级

概念 cpu需要执行很多进程,有很多进程排在队列中,每个进程加载后运行一定的时间段,然后切换下一个进程。cpu如何判断进程需不需要加载,什么时候加载,依靠进程的状态和优先级属性来判断,进程调度&#xff0…

Node.js与Webpack笔记(一)

这里使用的16.19.0版本,官网和github没找到,去黑马2023年课程里找 篇幅较大会卡,此篇幅不写Webpack部分,留着下一篇 初识 1.什么是Node.js? Node.js 是一个独立的 JavaScript 运行环境,能独立执行 JS 代码&#xff…

A/D转换

硬件电路模型 模数转换代码 main.c #include <REGX52.H> #include "LCD1602.h" #include "Delay.h" #include "XPT2046.h"unsigned int ADValue; int main(){LCD_Init();LCD_ShowString(1,1,"ADJ NTC RG");while(1){ADValue …

iOS 17.0 UIGraphicsBeginImageContextWithOptions 崩溃处理

在升级到iOS17后你会发现&#xff0c;之前版本运行的很好&#xff0c;这个版本突然会出现一个运行闪退。报错日志为*** Assertion failure in void _UIGraphicsBeginImageContextWithOptions(CGSize, BOOL, CGFloat, BOOL)(), UIGraphics.m:410 跟踪到具体的报错位置如下所示&a…

redis09 集群(cluster)

思维草图 为什么要使用集群 单台redis内存容量的限制单台redis并发写量太大有性能瓶颈 redis集群认识 redis集群是对redis的水平扩容&#xff0c;即启动N个redis节点&#xff0c;将整个数据分布存储在这个N个节点中&#xff0c;每个节点存储总数据的1/N。 如下图&#xff1…

win11部署自己的privateGpt(2024-0304)

什么是privateGpt? privategpt开源项目地址 https://github.com/imartinez/privateGPT/tree/main 官方文档 https://docs.privategpt.dev/overview/welcome/welcome PrivateGPT是一个可投入生产的人工智能项目&#xff0c;利用大型语言模型&#xff08;LLMs&#xff09;的…

Windows安装SSH教程

Windows安装SSH教程 一、SSH1.SSH简介2.SSH功能3.SSH验证3.1 第一种级别&#xff08;基于口令的安全验证&#xff09;3.2 第二种级别&#xff08;基于密匙的安全验证&#xff09; 4.SSH层次4.1 传输层协议 [SSH-TRANS]4.2 用户认证协议 [SSH-USERAUTH]4.3 连接协议 [SSH-CONNEC…

场景问题: VisualVM工具Profiler JDBC不是真实执行的SQL

1. 问题 诡异的问题表象&#xff1a; 前端反馈分页接口的Total字段一直为0 使用Visualvm中的 Profiler 注入到应用后&#xff0c;查看JDBC监控得到了分页接口执行的SQL&#xff0c;复制出来执行是55. 此时还没有注意到 IN 的范围中有一个特别的值 NULL &#x1f928; 2. 排查…

【运维必学】2.零基础搞IT运维之服务器操作系统基础知识储备

微信改版了&#xff0c;现在看到我们全凭缘分&#xff0c;为了不错过【全栈工程师修炼指南】重要内容及福利&#xff0c;大家记得按照上方步骤设置「接收文章推送」哦~ 文章目录&#xff1a; 温馨提示&#xff1a;作者最近开通的知识星球&#xff0c;全栈系列从门到实践教程将会…

QT----写完的程序打包为APK在自己的手机上运行

目录 1、qt安装android组件2、打开qt配置Android 环境3、手机打开开发者模式&#xff0c;打开usb调试&#xff0c;连接电脑4、运行代码 1、qt安装android组件 qtcreater–工具-QTMaintenaceTool-startMaintenaceTool—登陆—添加或修改组件—找到android&#xff0c;安装 若是…

Windows环境MySQL全量备份+增量备份

目录 一、环境准备 1.1.安装MySQL 1.2.添加log-bin日志配置 二、创建测试数据库和表 2.1.创建测试数据库 2.2.创建测试数据表 三、全量备份恢复数据库 3.1.全量备份数据库 3.2全量恢复数据库 四、增量备份恢复数据库 4.1.增量备份数据库 4.2.增量恢复数据库 五、…

抽象步骤条(2.0版本)

vue3 router ele-plus 猜猜看为什么使用组件库&#xff01; 他呀的&#xff01;查看密码要自己写&#xff0c;验证信息也要自己写&#xff0c;所以说会用组件库会轻松一点&#xff0c;&#xff0c;&#xff0c; 代码如下 <template><div class"main"&g…