在 echarts折线图中添加一个自定义的 html元素

2 篇文章 1 订阅

遇到一个需求:折线图上最后一个点做成一个动态水波纹的点。。。
一开始想让 UI小哥做一个 gif动态图,直接加到 echarts折线图的拐点上,但是小哥说 gif的画质太差,不给用,切成了一系列的静态图,让自己组装成动态变换的。。。
要组装的话,那必然要自己写一个 html元素来设置 css样式,但是搞了半天,不知道怎么用自定义的 html元素,想直接使用 gif,然而 symbol属性不支持展示 gif,不过偶然发现 markPoint是支持 gif的哦!!!
但是回到 gif本身画质的问题上,当然还是能用自定义的元素最好了,而且,折线图的颜色不固定,总不能有几种颜色就让 UI小哥做几种颜色的图。。。
后来!!!终于在公司的 highcharts讨论群中获得了一些提示,是的,没错,以为 echarts做不了,跑去问 highcharts了 -_-|||

convertToPixel(finder, value): echarts实例有这么一个方法可以将图中的点转换成像素坐标,那只要将自定义的 html元素定位到这个坐标上就可以了!

  • 页面效果
    在这里插入图片描述
    在这里插入图片描述
    (因为是做的 Vue的项目,所以按照 Vue的语法写的,参考方法即可)
  • HTML代码
<template>
  <div class="chart-wrapper">
    <div id="myChart" :style="chartStyle"></div>
    <!-- 自定义的动态点 -->
    <div id="markPoint" class="mark-point">
      <div class="water water1"></div>
      <div class="water water2"></div>
    </div>
  </div>
</template>
  • Javascript代码
this.chartsDom.setOption(this.option); // chartsDom: 定义过的 echarts实例
// 注意!!!添加动态点——在setOption之后!!!!
this.seriesData.forEach((item, index) => { // seriesData: 自己组装的series值,如果有多条折线的话,html中自己定义的 markPoint需要遍历成多个的
   if (item.lastPoint) { // lastPoint: 每条折线找出的最后一个点的坐标[x, y]
     // 定位点的位置
     let position = this.chartsDom.convertToPixel({
       xAxisIndex: 0, // 第一个参数:需要转换的坐标系的信息,
       yAxisIndex: 0,
     }, [item.lastPoint.x, item.lastPoint.y]); // 第二个参数:点的坐标值
     const markPoint = document.getElementById('markPoint');
     const waters = markPoint.getElementsByClassName('water');
     markPoint.style.left = `${position[0] - 3}px`;
     markPoint.style.top = `${position[1] - 3}px`;
     const curColor = this.colors[index]; // colors:自定义的一组颜色值,取当前折线对应的 color
     markPoint.style.background = curColor;
     waters[0].style.background = curColor;
     waters[1].style.background = curColor;
     markPoint.style.display = 'block';
     // 绑定缩放事件 => 由于数据比较多,还使用了 dataZoom,需要监听缩放事件,不断设置 markPoint的位置
     this.chartsDom.on('dataZoom', () => {
       if (item.lastPoint) {
         position = this.chartsDom.convertToPixel({
           xAxisIndex: 0,
           yAxisIndex: 0,
         }, [item.lastPoint.x, item.lastPoint.y]);
         markPoint.style.left = `${position[0] - 3}px`;
         markPoint.style.top = `${position[1] - 3}px`;
       }
     });
     // 绑定legend切换事件 => legend切换时,也要让 markPoint随之显示/隐藏
     this.chartsDom.on('legendselectchanged', (params) => {
       // 判断当前是否被选中
       const { name, selected } = params;
       if (item.lastPoint) {
         markPoint.style.display = selected[name] ? 'block' : 'none';
       }
     });
   }
 });
  • CSS代码
  .chart-wrapper {
  /* 注意!!!转换成的像素坐标是以当前容器为基础的,所以不要忘记给容器设置 relative定位 */
    position: relative;
    overflow: hidden;
  }
  .mark-point {
    display: none;
    .water1 {
      animation: markPointAnim 2s infinite;
    }
    .water2 {
      animation: markPointAnim1 2s infinite;
    }
  }
  .mark-point,
  .mark-point .water {
    position: absolute;
    width: 6px;
    height: 6px;
    border-radius: 50%;
  }

  @keyframes markPointAnim {
    0% {
      transform: scale(1);
      opacity: 0.9;
    }
    100% {
      transform: scale(3);
      opacity: 0;
    }
  }
  @keyframes markPointAnim1 {
    0% {
      transform: scale(1);
      opacity: 0.9;
    }
    100% {
      transform: scale(6);
      opacity: 0;
    }
  }
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
自定义echarts折线图tooltip的样式,可以使用tooltip的formatter属性和CSS样式来实现。以下是一个示例代码: ```javascript option = { tooltip: { trigger: 'axis', formatter: function(params) { var html = '<div class="tooltip">'; html += '<div class="tooltip-header">' + params[0].name + '</div>'; params.forEach(function(item) { html += '<div class="tooltip-item">'; html += '<div class="tooltip-point" style="background-color:' + item.color + '"></div>'; html += '<div class="tooltip-name">' + item.seriesName + ':</div>'; html += '<div class="tooltip-value">' + item.value + '</div>'; html += '</div>'; }); html += '</div>'; return html; }, axisPointer: { type: 'cross' } }, // 其他配置项 // ... } ``` 上面代码,我们使用了tooltip的formatter属性来自定义tooltip的内容。在函数,我们可以通过params参数获取到当前tooltip包含的所有数据项,然后根据需要来组装html字符串。在这个例子,我们使用了一个`<div>`元素来作为tooltip的容器,并且为它添加一个自定义的CSS类名`tooltip`,以便后面可以通过CSS样式来对tooltip进行样式调整。 接下来,我们在formatter函数遍历params参数,将每个数据项的名称、数值、颜色等信息组装成一个html字符串,并添加到tooltip容器。在这个例子,我们使用了一个`<div>`元素来作为每个数据项的容器,并为它添加一个自定义的CSS类名`tooltip-item`,以便后面可以通过CSS样式来对每个数据项进行样式调整。 最后,我们在CSS样式定义了`.tooltip`和`.tooltip-item`两个类的样式,来对tooltip进行样式调整。以下是CSS样式的示例代码: ```css .tooltip { background-color: #fff; border: 1px solid #ccc; padding: 10px; } .tooltip-header { font-weight: bold; margin-bottom: 5px; } .tooltip-item { margin-bottom: 5px; } .tooltip-point { display: inline-block; width: 10px; height: 10px; border-radius: 50%; margin-right: 5px; } .tooltip-name { display: inline-block; font-weight: bold; margin-right: 5px; } .tooltip-value { display: inline-block; } ``` 上面代码,我们定义了`.tooltip`类的背景色、边框、内边距等样式,以及`.tooltip-header`、`.tooltip-item`、`.tooltip-point`、`.tooltip-name`、`.tooltip-value`等类的其他样式,来对tooltip进行样式调整。其,`.tooltip-point`类的样式用于设置每个数据项的颜色标识符,`.tooltip-name`类的样式用于设置每个数据项的名称,`.tooltip-value`类的样式用于设置每个数据项的数值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值