前端js: echarts图例legend数据过多的时候分页显示&鼠标滚动显示图例

echarts图例legend数据过多的时候分页显示&鼠标滚动显示 

  1.echarts图例设置分页滚动  type: 'scroll'  示例如下:

legend: [{
          data:[],
          tooltip: {
            show: true,
            textStyle: {
              color: "#cecece",
              fontSize:14 // 设置图例文字大小
            },
            position: 'right' ,
            backgroundColor: 'rgba(100, 100, 100, 0.8)', // 设置背景颜色为白色,透明度为0.8
            borderColor: 'gray', // 设置边框颜色为灰色
          },
          formatter: function (name) {
            return name.length > 12 ? name.substring(0, 12) + '...' : name;
          },
          orient: 'vertical',
          type: 'scroll', // 设置图例类型为滚动类型 :分页滚
          pageIconColor:  '#cecece', // 滚动图标颜色
          pageIconInactiveColor: '#2f4554', // 翻页按钮不激活时(即翻页到头时)的颜色
          pageTextStyle: { // 图例页信息的文字样式
            color: '#cbcbcb'
          },
          pageIconSize: 14, // 滚动图标大小
          right: '3%',
          top: 'center',
          height: '75%',
          itemWidth: 9,
          itemHeight: 9,
          itemGap: 6,
          borderRadius: 15,
          icon: 'circle',
          textStyle: {
            color: '#cecece',
            fontSize: 14 // 设置图例文字大小
          }
        }],
 

    2. echarts图例设置分页滚动的基础上,设置鼠标滚轮滚动

<template>
  <div :id="id" class="ecahrtStyle"  @wheel='wheelDIV'></div>
</template>

   


methods :
  
wheelDIV: debounce(function (e) {
     // 绑定鼠标滚轮事件 ,前提需要设置   legend: [{ data:[]]值
     if (  this.chart  &&  this.chart.getOption().legend[0].data.length    && this.isWheelLegendData) {
       e.preventDefault();
       const delta = e.deltaY > 0 ? 1 : -1; // 滚动方向
       var legend0 = this.chart.getOption().legend[0]
       const currentIndex =    legend0.scrollDataIndex || 0;
        let newIndex =  currentIndex + delta * 6// 步长设为 6
        let newIndex =  newIndex <0 ?   newIndex+   legend0.data.length:  newIndex  
       newIndex = newIndex >=   legend0.data.length ?0:  newIndex
       this.chart.setOption({
         legend: { scrollDataIndex: newIndex }
       });
     },

  备注其他:改为在父组件设置

 

## (echarts ) - 功能:legend图标多,在ECHARTS容器的父组件设置鼠标滚轮事件
```
  <div class="industry-pie"   @wheel='wheelDIV'>   
      <Echart :options="options" ref='chart'  :isWheelLegendData='true'></Echart>
  </div>
```


     methods:  
      ```
    wheelDIV: debounce(function (e) { 
      const $dom =   this.$refs.chart
      // 绑定鼠标滚轮事件 ,前提需要设置   legend: [{ data:[]]值
      if ($dom  ) {
        e.preventDefault();
        const delta = e.deltaY > 0 ? 1 : -1; // 滚动方向 
        var  legendArr = this.$refs.chart.getOption().legend
        const currentIndex =
        legendArr[0].scrollDataIndex || 0; 
        console .log(delta , currentIndex ,legendArr) 
        let newIndex =  currentIndex + delta * 6 <0 ?     legendArr[0].data.length:  currentIndex + delta * 6 // 步长设为 6
        newIndex = newIndex >=  legendArr[0].data.length ?0:  newIndex   
        this .options .legend  [0] .scrollDataIndex =newIndex 
      }
    } , 0.5 *1000), 
    ```

 

 data() {
    return {
      options: {
        tooltip: {
          show: true,
          textStyle: {
            align: "left",
          },
          backgroundColor: "transparent",
          borderWidth: 0,
          confine: true,
          extraCssText: "box-shadow: 0 0 0 rgba(0, 0, 0, 0);",
          formatter: function (params) {
             let str = `
            <div style = "background :transparent;height:100px;position: relative">
            <div style="background :rgba(100, 100, 100, 0.8) ;border:1px solid gray;position: absolute;left: 0px; padding:10px;top: 15px;width: background;height:66px;line-height:22px;font-size: 14px;color:#cecece;">
            <span>${params.name}</span>
             <br/> 数量:${params.value}<br/> 占比:${params.percent
              }%</div>
            </div>
            `;
            return str;
          },
        },
        legend: [{
          data:[],
          tooltip: {
            show: false,
            textStyle: {
              color: "#cecece",
              fontSize:14 // 设置图例文字大小
            },
            position: 'right' ,
            backgroundColor: 'rgba(100, 100, 100, 0.8)', // 设置背景颜色为白色,透明度为0.8
            borderColor: 'gray', // 设置边框颜色为灰色
          },
          formatter: function (name) {
            return name.length > 12 ? name.substring(0, 12) + '...' : name;
          },
          orient: 'vertical',
          type: 'scroll', // 设置图例类型为滚动类型 :分页滚动
          pageIconColor:  '#cecece', // 滚动图标颜色
          pageIconInactiveColor: '#2f4554', // 翻页按钮不激活时(即翻页到头时)的颜色
          pageTextStyle: { // 图例页信息的文字样式
            color: '#cbcbcb'
          },
          pageIconSize: 14, // 滚动图标大小
          right: '3%',
          top: 'center',
          height: '75%',
          itemWidth: 9,
          itemHeight: 9,
          itemGap: 6,
          borderRadius: 15,
          icon: 'circle',
          textStyle: {
            color: '#cecece',
            fontSize: 14 // 设置图例文字大小
          }
        }],
        series: [],
      },
      colorOption: [
        ["#1F68FF", "#ABD5FF"],
        ["#03376F", "#00B188"],
        ["#002DE2", "#506BF3"],
        ["#c3ddf7", "#c4ddfc"],
        ["#06C687", "#4AFFC9"],
        ["#6A2EFF", "#A688EE"],
        ["#12cae7", "#846fb9"],
        ["#2eff31", "#3f7c63"],
        ["#cb2eff", "#9745c4"],
        ["#ff6d2e", "#e74121"],
        ["#d7a793", "#e74121"],
        ["#295f69", "#da9e92"],
      ],
      value1: 0,
     
    };
  },

  


 
 
mounted() {
    this.initData();
  },
  computed: {
    dataValue() {
      return this.dataList.reduce((pre, cur, index) => {
        if (index % 6 == 0) {
          console.log({ pre });
          pre.push([]);
        }
        pre[pre.length - 1].push(cur);
        return pre;
      }, []);
    }
  },
  watch: {
    dataList() {
      this.initData();
    }
  },
  methods: {
    // 图表数据值放入options
    initData() {
      let dataSOption = [];
      this.options.legend[0].data = []; 
      if (this.dataList) {  
        this.options.series = [];
        this.dataList.forEach((item, index) => {
          let lenColor= this.colorOption .length ||1 
          let color = this.colorOption[index % lenColor];
          
          let dataOption = {
            value: 0,
            name: "",
            itemStyle: {
              color: {
                type: "linear",
                x: 0,
                y: 0,
                x2: 0,
                y2: 1,
                colorStops: [
                  {
                    offset: 0,
                    color: "red", // 0% 处的颜色
                  },
                  {
                    offset: 1,
                    color: "blue", // 100% 处的颜色
                  },
                ],
                global: false, // 缺省为 false
              },
            },
          };
          dataOption.value = item.value;
          dataOption.name = item.name;
          // 根据自定义的颜色进行配置
          dataOption.itemStyle.color.colorStops = [
            {
              offset: 0,
              color: color[0], // 0% 处的颜色
            },
            {
              offset: 1,
              color: color[1], // 100% 处的颜色
            },
          ];
          dataSOption.push(dataOption);
          this.options.legend[0].data  .push( item.name) 
        });
      }
      this.options.series.push({
        type: "pie",
        radius: ["0", "50%"],
        emphasis: {
          scale: true,
          scaleSize: 20,
        },
        avoidLabelOverlap: true,
        label: {
          show: false, 
          textStyle: { 
            fontSize:14
           },
        },
        left: "-190px",
        data: dataSOption,
      }); 
    }, 
   
  },
  props: ['dataList']

  

posted @ 2025-02-26 12:29  July_Zheng  阅读(321)  评论(0)    收藏  举报