javascript - 如何将工具提示文本内容自动换行到多行?

标签 javascript html5-canvas chart.js

我正在使用 ChartJS生成一些图表。数据点工具提示是通过配置选项使用回调生成的:

tooltips: {
    position: 'average',
    mode: 'index',
    intersect: false,
    callbacks: {
        title: tooltipTitleCallback,
        label: tooltipLabelCallback
    }
},
回调返回一个不同长度的字符串。我的问题是 ChartJS 似乎没有提供任何方法来自动将文本换行到多行(类似于 Bootstrap 工具提示)。相反,任何不适合 1 行的文本都会被 chop 。
truncated tooltip
它确实允许回调到 return an array of strings它将由换行符分隔。目前我能想到的唯一解决方法是测量每个工具提示的长度,如果文本足够长(不响应或不理想),则将其拆分为一个数组。如果这个问题有一个简单的解决方案,我宁愿不重新制作轮子。谢谢你的帮助。

最佳答案

ChartJS 2.0 的解决方案。我们可以提供一个函数来构建 HTML 工具提示 .
Here是一些使用自定义的示例 tooltips .
我们关闭 Canvas 工具提示。enabled: false我们使用工具提示不透明度状态来显示或隐藏我们的自定义工具提示。状态在 hover 时更新事件被触发。
我们的 tooltipTitleCallbacktooltipLabelCallback函数需要根据我们传入的参数进行修改。在这个例子中,我们使用工具提示的 dataPoints 我们的属性(property)tooltipTitleCallback功能。数据属性中可用的项目由 interaction mode 决定。用过的。
Here是工具提示模型中的一些其他属性。
为了防止工具提示越过屏幕的右侧,我们设置了 right位置属性而不是 left .
工作示例

const ctx = document.getElementById("myChart").getContext("2d");

const customTooltip = {
  mode: "index",
  enabled: false,
  custom: function(model) {
    const tooltip = document.getElementById("tooltip");

    if (model.opacity === 0) {
      tooltip.style.opacity = 0;
      return;
    }

    if (model.body) {
      const title = "<strong>" + tooltipTitleCallback(model.dataPoints) + "</strong>";
      const label =
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pellentesque eros non massa consequat, ac. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pellentesque eros non massa consequat, ac. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis pellentesque eros non massa consequat, ac.";

      tooltip.innerHTML = title + "<br />" + label;

      tooltip.style.left = "auto";
      tooltip.style.right = "auto";

      const pos = this._chart.canvas.getBoundingClientRect();

      if (model.xAlign === "left") {
        tooltip.style.left = pos.left + model.caretX + "px";
      } else {
        tooltip.style.right = pos.right - model.caretX + "px";
      }

      tooltip.style.top = -50 + pos.top + model.caretY + "px";
      tooltip.style.opacity = 1;
    }
  }
};

const myChart = new Chart(ctx, {
  type: "line",
  data: {
    labels: ["January", "February", "March", "April", "May", "June", "July"],
    datasets: [{
      label: "My First dataset",
      backgroundColor: "rgb(255, 99, 132)",
      borderColor: "rgb(255, 99, 132)",
      data: [0, 10, 5, 2, 20, 30, 45],
      fill: false
    }]
  },
  options: {
    tooltips: customTooltip
  }
});

function tooltipTitleCallback(items) {
  if (items.length > 0) {
    const item = items[0];

    if (item.label) {
      return item.label;
    }

    return "No title";
  }
}
#tooltip {
  opacity: 0;
  position: absolute;
  background: rgba(0, 0, 0, 0.7);
  color: white;
  border-radius: 3px;
  -webkit-transition: all 0.1s ease;
  transition: all 0.1s ease;
  pointer-events: none;
  padding: 4px;
  margin: 15px;
  font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
  font-size: 13px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.min.js"></script>
<canvas id="myChart" width="400" height="200"></canvas>
<div id="tooltip"></div>

Codepen

关于javascript - 如何将工具提示文本内容自动换行到多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64860878/

相关文章:

javascript - Primefaces inputMask 只接受十六进制

javascript - 所有文件都使用myme text/html发送,忽略服务器node.js上的 header 函数writeHead

html - 如何保护HTML5/Canvas游戏中的代码?

javascript - 控制哪些线有点?

javascript - 使用 chart.js 和 bootstrap 调整 y 轴的长度

javascript - Chart.js - 在不使用工具提示的情况下向气泡图元素添加文本/标签?

javascript - JQuery 存储 for 循环中的值?

javascript - 检查所有图片何时上传完成?

javascript - Canvas 没有画任何东西?

html - rgba 中 alpha 值的精度