You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

D3.js技术问题:如何为热力图单个rect元素添加鼠标悬停stroke样式

解决D3热力图rect鼠标悬停样式问题
  • 你的核心问题是事件参数使用错误:在D3 v6及以后版本中,mouseover回调的第一个参数e是事件对象而非DOM元素,直接调用e.attr()肯定无效。要获取当前触发事件的rect元素,得用d3.select(e.currentTarget)。

  • 另外之前无法选中rect,大概率是因为rect没设置fill属性——如果fill为none,SVG元素不会响应鼠标事件,哪怕视觉上能看到它。可以给rect加个透明填充确保可交互。

修正后的完整代码示例:

svg.selectAll('rect')
  .data(mv)
  .enter()
  .append('rect')
  .attr('width', (w - 2*padding)/(mv.length/12))
  .attr('height', (h - 2*padding)/12)
  .attr('x', d => xScale(d.year))
  .attr('y', d => yMap(d.month))
  .attr('fill', 'transparent') // 确保元素能接收鼠标事件,可根据热力图需求替换为实际颜色
  .on('mouseover', (e, d) => {
    // 选中当前rect并设置stroke样式
    d3.select(e.currentTarget)
      .attr('stroke', 'black')
      .attr('stroke-width', 2);
    // 这里可以保留你之前的提示框逻辑
  })
  .on('mouseout', (e, d) => {
    // 鼠标移开后恢复原样式
    d3.select(e.currentTarget)
      .attr('stroke', 'none')
      .attr('stroke-width', 0);
  });
  • 如果你用的是D3 v5及更早版本,参数顺序是反过来的(第一个是数据d,第二个是事件e),那获取元素要改成(d, i, nodes) => d3.select(nodes[i]),不过现在主流都是v6+版本,优先用上面的写法。

内容的提问来源于stack exchange,提问作者u-lx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:02:37