Chart.js如何在折线图中显示标签和图例的光标指针

Omi*_*Omi 6 jquery chart.js

我有以下使用chart.js的折线图示例.我想表明:

  1. 悬停时图例和标签的指针光标
  2. 在线悬停上显示所有标签数据

 var line_chart = new Chart(document.getElementById("line-chart"), {
        type: 'line',
        data: {
            labels: ['May', 'June', 'July'],
            datasets: [{
                    data: [15, 25, 15],
                    label: "My Dataset1",
                    borderColor: "#00F",
                    fill: false
                }, {
                    data: [35, 15, 25],
                    label: "My Dataset2",
                    borderColor: "#F00",
                    fill: false
                }
            ]
        },
        options: {

            tooltips: {
                mode: 'label',
            },
            hover: {
                mode: 'label'
            },
        }
    });
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"></script>

<div style='width:80%'>
<canvas id="line-chart" width="800" height="450"></canvas>
</div>
Run Code Online (Sandbox Code Playgroud)

ɢʀᴜ*_*ᴜɴᴛ 20

更好的方法

不需要jQuery来选择canvas element(line-chart).

1▸解决方案:

在图表选项中添加以下内容:

   legend: {
      onHover: function(e) {
         e.target.style.cursor = 'pointer';
      }
   },
   hover: {
      onHover: function(e) {
         var point = this.getElementAtEvent(e);
         if (point.length) e.target.style.cursor = 'pointer';
         else e.target.style.cursor = 'default';
      }
   }
Run Code Online (Sandbox Code Playgroud)

2▸解决方案:

集提示 modedataset:

tooltips: {
   mode: 'dataset'
}
Run Code Online (Sandbox Code Playgroud)

ᴡᴏʀᴋɪɴɢᴡᴏʀᴋɪɴɢxᴀᴍᴘʟᴇ⧩

var line_chart = new Chart(document.getElementById("line-chart"), {
   type: 'line',
   data: {
      labels: ['May', 'June', 'July'],
      datasets: [{
         data: [15, 25, 15],
         label: "My Dataset1",
         borderColor: "#00F",
         fill: false
      }, {
         data: [35, 15, 25],
         label: "My Dataset2",
         borderColor: "#F00",
         fill: false
      }]
   },
   options: {
      tooltips: {
         mode: 'dataset',
      },
      legend: {
         onHover: function(e) {
            e.target.style.cursor = 'pointer';
         }
      },
      hover: {
         onHover: function(e) {
            var point = this.getElementAtEvent(e);
            if (point.length) e.target.style.cursor = 'pointer';
            else e.target.style.cursor = 'default';
         }
      }
   }
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"></script>

<div style='width:80%'>
   <canvas id="line-chart" width="800" height="450"></canvas>
</div>
Run Code Online (Sandbox Code Playgroud)


Fre*_*ntz 11

  • 从 Chart js 版本 3.5.1 开始,onHover() 选项看起来略有不同,并且查找点的方法也发生了变化。

  • “target”在“e.native”下再嵌套一层

  • 通过将交互模式设置为“索引”,我可以在悬停时在一个工具提示中看到我的组合图表值。

    options: {
       interaction: { mode: 'index' },
       onHover: function (e) {
         const points = this.getElementsAtEventForMode(
           e,
           'index', { axis: 'x', intersect: true },
           false
         );
    
         if (points.length) e.native.target.style.cursor = 'pointer';
         else e.native.target.style.cursor = 'default';
       }
    }
    
    Run Code Online (Sandbox Code Playgroud)

光标指针和组合工具提示


Nat*_*han 6

对于任何正在寻找 Chart.js v3.5.1 的 Typescript 解决方案的人来说,扩展@joshfindit 的答案:

onHover: (event, activeElements) => {
   (event?.native?.target as HTMLElement).style.cursor =
        activeElements?.length > 0 ? 'pointer' : 'auto';
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*oli 5

使用Chart.js 2.x,我发现这种方法更加优雅。只需在选项中添加:

events: ['mousemove'], // this is needed, otherwise onHover is not fired
onHover: (event, chartElement) => {
    event.target.style.cursor = chartElement[0] ? 'pointer' : 'default';
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。

  • 3.x 版本在 4.4 Sep 2023 中仍然有效 (2认同)