See the Pen highcharts : 外部要素からマウスオーバーを有効にする by Kazuyoshi Goto (@KazuyoshiGoto) on CodePen.
highcharts 標準で出力される凡例ではなく、グラフ外部のHTML要素からグラフのマウスオーバーを着火させたかったので試した。
HTML
凡例を構成する表のHTMLは、大まかに以下のような形。
<table class="legend-table">
<tr class="legend-row" data-num="0"></tr>
〜
<tr class="legend-row" data-num="5"></tr>
</table>
行にlegend-row
クラスとdata-num
属性を付与しているのが要。
(JSからの参照の仕方次第ではlegend-rowは付与しなくても良いと思えるが、可読性の面で付与した)
JS
HTML側からhighcartsのマウスオーバーを制御する処理は以下。
document.addEventListener('DOMContentLoaded', function () {
//※highcarts描画の処理は省略
//`chart`にチャート情報が入っている
//以下よりマウスオーバー用の処理
const rows = document.querySelectorAll('.legend-row');
rows.forEach(function (row) {
var num = row.dataset.num;
row.addEventListener('mouseover', function() {
chart.series[0].data.forEach(function(data) {
data.setState('inactive');
});
chart.series[0].data[num].setState('hover');
chart.tooltip.refresh(chart.series[0].points[num]);
});
row.addEventListener('mouseleave', function() {
chart.series[0].data.forEach(function(data) {
data.setState();
});
chart.tooltip.hide();
});
});
});
- まず
legend-row
一式をrows
に取得 -
rows
の中身をforEach
で回す。 - マウスオーバーしたら…
- まず全データの
setState
をinactive
にする(半透明化) - 次に、マウスオーバーしている
data-num
に該当するデータのsetState
をhoverにする - 同様に
tooltip
も表示する
- まず全データの
- マウスが外れたら、全データの
setState
とtooltip
を消す