ChartJS 如何在悬停时隐藏其他行?

vkc1a9a2  于 2023-02-04  发布在  Chart.js
关注(0)|答案(1)|浏览(187)

我使用的是Chart.js v3,下面是代码,但它没有隐藏。目标是当我悬停在一行上时,它隐藏其他行及其标签。代码如下所示:

  1. <html>
  2. <head>
  3. <script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
  4. <script src="https://cdn.jsdelivr.net/npm/moment@^2"></script>
  5. <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.8.1/chart.min.js"></script>
  6. </head>
  7. <body>
  8. <canvas id="myChart" width="300" height="200"></canvas>
  9. <script>
  10. var ctx = document.getElementById("myChart").getContext("2d");
  11. var myChart = new Chart(ctx, {
  12. type: "line",
  13. data: {
  14. labels: [1, 2, 3, 4, 5],
  15. datasets: [{
  16. label: "Line 1",
  17. data: [1, 2, 3, 4, 5],
  18. borderColor: "red",
  19. backgroundColor: "rgba(255,0,0,0.2)"
  20. }, {
  21. label: "Line 2",
  22. data: [5, 4, 3, 2, 1],
  23. borderColor: "blue",
  24. backgroundColor: "rgba(0,0,255,0.2)"
  25. }, {
  26. label: "Line 3",
  27. data: [2, 4, 6, 8, 10],
  28. borderColor: "green",
  29. backgroundColor: "rgba(0,255,0,0.2)"
  30. }]
  31. },
  32. options: {
  33. hover: {
  34. mode: "index",
  35. intersect: true
  36. },
  37. animation: {
  38. duration: 0
  39. }
  40. }
  41. });
  42. </script>
  43. </body>
  44. </html>
wfsdck30

wfsdck301#

我认为你应该在图表选项中实现onHover钩子。基于悬停的元素,你可以隐藏其他元素。我想有两点需要注意:
1.悬停模式应为'point'而非'index',否则将隐藏所有数据集
1.要在图表上有一致的视图,您应该在y刻度上设置minmax

  1. var ctx = document.getElementById("myChart").getContext("2d");
  2. var myChart = new Chart(ctx, {
  3. type: "line",
  4. data: {
  5. labels: [1, 2, 3, 4, 5],
  6. datasets: [{
  7. label: "Line 1",
  8. data: [1, 2, 3, 4, 5],
  9. borderColor: "red",
  10. backgroundColor: "rgba(255,0,0,0.2)"
  11. }, {
  12. label: "Line 2",
  13. data: [5, 4, 3, 2, 1],
  14. borderColor: "blue",
  15. backgroundColor: "rgba(0,0,255,0.2)"
  16. }, {
  17. label: "Line 3",
  18. data: [2, 4, 6, 8, 10],
  19. borderColor: "green",
  20. backgroundColor: "rgba(0,255,0,0.2)"
  21. }]
  22. },
  23. options: {
  24. scales: {
  25. y: {
  26. beginAtZero: true,
  27. max: 10
  28. }
  29. },
  30. onHover(e, elements, chart) {
  31. if (elements.length) {
  32. for (const el of elements) {
  33. const dsCount = chart.data.datasets.length;
  34. for (let i = 0; i < dsCount; i++) {
  35. if (i !== el.datasetIndex) {
  36. chart.setDatasetVisibility(i, false);
  37. }
  38. }
  39. }
  40. chart.update();
  41. } else {
  42. const dsCount = chart.data.datasets.length;
  43. for (let i = 0; i < dsCount; i++) {
  44. chart.setDatasetVisibility(i, true);
  45. }
  46. chart.update();
  47. }
  48. },
  49. hover: {
  50. mode: "point",
  51. intersect: true
  52. },
  53. animation: {
  54. duration: 0
  55. }
  56. }
  57. });
  1. .myChartDiv {
  2. max-width: 600px;
  3. max-height: 400px;
  4. }
  1. <html>
  2. <head>
  3. <script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
  4. <script src="https://cdn.jsdelivr.net/npm/moment@^2"></script>
  5. <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.8.1/chart.min.js"></script>
  6. </head>
  7. <body>
  8. <div class="myChartDiv">
  9. <canvas id="myChart" width="600" height="400"/>
  10. </div>
  11. </body>
  12. </html>
展开查看全部

相关问题