如何实现ecahrts图表的滚动条效果

443 阅读5分钟

image.png

今天来谈一个如何实现ecahrts图表的滚动条效果,

近期,由于咱们的数据量比较多,所以导致咱们的echarts图表展示的数据比较紧凑,所以展示就提出一个需求,就是要让我们的echarts图表可以通过数据量,来进行滚动效果,如果数据少于12条时,就关闭滚动条,如果大于12时就开启滚动条,且要达到以上ui效果。首先我们应该知道的就是ecahrts图表支持滚动的属性就是dataZoom:{ type: 'slider'(出现滚动条),};默认是不出现滚动条,而是内置图表放大缩小效果。

在完成需求时,我先来说说以上需求所遇到的问题,以及难点哈。

难点1、首先我们要实现的效果,就是要达到ui那样,但是echarts图表呢,他两边的手柄并不是以上两个小圆圈,而是一个比较难看的手柄,且看下图:

image.png 可以看出他是两个白色的小方块,所以,我们首先要改变就是两边的样式,看了一下属性,

可以改变他的属性就是  handleIcon:(该属性默认支持svg,也支持imgae),所以为了节省前端开发效率就让ui给咱们切了一个图表,当然自己也可以阿里icon去找。

以上如果中规中矩的完成相对应的css样式,其实是已经可以达到ui效果了,但是随之而来的问题又出现了

难点2:功能是实现了,但是某一天上线之后,用户抱怨说,两边的手柄,触发效果不太好,很难拉长或者缩短

所以又得下线重做,经过一个小时的思考,于是我拉了产品和ui开了一个会议,我问ui可不可以给我切一个四周透明,中间是小圆圈的的图片,ui说可以,那么就解决了,触发不好的效果了,因为他的接触面积大了,手指随便放都能触摸到,图片效果如下:

image.png

然后就又上线了,但是事情远远没有我们想象中的那么顺利,

难点3:某天,用户拥抱怨,说,虽然拉长缩短的效果,已经很灵敏了,但是拖动效果不是很好,说到底,还就是手柄中间的蓝色细条太细了,同样也是触感不好。

所以,我又得思前想后,如何解决这个问题,因为这个和手柄不一样,是可以支持图片的,而细条却不行,所以就只能从其他地方思考,后面想到了渐变色,没有错就是渐变色。因为echarts图表是支持渐变色的,所以用渐变色是再好不过了,所以就立即进行开发了,最终的关键代码如下:

 

fillerColor: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
        {
          offset: 0,
          color: 'rgba(0,0,0,0)',
        },
        {
          offset: 0.44,
          color: 'rgba(4, 115, 255, 0)',
        },
        {
          offset: 0.45,
          color: '#0473FF',
        },

        {
          offset: 0.5,
          color: '#0473FF',
        },

        {
          offset: 0.55,
          color: '#0473FF',
        },
        {
          offset: 0.56,
          color: 'rgba(4, 115, 255, 0)',
        },
        {
          offset: 1,
          color: 'rgba(0,0,0,0)',
        },
      ]),
      zoomLock: false,
      showDataShadow: false, //是否显示数据阴影 默认auto
      backgroundColor: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
        {
          offset: 0,
          color: 'rgba(0,0,0,0)',
        },
        {
          offset: 0.44,
          color: 'rgba(4, 115, 255, 0)',
        },
        {
          offset: 0.45,
          color: 'rgba(4, 115, 255,  0.1)',
        },
        {
          offset: 0.5,
          color: 'rgba(4, 115, 255, 0.1)',
        },
        {
          offset: 0.55,
          color: 'rgba(4, 115, 255,  0.1)',
        },
        {
          offset: 0.56,
          color: 'rgba(4, 115, 255, 0)',
        },
        {
          offset: 1,
          color: 'rgba(0,0,0,0)',
        },
      ]),

最终终于达到了用户的需求,至于根据数据量来是否开启滚动条,其实也就是判断数据量的多少,就行了,很简单,就不再多说了,

具体的代码如下,首先涉及到多处用到滚动条,所以肯定是需要封装的,所以我把封装的js文件放在了utils文件夹中命名为dataZoom.js,代码如下:


import circle from '@/assets/img/icon/touch1.png';
import * as echarts from 'echarts';
export default (start = 70, end = 100, bottom = -10) => {
  const dataZoom = [
    {
      left: '3%',
      xAxisIndex: [0], //这里是从X轴的0刻度开始
      show: true, //是否显示滑动条,不影响使用
      type: 'slider',
      start, // 从头开始。
      end, // 一次性展示6个
      height: 32, //组件高度
      bottom,
      width: 300,
      fillerColor: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
        {
          offset: 0,
          color: 'rgba(0,0,0,0)',
        },
        {
          offset: 0.44,
          color: 'rgba(4, 115, 255, 0)',
        },
        {
          offset: 0.45,
          color: '#0473FF',
        },

        {
          offset: 0.5,
          color: '#0473FF',
        },

        {
          offset: 0.55,
          color: '#0473FF',
        },
        {
          offset: 0.56,
          color: 'rgba(4, 115, 255, 0)',
        },
        {
          offset: 1,
          color: 'rgba(0,0,0,0)',
        },
      ]),
      zoomLock: false,
      showDataShadow: false, //是否显示数据阴影 默认auto
      backgroundColor: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
        {
          offset: 0,
          color: 'rgba(0,0,0,0)',
        },
        {
          offset: 0.44,
          color: 'rgba(4, 115, 255, 0)',
        },
        {
          offset: 0.45,
          color: 'rgba(4, 115, 255,  0.1)',
        },
        {
          offset: 0.5,
          color: 'rgba(4, 115, 255, 0.1)',
        },
        {
          offset: 0.55,
          color: 'rgba(4, 115, 255,  0.1)',
        },
        {
          offset: 0.56,
          color: 'rgba(4, 115, 255, 0)',
        },
        {
          offset: 1,
          color: 'rgba(0,0,0,0)',
        },
      ]),
      borderRadius: 6,
      borderColor: 'rgba(0,0,0,0)',
      handleIcon: 'image://' + circle,
      showDetail: false, //即拖拽时候是否显示详细数值信息 默认true
      filterMode: 'filter',
      handleSize: 32,
      handleStyle: {
        color: 'rgba(4,115,255,0)',
        borderWidth: 0,
      },
      moveOnMouseMove: true,
      moveHandleSize: 0, //该处为0则表示时间轴滚动条上面拖拽的那个高度可以与时间齐平
      brushSelect: false, //刷选功能,设为false可以防止拖动条长度改变 ************(这是一个坑)
    },
  ];
  return dataZoom;
};
/**
 * 公司类型
 */

 

然后就是在mian.js中将该方法挂载到vue原型上,这样就可以全局使用了,代码如下:


import dataZoom from '@/utils/dataZoom';
Vue.prototype.$dataZoom = dataZoom;

 

最后就是在组件中如何使用,直接放在eharts数据配置中就行了代码如下:

options:{
 dataZoom: this.$dataZoom(0, 30, -10),
 }

好了以上就是本期需求的艰难历程,感谢各位小伙伴的关注,让我们下期再见