我是 D3.js 的新手,正在关注 tutorial .
我很困惑为什么下面的circle.style("fill", "steelblue"); 没有生效;但如果将样式行放在 circle.enter().append("circle") 行之后,它可以为所有圆圈填充颜色。以我的理解,样式是全局的,应该应用于所有圈子,或者至少在以下代码中影响html中的现有圈子。
//js
var svg = d3.select("svg");
var circle = svg.selectAll("circle").data([32, 57, 112, 293], function(d) { return d; });
circle.style("fill", "steelblue");
circle.enter().append("circle")
.attr("cy", 60)
.attr("cx", function(d, i) { return i * 100 + 30; })
.attr("r", function(d) { return Math.sqrt(d); });
circle.exit().remove();
//html
<svg width="720" height="120">
<circle cx="40" cy="60" r="10"></circle>
<circle cx="80" cy="60" r="10"></circle>
<circle cx="120" cy="60" r="10"></circle>
</svg>
谢谢!
最佳答案
代码第一次运行时,圆圈选择的大小为零,因为没有与键匹配的元素。所有圆形元素都将放入退出选择中。 data
方法返回最初为空的更新选择,它的(第二维)长度等于传递给 .data
的第一个参数的第一维的长度,但选择的每个元素都是 null
。直到执行 enter 方法,才会创建新节点,并合并 enter 和 update 选择。
如果代码再次运行,例如将一个数据元素替换为一个新值,则三个匹配的节点将被放置在更新选择中,并将由 .data
返回。不匹配的将被放置在退出选择中,其在更新选择中的旧位置将被设置为空。一个附加了新数据元素的占位符对象将被放置在输入选择中,该选择将以对 .append
之后新创建节点的引用结束,并将合并到更新选择中通过 .enter
。
如果你不使用键函数,那么,第一次,三个现有节点将在更新选择中,连同一个空值,一个占位符将被放入输入选择中并附加数据(with在这种情况下值为 293)。退出选择将为空(长度为 0),并且将创建一个新节点并将其添加到输入选择中,并绑定(bind)新的数据元素。此时,更新选择 (circle
) 会将输入选择与其合并。它是空条目,已被绑定(bind)了新数据的新节点替换。这是调用 .enter
的副作用。
但是,如果您随后再次调用代码,更改数据元素的顺序(仍然使用相同的一组值,但都位于数组中的不同位置),则退出和进入选择将为空,但是绑定(bind)到所有节点的数据值将被更改。如果您在这种情况下使用 key ,则什么都不会改变。
关于javascript - D3.js 中的样式和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32169121/