d3.js:样式 <text> 不起作用

标签 d3.js svg

所以我有一个用 d3.js 创建的图表。当我将点悬停在图表上时,我想显示带有边框和背景颜色的文本。

现在,只有没有样式的文本才会出现在悬停时,我的代码(工具提示)如下所示:

var g = svg.append("g")
    .attr("transform", "translate(" + (cfg.width/2 + cfg.margin.left) + "," + (cfg.height/2 + cfg.margin.top) + ")");

on("mouseover", function(d,i) {
    var newX =  parseFloat(d3.select(this).attr('cx')) - 10;
    var newY =  parseFloat(d3.select(this).attr('cy')) - 10;

    tooltip
       .attr('x', newX)
       .attr('y', newY)
       .text(Format(d.value))
       .transition().duration(200)
       .style('opacity', 1)    
})
.on("mouseout", function(){
    tooltip.transition().duration(200)
        .style("opacity", 0);
});

var tooltip = g.append("text")
    .attr("class", "tooltip")
    .style("opacity", 0);

当我向 .tooltip 添加样式时,它不会改变任何内容。然后,当我将 g.append("text") 更改为其他任何内容时,例如 g.append("foreignObject")g.append("div") 等,它们甚至不会出现在悬停时(它们显示在控制台元素中)。

我做错了什么?

最佳答案

这里的问题是您正在尝试将一些 HTML 样式应用到 SVG <text><g>元素,这是行不通的。

如果你想设置边框、边框半径、背景颜色等样式,你应该使用 <div>显示工具提示,这样您就可以应用任何您想要的样式,因为 div 是一个 HTML 元素。但是,有一个问题:您不能将 div 或任何其他 HTML 元素附加到 SVG。

因此,解决方案是将工具提示 div 附加到 <body> ,并用 d3.event.pageY 设置其位置和d3.event.pageX .

查看此演示,其中包含简化版本的工具提示。您可以在 CSS 中设置所有样式,但我在 D3 代码中设置样式只是为了让您了解它是如何工作的。这些样式都不适用于 SVG 文本元素:

var tooltip = d3.select("body").append("div")
    .attr("class", "tooltip")
    .style("opacity", 0);

var circle = d3.select("circle")
    .on("mousemove", function() {
        tooltip.html("Hello")
            .style("background-color", "tan")
            .style("border", "1px solid black")
            .style("padding", "2px")
            .style("top", d3.event.pageY + 10 + "px")
            .style("left", d3.event.pageX + 10 + "px")
            .style("opacity", 1);
    }).on("mouseout", function() {
        tooltip.style("opacity", 0);
    });
.tooltip {
	position: absolute
}
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg>
	<circle cx="50" cy="50" r="20" fill="teal"></circle>
</svg>

关于d3.js:样式 <text> 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41475358/

相关文章:

css - 文本和 SVG 之间没有换行符

javascript - 使用 React 将 onClick 事件添加到组元素 (svg)

SVG : Ungroup objects/remove transform from command line

d3.js - 使用 vue.js 加载远程数据时 c3.js 图表不更新

javascript - 如何让 Xcode 和 Javascript 运行良好?

javascript - Angular 和 D3.js : Why is element[0] undefined?

javascript - D3 强制布局移动树中的分支而不是节点

javascript - svg 双边框多边形

javascript - 控制在 d3.js 中对哪些数据进行排序

javascript - 如何使用 d3js javascript 将元素附加到带有 id 的 div