【问题标题】:How do I move tooltip text on a link?如何在链接上移动工具提示文本?
【发布时间】:2021-04-09 07:23:05
【问题描述】:

我是 D3 的初学者。 目前我正在研究一个没有强制力的网络图。现在我在将鼠标悬停在链接上时显示工具提示有问题。显示所需的文本,但始终位于左上角。

到目前为止,我是这样创建链接的:


        rect.data.links = [
            {"source":0,"target":1, "distance":100, "weight": 4, "color" : "black"},
            {"source":1,"target":2, "distance":100, "weight": 12, "color" : "black"},
            {"source":1,"target":3, "distance":100, "weight": 4, "color" : "black"},
            {"source":2,"target":0, "distance": 100, "weight": 9, "color" : "black"},
            {"source":2,"target":4, "distance": 100, "weight": 6, "color" : "black"},
            {"source":0,"target":4, "distance": 100, "weight": 12, "color" : "black"},
            {"source":3,"target":0, "distance": 100, "weight": 12, "color" : "black"},
            {"source":3,"target":2, "distance": 100, "weight": 9, "color" : "black"}

        ];

        // Initialize the links
        var links = rect.svg
            .selectAll("line")
            .data(rect.data.links)
            .enter()
            .append("svg:g")
            .attr("class", "link");

        links
            .append("line")
            .attr("x1", function(l) {
                var sourceNode = rect.data.nodes.filter(function(d, i) {
                    return i == l.source
                })[0];
                d3.select(this).attr("y1", sourceNode.y);
                return sourceNode.x
            })
            .attr("x2", function(l) {
                var targetNode = rect.data.nodes.filter(function(d, i) {
                    return i == l.target
                })[0];
                d3.select(this).attr("y2", targetNode.y);
                return targetNode.x
            })
            .style('stroke', function (d) {
                return d.color;
                }
            )
            .style('stroke-width', function(d) {
                return Math.sqrt(d.weight);
            })
            .on("mouseover", function() {
                return tooltip_links.style("visibility", "visible");})
            .on("mouseout", function() {
                return tooltip_links.style("visibility", "hidden");
            });


        // create a tooltip with keywords
        var keywords = links
        .append("foreignObject")
            .data(rect.data.links)
            .attr("width", "170px")
            .attr("height", "75px")
            .attr("x", d => ((d.source.x + d.target.x) / 2))
            .attr("y", d => ((d.source.y + d.target.y) / 2));


        // create a tooltip
        var tooltip_links = keywords
            .append("xhtml:div")
            .style("position", "absolute")
            .style("visibility", "visible")
            .text("Lorem ipsum");



这是一个小提琴:https://jsfiddle.net/9facu458/

如何强制链接工具提示出现在链接上?

【问题讨论】:

  • 编辑:没有一个能正常工作,所以我选择使用 vis.js。

标签: javascript d3.js text hyperlink tooltip


【解决方案1】:

你可以试试这个(适用于 D3 v3/v4):

tooltip_links
  .style('left', `${d3.event.offsetX}px`)
  .style('top', `${d3.event.offsetY}px`)
  .style('visibility', 'visible');

请注意,您的小提琴总是卡住,请修复它。

更新:对于 D3 v6,使用:

tooltip_links
  .style('left', e => `${e.offsetX}px`)
  .style('top', e => `${e.offsetY}px`)
  .style('visibility', 'visible');

【讨论】:

  • 谢谢,但这给了我一个错误:Uncaught TypeError: Cannot read property 'offsetX' of null Uncaught TypeError: Cannot read property 'offsetY' of null
  • 您使用哪个版本的 d3?你有 import * as d3 from 'd3' 吗?
  • 我用的是v3,从d3js.org/d3.v6.min.js导入的,好像v3没有“事件”之类的东西?我应该使用更新版本的 D3 吗?编辑:我现在选择使用 v6,仍然无法正常工作。
  • 你肯定用的是最新的 v6 (v6.min.js)。获取答案的更新部分,如果有帮助,请将其标记为正确
  • 它没有帮助,当鼠标悬停在任何链接上时,文本仍然卡在左上角。您能否解释一下更新答案中 e 的含义?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多