当我在图例中悬停“苹果”时,如何使其他线条半透明?
gajydyqb1#
对于Chart.JS 2.x:示例:https://jsfiddle.net/rn7ube7v/4/我们需要在2个dataset.borderColor s之间切换,其中1个颜色的alpha值为0.2(20%可见)和1(100%可见)。例如:使用HSL颜色来循环每个数据集的彩虹,我们将常规颜色存储为dataset.accentColor和dataset.accentFadedColor,用于未聚焦时。
dataset.borderColor
0.2
1
dataset.accentColor
dataset.accentFadedColor
function steppedHslColor(ratio, alpha) { return "hsla(" + 360 * ratio + ', 60%, 55%, ' + alpha + ')'; } function colorizeDatasets(datasets) { for (var i = 0; i < datasets.length; i++) { var dataset = datasets[i] dataset.accentColor = steppedHslColor(i / datasets.length, 1) dataset.accentFadedColor = steppedHslColor(i / datasets.length, 0.2) dataset.backgroundColor = dataset.accentColor dataset.borderColor = dataset.accentColor } return datasets } colorizeDatasets(datasets)
字符串然后我们勾选options.legend.onHover(mouseEvent, legendItem)来应用正确的颜色。
options.legend.onHover(mouseEvent, legendItem)
var myChart = new Chart(ctx, { type: 'line', data: { datasets: datasets, }, options: { legend: { onHover: function(e, legendItem) { if (myChart.hoveringLegendIndex != legendItem.datasetIndex) { myChart.hoveringLegendIndex = legendItem.datasetIndex for (var i = 0; i < myChart.data.datasets.length; i++) { var dataset = myChart.data.datasets[i] if (i == legendItem.datasetIndex) { dataset.borderColor = dataset.accentColor } else { dataset.borderColor = dataset.accentFadedColor } } myChart.update() } } }, }, });
型不幸的是,没有config.legend.onLeave回调,所以我们需要挂钩canvas.onmousemove,看看它是否离开图例区域。
config.legend.onLeave
canvas.onmousemove
myChart.hoveringLegendIndex = -1 myChart.canvas.addEventListener('mousemove', function(e) { if (myChart.hoveringLegendIndex >= 0) { if (e.layerX < myChart.legend.left || myChart.legend.right < e.layerX || e.layerY < myChart.legend.top || myChart.legend.bottom < e.layerY ) { myChart.hoveringLegendIndex = -1 for (var i = 0; i < myChart.data.datasets.length; i++) { var dataset = myChart.data.datasets[i] dataset.borderColor = dataset.accentColor } myChart.update() } } })
型
vsaztqbk2#
对于使用chart.js 4的更简单的解决方案:我决定只是灰色的其他线,使他们半透明。我把我的初始颜色列表中,我做了以下事情,所以我可以重置颜色onLeave:
onLeave
plugins: { [...] legend: { onHover: (event, legendItem, legend) => { const chart = legend.chart; chart.config.data.datasets.forEach(d => { if (legendItem.text !== d.label) { d.backgroundColor = "rgba(200,200,200,0.2)"; d.borderColor = "rgba(200,200,200,0.2)" } }) chart.update() }, onLeave: (event, legendItem, legend) => { const chart = legend.chart; chart.config.data.datasets.forEach((d,index) => { d.backgroundColor = this.colors[index]; d.borderColor = this.colors[index]; }) chart.update(); } }, },
字符串
2条答案
按热度按时间gajydyqb1#
对于Chart.JS 2.x:
示例:https://jsfiddle.net/rn7ube7v/4/
我们需要在2个
dataset.borderColor
s之间切换,其中1个颜色的alpha值为0.2
(20%可见)和1
(100%可见)。例如:使用HSL颜色来循环每个数据集的彩虹,我们将常规颜色存储为
dataset.accentColor
和dataset.accentFadedColor
,用于未聚焦时。字符串
然后我们勾选
options.legend.onHover(mouseEvent, legendItem)
来应用正确的颜色。型
不幸的是,没有
config.legend.onLeave
回调,所以我们需要挂钩canvas.onmousemove
,看看它是否离开图例区域。型
vsaztqbk2#
对于使用chart.js 4的更简单的解决方案:
我决定只是灰色的其他线,使他们半透明。我把我的初始颜色列表中,我做了以下事情,所以我可以重置颜色
onLeave
:字符串