ChartJS 图表Angular 梯度

9rnv2umw  于 2023-02-12  发布在  Chart.js
关注(0)|答案(1)|浏览(199)

我一直在尝试不同的方法

  1. linear-gradient(135deg, #FBCF33 0%, #F53939 90%);

在我的条形图。我接近所需的梯度。但是,未能实现完全相同的一个在CSS。
据我所知,这是由于Angular 。如何实现同样的createLinearGradient
下面是我的尝试。

  1. const angle = 136 * Math.PI / 180;
  2. var x2 = 400 * Math.cos(angle); // angle in radians
  3. var y2 = 400 * Math.sin(angle); // angle in radians
  4. var g1 = ctx.createLinearGradient(0, 0, x2, y2);
  5. g1.addColorStop(0, '#EDDE5D');
  6. g1.addColorStop(0.5, '#F09819');

有人能分享一下对此的看法吗?

    • 编辑:**

带颜色的数据集

  1. const equipment = [100, 0, 20, 10, 60, 20, 0, 0, 20];
  2. function bgColor(context, c1, c2) {
  3. const {chart, datasetIndex, index} = context;
  4. const ds = chart.data.datasets[datasetIndex];
  5. const value = ds.data[index];
  6. const y = chart.scales.y.getPixelForValue(value);
  7. const meta = chart.getDatasetMeta(datasetIndex);
  8. const data = meta.data[index];
  9. const {x, width, base} = data;
  10. if (x) {
  11. const ctx = chart.ctx;
  12. const gradient = ctx.createLinearGradient(x, y, x + width, base);
  13. gradient.addColorStop(0, c1);
  14. gradient.addColorStop(0.9, c2);
  15. return gradient;
  16. }
  17. }
  18. datasets: [
  19. {
  20. label: 'Equipment',
  21. data: equipment,
  22. backgroundColor(context) {
  23. return bgColor(context, '#EDDE5D', '#F09819');
  24. },
  25. tension: 0.4,
  26. fill: false,
  27. borderWidth: 0,
  28. hoverBorderColor: "#000",
  29. hoverBackgroundColor: '#FBCF33',
  30. hoverBorderWidth: 1,
  31. }]
jfewjypa

jfewjypa1#

你把问题归结为Angular 是正确的!你这里的问题是CSS linear-gradient解释“Angular ”的方式。
对于CSS:
渐变线的方向Angular 。值0度相当于到顶部;增加的值从那里顺时针旋转。
Angular 可视化:

但是,在使用Javascript canvas时,原点位于右侧的正x和底部的正y,创建的内容如下所示:

这会导致你的渐变实际上被设置在画布之外的一个位置!考虑到这一点,你可以通过设置与CSS代码相同的色标来匹配渐变,但将Angular 调整为45度。下面是一个工作示例:

  1. const canvas = document.getElementById("canvas");
  2. const ctx = canvas.getContext("2d");
  3. const angle = 45 * Math.PI / 180;
  4. var x2 = 400 * Math.cos(angle); // angle in radians
  5. var y2 = 400 * Math.sin(angle); // angle in radians
  6. var g1 = ctx.createLinearGradient(0, 0, x2, y2);
  7. g1.addColorStop(0, '#FBCF33');
  8. g1.addColorStop(0.9, '#F53939');
  9. ctx.fillStyle = g1;
  10. ctx.fillRect(0, 0, 400, 400);
  1. div{
  2. width:400px;
  3. height:400px;
  4. background: linear-gradient(135deg, #FBCF33 0%, #F53939 90%);
  5. }
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
  5. <link type="text/css" rel="stylesheet" href="stylesheet.css"/>
  6. </head>
  7. <body>
  8. <div></div>
  9. <canvas id="canvas" width="400" height="400"></canvas>
  10. <script src="index.js"></script>
  11. </body>
  12. </html>
展开查看全部

相关问题