如何在 p5JS 中创建鼠标悬停时的工具提示?

How can I create a tooltip on mouse over in p5JS?

我已经开始玩 P5JS,但我想在鼠标悬停在每个数据点上时创建一个工具提示。

我该怎么做?我看过一些使用 map 函数的示例,但不确定它在这里如何工作。

感谢任何帮助!我还不是 JS 开发者!

一般来说,显示特定于显示在 canvas 上的图形的工具提示涉及“命中测试”,也就是说:检查鼠标是否悬停在特定图形上,然后使用某种机制来显示工具提示。

由于你的图形都是圆圈,命中测试很简单。对于您绘制的每个圆,检查到鼠标位置的距离。如果距离小于圆的半径而不是鼠标悬停在该圆上:

let mouseDist = dist(posX, posY, mouseX, mouseY);
if (mouseDist < earthquakeMag * 5) {
  // display tooltip, or set a flag to display the
  // tooltip after the rest of the graphics have been
  // displayed
}

至于显示工具提示,您有两种选择:1) 您可以通过设置 canvas 元素的 title 属性来依赖浏览器元素的本机行为,或者 2) 您可以显示您自己的工具提示。前者的优点是非常琐碎,而后者的优点是你可以更好地控制where/when/how tooltip 的渲染。

选项 1:

let c;

function setup() {
  c = createCanvas(500,500);
  // ...
}

function draw() {
  // ...
  for (var i = 0; i < this.data.getRowCount(); i++) {
    // ...

    let mouseDist = dist(posX, posY, mouseX, mouseY);
    if (mouseDist < earthquakeMag * 5) {
      c.elt.title = 'hit!';
    }
  }
}

选项 2:

  let tooltipText;

  for (var i = 0; i < this.data.getRowCount(); i++) {
    // ...
    
    let mouseDist = dist(posX, posY, mouseX, mouseY);
    if (mouseDist < earthquakeMag * 5) {
      // If we displayed the tooltip at this point then
      // some of the circles would overlap it.
      tooltipText = date_[i];
    }

    // ...
  }
  
  if (tooltipText) {
    // measure the width of the tooltip
    let w = textWidth(tooltipText);

    // save the current fill/stroke/textAlign state
    push();

    // draw a lightgray rectangle with a dimgray border
    fill('lightgray');
    stroke('dimgray');
    strokeWeight(1);
    // draw this rectangle slightly below and to the
    // right of the mouse
    rect(mouseX + 10, mouseY + 10, w + 20, 24, 4);
    textAlign(LEFT, TOP);
    noStroke();
    fill('black');
    text(tooltipText, mouseX + 20, mouseY + 16);

    // restore the previous fill/stroke/textAlign state
    pop();
  }