第20章:ECharts 图表主题切换 + 自定义颜色渐变

第20章:ECharts 图表主题切换 + 自定义颜色渐变

业务场景:若依本身支持深色 / 浅色主题切换,本节实现 ECharts 图表跟随系统主题切换,同时演示柱状图、折线图渐变填充效果,复用已有useEcharts封装,无需修改 echartHelper。

页面完整 Vue 代码

复制代码
<template>
  <div class="chart-container">
    <el-alert title="图表主题切换 + 渐变色彩演示" type="info" style="margin-bottom:10px"/>
    <el-button type="primary" @click="toggleTheme">切换深浅主题</el-button>
    <div
      ref="chartRef"
      style="width:100%;height:400px;border:1px solid #eee;margin-top:10px"
    ></div>

    <el-dialog v-model="dialogVisible" title="点击详情">
      <p>月份:{{ clickData.name }}</p>
      <p>数值:{{ clickData.value }}</p>
    </el-dialog>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import { useEcharts } from '@/composables/echartHelper'
  import * as echarts from 'echarts'
const { chartRef, setChartOption, onChartEvent } = useEcharts()

const dialogVisible = ref(false)
const clickData = ref({ name:'', value:0 })
const isDark = ref(false)

// 生成option,根据主题动态修改文字、背景、渐变
function getChartOption() {
  const textColor = isDark.value ? '#fff' : '#333'
  const bgColor = isDark.value ? '#1f2937' : '#ffffff'

  return {
    backgroundColor: bgColor,
    title: {
      text: '渐变效果演示图表',
      left: 'center',
      textStyle: {
        fontSize:18,
        color: textColor
      }
    },
    tooltip: {
      trigger: 'axis'
    },
    legend: {
      data: ['销售额'],
      bottom: 10,
      textStyle: { color:textColor, fontSize:14 }
    },
    grid: {
      left: '3%',
      right: '4%',
      bottom: '15%',
      containLabel: true
    },
    xAxis: {
      type: 'category',
      data: ['1月','2月','3月','4月','5月','6月'],
      axisLine:{ lineStyle:{color:textColor} },
      axisLabel: { fontSize:13, color:textColor }
    },
    yAxis: {
      type: 'value',
      axisLine:{ lineStyle:{color:textColor} },
      axisLabel: { fontSize:13, color:textColor }
    },
    series: [
      {
        name: '销售额',
        type: 'bar',
        data: [120, 200, 150, 280, 190, 240],
        itemStyle: {
          // 柱状图垂直渐变
          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
            { offset: 0, color: '#409EFF' },
            { offset: 1, color: '#a0d6ff' }
          ])
        }
      }
    ]
  }
}

// 初始化渲染
setChartOption(getChartOption())

// 切换主题
const toggleTheme = () => {
  isDark.value = !isDark.value
  setChartOption(getChartOption())
}

// 点击事件
onChartEvent('click', (params)=>{
  clickData.value = {
    name: params.name,
    value: params.value
  }
  dialogVisible.value = true
})
</script>

⚠️ 注意:需要导入 echarts,在 script 顶部增加导入

复制代码
import * as echarts from 'echarts'

✅ 测试步骤

  1. 保存 vue 文件,刷新页面
  2. 图表正常渲染,柱子带有蓝到浅蓝的渐变效果
  3. 点击【切换深浅主题】按钮:图表背景、文字颜色自动切换深色 / 浅色两套样式
  4. 悬浮 tooltip 正常,点击柱子弹窗正常
  5. 窗口缩放防抖 resize 正常,路由切换实例销毁无内存泄漏

拓展知识点

  • echarts.graphic.LinearGradient(x1,y1,x2,y2,数组):0,0,0,1 代表垂直渐变;0,0,1,0 代表水平渐变

  • 折线图区域填充渐变,在 series 里面增加 areaStyle 配置

    areaStyle: {
    color: new echarts.graphic.LinearGradient(0,0,0,1,[
    {offset:0,color:'rgba(64,158,255,0.6)'},
    {offset:1,color:'rgba(64,158,255,0.05)'}
    ])
    }

相关推荐
jktantan3 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
小郎君65812 小时前
(一)为什么表单需要第三种状态:disabled、readonly 与纯文本展示
前端·vue.js
jktantan15 小时前
(二)Vue 3 的 attrs 不是响应式:el-form 扩展属性同步的三种方案
前端·javascript·vue.js·element-plus
Highcharts.js18 小时前
Highcharts 集成到 React 或 Vue 项目中时,如何高效地使用 TypeScript技巧?
vue.js·人工智能·react.js·typescript·前端框架·highcharts
Java后端的Ai之路1 天前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
jktantan2 天前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
小大宇2 天前
Vue知识点-ElementPlus-06 单选+多选+下拉+日期选择
前端·vue.js·elementui
小大宇2 天前
Vue知识点-ElementPlus-05 输入框
前端·javascript·vue.js
软件技术NINI2 天前
基于SpringBoot和Vue的摇滚乐鉴赏网站
vue.js·spring boot·后端·spring·html·毕业设计·毕设
计算机毕设定制辅导-无忧学长2 天前
《基于物品协同过滤的闲置书换购微信小程序设计开发》
java·vue.js·spring boot·微信小程序·uniapp·闲置书换购微信小程序·物品协同过滤算法