一键换肤(Echarts 自定义主题)

news2024/9/21 11:06:23

一键换肤(Echarts 自定义主题)

一、使用官方主题配置工具

官方主题配置工具:https://echarts.apache.org/zh/theme-builder.html
在这里插入图片描述
如果以上主题不满足使用,可以自己自定义主题
在这里插入图片描述
例如:修改背景、标题等,可按照设计师需求来更改
在这里插入图片描述
配置好之后,下载主题
在这里插入图片描述
在这里插入图片描述
有两种方式可选:JS 版本、JSON 版本,以 JSON 版本为例:
复制到项目中( theme.json ),
theme.json 文件示例:

{
    "categoryAxis": {
        "axisLine": {
            "show": true,
            "lineStyle": {
                "color": "green"
            }
        },
        "axisTick": {
            "show": true,
            "lineStyle": {
                "color": "green"
            }
        },
        "axisLabel": {
            "show": true,
            "color": "green"
        } 
    },
    "valueAxis": {
        "axisLine": {
            "show": false,
            "lineStyle": {
                "color": "green"
            }
        },
        "axisLabel": {
            "show": true,
            "color": "green"
        }
    },
    "legend": {
        "textStyle": {
            "color": "green"
        }
    }
}

注册主题:

// 引入主题
import theme from './theme.json'

// 使用echarts
import echarts from 'echarts'
echarts.registerTheme('customTheme', theme)

使用:

//使用echarts
<div id="test">
	...
</div>
<script>
	let myChart = echarts.init(document.getElementById("test"),"customTheme");
	let option = {...}
	myChart.setOption(option);
</script>

完整代码:

<template>
  <div id="main" style="width: 600px; height: 400px"></div>
</template>

<script>
import theme from "./theme.json";
import * as echarts from "echarts";

export default {
  mounted() {
    //注册主题
    echarts.registerTheme("customTheme", theme);
    //初始化使用主题
    var myChart = echarts.init(document.getElementById("main"), "customTheme"); // 使用dark 、light或无第二参数

    myChart.setOption({
      xAxis: {
        type: "category",
        data: ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
      },
      yAxis: {
        type: "value",
      },
      series: [
        {
          data: [150, 230, 224, 218, 135, 147, 260],
          type: "line",
        },
      ],
    });
  },
};
</script>


如果是多主题切换,则可以将各个主题的颜色整合在一个文件,分别注册

{
    "lightTheme": {
        "categoryAxis": {
            "axisLine": {
                "show": true,
                "lineStyle": {
                    "color": "#cccccc"
                }
            },
            "axisTick": {
                "show": true,
                "lineStyle": {
                    "color": "#cccccc"
                }
            },
            "axisLabel": {
                "show": true,
                "color": "#cccccc"
            }
        },
        "valueAxis": {
            "axisLine": {
                "show": false,
                "lineStyle": {
                    "color": "#cccccc"
                }
            },
            "axisLabel": {
                "show": true,
                "color": "#cccccc"
            }
        },
        "legend": {
            "textStyle": {
                "color": "#cccccc"
            }
        }
    },
    "darkTheme": {
        "categoryAxis": {
            "axisLine": {
                "show": true,
                "lineStyle": {
                    "color": "#ffffff"
                }
            },
            "axisTick": {
                "show": true,
                "lineStyle": {
                    "color": "#ffffff"
                }
            },
            "axisLabel": {
                "show": true,
                "color": "#ffffff"
            }
        },
        "valueAxis": {
            "axisLine": {
                "show": false,
                "lineStyle": {
                    "color": "#ffffff"
                }
            },
            "axisLabel": {
                "show": true,
                "color": "#ffffff"
            }
        },
        "legend": {
            "textStyle": {
                "color": "#ffffff"
            }
        }
    }
}

这样的话,就可以对应官方示例中的这种(深色/浅色模式)
https://echarts.apache.org/examples/zh/editor.html?c=line-simple
在这里插入图片描述

二、上述不满足使用的情况

在这里插入图片描述
这是因为执行先后顺序
在这里插入图片描述
先使用主题色(初始化),再配置的 option,option 里的颜色覆盖了主题里的颜色。

这种情况下,我这边是用了笨办法,一个个去设置(大家如果有好的办法,可以交流下)

给 x 轴、y轴、图例、标题单独设置了 深色模式下的颜色。

定义 darkTheme.json 文件:

{
    "title": {
        "textStyle": {
            "color": "rgba(255,255,255,0.6)"
        },
        "subtextStyle": {
            "color": "rgba(255,255,255,0.6)"
        }
    },
    "tooltip": {
        "backgroundColor": "rgba(5,22,38,0.9)",
        "borderColor": "rgba(5,22,38,0.9)",
        "textStyle": {
            "color": "rgba(255,255,255,0.6)"
        }
    },
    "categoryAxis": {
        "axisLine": {
            "lineStyle": {
                "color": "#CCCCCC"
            }
        }, 
        "axisTick": {
            "lineStyle": {
                "color": "#CCCCCC"
            }
        },
        "axisLabel": {
            "color": "rgba(255,255,255,0.6)"
        }
    },
    "valueAxis": {
        "axisLine": {
            "lineStyle": {
                "color": "#CCCCCC"
            }
        },
        "axisLabel": {
            "color": "rgba(255,255,255,0.6)"
        },
        "nameTextStyle": {
            "color": "rgba(255,255,255,0.6)"
        },
        "splitLine": {
            "lineStyle": {
                "color": "rgba(5,22,38,0.7)"
            }
        }
    },
    "legend": {
        "textStyle": {
            "color": "rgba(255,255,255,0.8)"
        }
    }
}

使用

<script>
import { cloneDeep } from "lodash-es";
import darkTheme from "./darkTheme.json";

export default {
  props: {
    option: {
      type: Object,
      default: null,
    },
  },
  name: "ChartCustomEcharts",
  data() {
    return {
      baseChart: null,
    };
  },
  methods: {
    setOption(option = this.option) {
      if (option && this.baseChart) {
        const result = this.getThemeColors(option);
        this.baseChart.setOption(result, true);
      }
    },
    initChart() {
      this.baseChart = echarts.init(this.$refs["baseChart"]);
      this.setOption();
    },
    getThemeColors(data) {
      const option = cloneDeep(data)
      const themeType = this.themeType;

      if (themeType === "dark") {
        // 标题
        if (option.title) {
          if (option.title.subtextStyle) {
            option.title.subtextStyle.color = darkTheme.title.subtextStyle.color;
          }
        }
        // 图例
        if (option.legend) {
          if (option.legend.textStyle) {
            option.legend.textStyle.color = darkTheme.legend.textStyle.color;
          } else {
            option.legend.textStyle = darkTheme.legend.textStyle;
          }
        }
        // x轴
        if (option.xAxis) {
          if (Array.isArray(option.xAxis)) {
            option.xAxis.forEach((work) => {
              if (work.axisLabel) {
                work.axisLabel.color = darkTheme.categoryAxis.axisLabel.color;
              }
              if (work.axisLine) {
                if (work.axisLine.lineStyle) {
                  work.axisLine.lineStyle.color = darkTheme.categoryAxis.axisLine.lineStyle.color;
                } else {
                  work.axisLine.lineStyle = darkTheme.categoryAxis.axisLine.lineStyle;
                }
              }
            });
          }
        }
        // Y轴
        if (option.yAxis) {
          if (Array.isArray(option.yAxis)) {
            option.yAxis.forEach((work) => {
              if (work.axisLabel) {
                work.axisLabel.color = darkTheme.valueAxis.axisLabel.color;
              }
              if (work.axisLine) {
                if (work.axisLine.lineStyle) {
                  work.axisLine.lineStyle.color = darkTheme.valueAxis.axisLine.lineStyle.color;
                } else {
                  work.axisLine.lineStyle = darkTheme.valueAxis.axisLine.lineStyle;
                }
              }
              if(work.splitLine){
                if(work.splitLine.lineStyle){
                  work.splitLine.lineStyle.color = darkTheme.valueAxis.splitLine.lineStyle.color;
                }else{
                  work.splitLine.lineStyle = darkTheme.valueAxis.splitLine.lineStyle
                }
              }
              if (work.nameTextStyle) {
                work.nameTextStyle.color = darkTheme.valueAxis.nameTextStyle.color;
              }
            });
          }
        }
        // tooltip
        if (option.tooltip) {
          option.tooltip.backgroundColor = darkTheme.tooltip.backgroundColor;
          option.tooltip.borderColor = darkTheme.tooltip.borderColor;
          if (option.tooltip.textStyle) {
            option.tooltip.textStyle.color = darkTheme.tooltip.textStyle.color;
          } else {
            option.tooltip.textStyle = darkTheme.tooltip.textStyle;
          }
        }
      }
      return option;
    },
  },
};
</script>

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

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

相关文章

字节跳动飞书一面0715

进程间通信方式有哪些 1、管道通信&#xff0c;分为匿名管道和有名管道&#xff0c;匿名管道只能在有亲缘关系如父子进程间使用。有名管道可以允许无亲缘关系进程间的通信。它们都是半双工的通信方式&#xff0c;数据只能单向流动。 2、消息队列&#xff0c;用内核中的链表实现…

深入理解WAF(Web应用防火墙)及其安全防御策略

随着互联网的普及和发展&#xff0c;Web应用也面临着越来越多的安全威胁&#xff0c;如SQL注入、跨站脚本&#xff08;XSS&#xff09;、跨站请求伪造&#xff08;CSRF&#xff09;等。这些威胁不仅可能造成数据泄露&#xff0c;还可能导致业务中断和品牌受损。本文将以快快网络…

JavaEE 第9节 阻塞队列详解

一、概念 阻塞队列是在普通队列&#xff08;先进先出的数据结构&#xff09;的基础上增加了阻塞属性的特殊队列 1&#xff09;当阻塞队列空的时候&#xff0c;如果继续出队元素会进入阻塞状态&#xff0c;直到其他线程入队元素。 2&#xff09;当阻塞队列满的时候&#xff0c;…

瑞萨电子并购Altium 引领行业创新与发展

公开资料显示&#xff0c;2023 年 6 月&#xff0c;瑞萨电子曾宣布在 Altium 的 Altium 365 云平台上实现了所有 PCB 设计的标准化开发。瑞萨电子一直与 Altium 合作&#xff0c;将其所有产品的 ECAD 库发布到 Altium Public Vault。借助 Altium365 上的制造商零件搜索等功能&a…

ROW_NUMBER(), RANK(), DENSE_RANK() SQL排序函数图文详解

ROW_NUMBER(), RANK(), DENSE_RANK() ROW_NUMBER(): 为结果集中的每一行分配唯一的连续编号。即使有重复的值&#xff0c;ROW_NUMBER() 也会为它们分配不同的序号。 SELECT column_name, ROW_NUMBER() OVER (ORDER BY column_name) AS row_num FROM table_name;2. RANK(): 对结…

高可用集群keepalived从部署到实战一篇解决

目录 一.高可用集群 1.1 集群类型 1.2 系统可用性 1.3 系统故障 1.4 实现高可用 1.5.VRRP&#xff1a; 1.5.1 VRRP 相关术语 1.5.2 VRRP 相关技术 二.Keepalived 部署 2.1 keepalived 简介 2.2keepalived架构 2.3 Keepalived 环境准备 2.4 Keepalived 相关文件 2.…

java实现七牛云内容审核功能,文本、图片和视频的内容审核(鉴黄、鉴暴恐、敏感人物)

目录 1、七牛云内容审核介绍 2、查看内容审核官方文档 2.1、文本内容审核 2.1.1、文本内容审核的请求示例 2.1.2、文本内容审核的返回示例 2.2、图片内容审核 2.2.1、请求参数 2.2.2、返回参数 2.3、视频内容审核 3、代码实现 3.1、前期代码准备 3.2、文本内容审核…

基于Spring + Vue的旅游景区项目+源代码+文档说明

文章目录 源代码下载地址项目介绍项目功能界面预览 项目备注源代码下载地址 源代码下载地址 点击这里下载源码 项目介绍 基于Spring Vue的旅游景区项目 项目功能 民宿管理员&#xff1a;订单数量统计&#xff0c;订单交易额统计&#xff0c;客房统计饼图&#xff0c;酒店…

【STM32嵌入式系统设计与开发拓展】——14_定时器之输入捕获

参考哔站&#xff1a;链接: 铁头山羊 一、微控制器的高级定时与控制功能集合 1、时基单元 2、输入捕获 3、输出比较 4、从模式控制器 5、高级定时器的输出控制 二、问题集合 1、什么是定时器 定时器是一种专门负责定时功能的片上外设GPI0AFI0EXTIUSART RCC I2C) 2、定时器…

飞越现实:3D可视化引领飞行体验新纪元

在浩瀚的蓝天之下&#xff0c;飞机以优雅的姿态划破长空&#xff0c;每一次起降、每一次盘旋&#xff0c;都是对速度与科技的完美诠释。而今&#xff0c;随着科技的飞速发展&#xff0c;我们不再仅仅满足于仰望天际的壮丽景象&#xff0c;而是能够借助先进的3D可视化技术&#…

JavaEE 第10节 线程池(Thread Pool)介绍

目录 一、线程池是什么 二、为什么线程池中取线程会比直接向操作系统申请来的高效&#xff1f; 三、JAVA标准库中的线程池 &#xff08;1&#xff09;类&#xff1a;ThreadPoolExecutor 1、int corePoolSize与int maximumPoolSize 2、long keepAlive和TimeUnit unit 3、Blo…

MySQL第6讲--DQL(数据查询语言)的基本操作之基本和条件查询

文章目录 前言DQL(数据查询语言)基本操作查询操作基本查询示例1&#xff1a;查询表格的name&#xff0c;age&#xff0c;并返回&#xff1b;示例2&#xff1a;查询表格中的所有字段&#xff1b;示例3&#xff1a;查询所有员工的工号并返回&#xff0c;起别名&#xff1b;示例4&…

人工智能在新药研发领域中发挥着至关重要的作用

本综述主要介绍机器学习和深度学习方法在药物发现领域的应用进展以及相关企业。 声明&#xff1a;本文为火石创造原创文章&#xff0c;欢迎个人转发分享&#xff0c;网站、公众号等转载需经授权。 本文选自《药学进展》2021年第7期&#xff0c;作者黄芳 1&#xff0c;杨红飞 1…

武汉流星汇聚:中国卖家亚马逊显威,供应链创新引领全球电商潮

在全球电商的浩瀚星空中&#xff0c;亚马逊无疑是最耀眼的那颗星&#xff0c;其庞大的用户基础、广泛的销售网络以及强大的品牌影响力&#xff0c;为无数商家提供了通往成功的快车道。而在这片充满机遇的蓝海中&#xff0c;中国卖家以其独特的优势&#xff0c;正逐渐成为一股不…

钢铁百科:SA572Gr60应用领域、SA572Gr60热处理状态、SA572Gr60常用规格

一、SA572Gr60材质与执行标准 SA572Gr60钢板是一种美标高强度低合金铌-钒结构钢板&#xff0c;执行标准为ASTM A572/A572M。此外&#xff0c;该钢板也符合ASME标准SA-572/SA-572M。 二、SA572Gr60化学成分 SA572Gr60钢板的主要化学成分包括&#xff1a; 碳C&#xff1a;0.16-…

haproxy高级功能及配置

目录 1.基于cookie的会话保持&#xff1a; 2.HAProxy状态页&#xff1a; 3.IP透传 1.基于cookie的会话保持&#xff1a; cookie value&#xff1a;为当前server指定cookie值&#xff0c;实现基于cookie的会话黏性&#xff0c;相对于基于 source 地址 hash 调度算法对客户端…

msgqueue.hpp队列模块

一.MsgQueue相关类介绍 二.MsgQueue类的实现 成员变量 MsgQueue 结构体用于描述一个消息队列的基本属性。 std::string _name; // 队列名称 bool _durable; // 队列是否持久化 bool _exclusive; // 队列是否独占 bool _auto_del; // 队列是否自动删除 google::pro…

版本控制基础理论

一、本地版本控制 在本地记录文件每次的更新&#xff0c;可以对每个版本做一个快照&#xff0c;或是记录补丁文件&#xff0c;适合个人使用&#xff0c;如RCS. 二、集中式版本控制&#xff08;代表SVN&#xff09; 所有的版本数据都保存在服务器上&#xff0c;协同开发者从…

在HTML中固定表格表头的简单方法

在HTML中&#xff0c;表格元素自身无法提供滚动以及固定表头的配置。借助第三方工具&#xff08;如jQuery的表头固定插件&#xff09;或者结合JavaScrip&#xff0c;是可以实现表格的表头固定的&#xff0c;除此之外&#xff0c;本文还想讨论一种更简单的方式来实现。 从思路上…