javascript - Chart.js 悬停时的垂直线和在线上的阴影

标签 javascript charts chart.js chart.js2

所以,我在我的项目中使用 Chart.js,这就是我在 PSD 中看到的。 enter image description here

好的。我开始探索这个问题,并真正找到了我的问题的答案。分别。

对于垂直线 - Moving vertical line when hovering over the chart using chart.js

对于阴影 - https://jsfiddle.net/dces93wv/https://github.com/chartjs/Chart.js/issues/4977

但是几个小时以来我一直无法弄清楚如何结合这两种方法。 :(

const ShadowLineElement = Chart.elements.Line.extend({
  draw () {
  
    const { ctx } = this._chart

    const originalStroke = ctx.stroke

    ctx.stroke = function () {
      ctx.save()
      ctx.shadowColor = 'red'
      ctx.shadowBlur = 0
      ctx.shadowOffsetX = 0
      ctx.shadowOffsetY = 8
      originalStroke.apply(this, arguments)
      ctx.restore()
    }
    
    Chart.elements.Line.prototype.draw.apply(this, arguments)
    
    ctx.stroke = originalStroke;
  }
})

Chart.defaults.ShadowLine = Chart.defaults.line
Chart.controllers.ShadowLine = Chart.controllers.line.extend({
  datasetElementType: ShadowLineElement
})

new Chart(document.getElementById('canvas'), {
      type: 'ShadowLine',
      data: {
        datasets: [
          {
          	label: 'somedata',
            fill: false,
            borderColor: 'green',
          	data: [
            	10, 20
            ]
          }
        ]
      }
    })
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.bundle.min.js"></script>
<p>
<b style="color: red">red</b> is shadow
</p>
<canvas id="canvas" width="200" height="100"></canvas>

最佳答案

您可以使用 Chart Js 库 ( docs ) 自定义各种内容。

要向图表线添加阴影,您可以使用 Chart.controllers.line 并创建一个函数来绘制阴影。

阴影示例:

let draw = Chart.controllers.line.prototype.draw;
Chart.controllers.line = Chart.controllers.line.extend({
    draw: function() {
        draw.apply(this, arguments);
        let ctx = this.chart.chart.ctx;
        let _stroke = ctx.stroke;
        ctx.stroke = function() {
            ctx.save();
            ctx.shadowColor = '#000000';
            ctx.shadowBlur = 10;
            ctx.shadowOffsetX = 0;
            ctx.shadowOffsetY = 4;
            _stroke.apply(this, arguments)
            ctx.restore();
        }
    }
});

要创建垂直线,您可以使用 Chart.defaults.LineWithLine 并创建一个函数来绘制垂直线。

示例:

Chart.defaults.LineWithLine = Chart.defaults.line;
Chart.controllers.LineWithLine = Chart.controllers.line.extend({
   draw: function(ease) {
      Chart.controllers.line.prototype.draw.call(this, ease);

      if (this.chart.tooltip._active && this.chart.tooltip._active.length) {
         var activePoint = this.chart.tooltip._active[0],
             ctx = this.chart.ctx,
             x = activePoint.tooltipPosition().x,
             topY = this.chart.scales['y-axis-0'].top,
             bottomY = this.chart.scales['y-axis-0'].bottom;

         // draw line
         ctx.save();
         ctx.beginPath();
         ctx.moveTo(x, topY);
         ctx.lineTo(x, bottomY);
         ctx.lineWidth = 2;
         ctx.strokeStyle = '#07C';
         ctx.stroke();
         ctx.restore();
      }
   }
});

按照我的 Fiddle 中您问题的完整代码进行操作

关于javascript - Chart.js 悬停时的垂直线和在线上的阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54990176/

相关文章:

javascript - Angular 9 - 错误类型错误 : Cannot read property 'name' of undefined

Javascript 会导致 Chrome 浏览器崩溃?

javascript - jQuery - 悬停以触发刷新时悬停/鼠标悬停?

ajax - Django 和 Highcharts - 生成图表,但仍处于干燥状态?

Javascript - 更改 Google Chart onClick

javascript - AJAX : How to get the last URL in a redirect flow inside an error handler with JSONP as content-type

javascript - amcharts svg 条形图上的值之间的动画过渡

php - 如何从 ChartJS 收集的数据中获取百分比?

chart.js - Chart JS 3.0.2 中的时间序列比例。带来错误 "This method is not implemented: either no adapter can be found or an incomplete integration was ..."

javascript - 将 Chart.js 作为 HTML 发送,然后通过 ajax 渲染