d3 can't edit children css
d3 can't edit children css
我刚开始使用d3但看起来很简单的东西让我很抓狂,基本上我用的是d3的分区图,我的想法是,当我点击一个元素时,我将把它的填充颜色改为红色,这不是问题,很简单,但我还想把它的所有后代填充颜色都改为红色。我可以访问子数据和子数据的子数据,并且只需要递归函数来更改颜色,但是我似乎无法访问与每个子元素相关的rect元素。我试过d3.select(child)。样式("填充","红色")功能,但它不起作用,我猜我做错了什么,但有人能指出我在正确的方向?
我在本地有这个,但我基本上使用相同的例子(我添加了jquery到我的解决方案)http://mbostock.github.io/d3/talk/20111018/partition.html
在这里,我使用firebug在第84行partition.html中设置了一个断点。要命中断点,我只需点击图形中的一个蓝色方框,从那里我想要的是能够选择矩形或g个元素与我点击的那个相关联。再次,我现在可以做d.children[0]来获取第一个子元素的数据,但我不知道如何访问/编辑它的css来改变它的填充颜色。
我知道我可能没有给出最好的解释,我很乐意回答任何问题或试图澄清任何困惑。分区布局
像我到目前为止使用过的所有d3布局一样,分区布局都是关于数据的-而不是DOM元素。不幸的是,就像我到目前为止使用过的所有布局一样,文档一开始就错了,陈述了完全相反的内容…
分区布局产生邻接图:节点链接树图的空间填充变体。与在层次结构中绘制父节点和子节点之间的链接不同,节点被绘制为实体区域(弧线或矩形),它们相对于其他节点的位置显示了它们在层次结构中的位置。节点的大小编码了一个难以在节点链接图中显示的定量维度。
它不这样做:)
在您链接的示例中,对分区对象的唯一引用是在容器选择的data方法中。
[59] var g = vis.selectAll("g")
[60] .data(partition.nodes(root))
布局的真正作用是…
分区布局产生一个数据结构和支持生成邻接图的方法:一个节点链接树图的空间填充变体。节点
可以与相对于其他节点显示显示显示显示显示在层次结构中的位置。节点的大小编码了一个难以在节点链接图中显示的定量维度。
你可以使用d3生成一个DOM结构的树,使用该数据结构。
我的观点是(特别是)没有节点结构-在节点之间的引用-由布局创建。这取决于你。
partition.nodes(root)
返回的对象只是js object
类型的平面数组,没有引用任何DOM元素。但是,如果确实具有丰富的状态集,可以为您提供构建DOM结构所需的所有定位信息。
选择子节点
如果你研究渲染的结构,你会注意到所有的节点在任何给定的时间都在DOM结构中;只有它们的大小和位置被调整以适应可视化。您还会注意到,子节点和父节点之间存在严格的空间关系:任何位于特定节点右侧的节点,如果其垂直位置在该节点的高度范围内,则是该节点的子节点。此外,如果您查看绑定到每个节点的数据结构,您将看到这些成员:x
y
dx
dy
。这些是节点的规范化空间特征,因此,给定所选节点的这种状态,您可以过滤DOM结构中的所有节点,以返回子节点的节点列表。
有不止一种方法来实现这个d3,但一种方法是使用selection.classed
方法…
function hover(dActive){
var x0 = dActive.x, y0 = dActive.y,
x1 = x0 + dActive.dx, y1 = dActive.dy;
g.classed("highlighted", function(d){
return (d.y > y0) && (d.x >= x0) && (d.x < x1)
})
}
下面是该示例的修改版本,使用上述策略,在悬停时突出显示子节点…
var w = 600, //1120,
h = 200, //600,
x = d3.scale.linear().range([0, w]),
y = d3.scale.linear().range([0, h]);
var vis = d3.select("body").append("div")
.attr("class", "chart")
.style("width", w + "px")
.style("height", h + "px")
.append("svg:svg")
.attr("width", w)
.attr("height", h);
var partition = d3.layout.partition()
.value(function(d) { return d.size; });
d3.json("https://rawgit.com/cool-Blue/SO-Questions/master/partition/flare.json", function(root) {
var g = vis.selectAll("g")
.data(partition.nodes(root))
.enter().append("svg:g")
.attr("transform", function(d) { return "translate(" + x(d.y) + "," + y(d.x) + ")"; })
.on("click", click)
.on("mouseover", hover)
.on("mouseout", function(){g.classed("highlighted", false)});
var kx = w / root.dx,
ky = h / 1;
g.append("svg:rect")
.attr("width", root.dy * kx)
.attr("height", function(d) { return d.dx * ky; })
.attr("class", function(d) {
return d.children ? "parent" : "child";
});
g.append("svg:text")
.attr("transform", transform)
.attr("dy", ".35em")
.style("opacity", function(d) { return d.dx * ky > 12 ? 1 : 0; })
.text(function(d) { return d.name; })
d3.select(window)
.on("click", function() { click(root); })
function click(d) {
if(!d.children) return;
kx = (d.y ? w - 40 : w) / (1 - d.y);
ky = h / d.dx;
x.domain([d.y, 1]).range([d.y ? 40 : 0, w]);
y.domain([d.x, d.x + d.dx]);
var t = g.transition()
.duration(d3.event.altKey ? 7500 : 750)
.attr("transform", function(d) { return "translate(" + x(d.y) + "," + y(d.x) + ")"; });
t.select("rect")
.attr("width", d.dy * kx)
.attr("height", function(d) { return d.dx * ky; });
t.select("text")
.attr("transform", transform)
.style("opacity", function(d) { return d.dx * ky > 12 ? 1 : 0; });
d3.event.stopPropagation();
}
function hover(dActive){
var x0 = dActive.x, y0 = dActive.y,
x1 = x0 + dActive.dx, y1 = dActive.dy;
g.classed("highlighted", function(d){
return (d.y > y0) && (d.x >= x0) && (d.x < x1)
})
}
function transform(d) {
return "translate(8," + d.dx * ky / 2 + ")";
}
});
body {margin: 0;}
.chart {
display: block;
margin: auto;
margin-top: 0;
font-size: 11px;
}
rect {
stroke: #eee;
fill: #aaa;
fill-opacity: .3;
}
rect.parent {
cursor: pointer;
fill: steelblue;
}
text {
pointer-events: none;
}
.highlighted rect {
/*outline: 1px solid red;*/
fill-opacity: 1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js"></script>
- jquery UI draggable:UI.children不是一个函数
- React.cloneElement:传递新的孩子或复制props.children
- 如何通过使用jQuery单击该DIV来获取children DIV类名
- Angular UI Grid Edit可以与“;控制器为“;语法
- Jquery Children's child element
- 在JQuery中使用parent()和children()方法的缺点
- Angular edit by clicking on a tr
- jquery children选择器没有'不起作用
- jQuery/Javascript Button Text Change (EDIT!)
- Three.js将映射分配给object.children[0]会更改整个object's地图
- Javascript getdate and edit
- 针对此.props.children的特定子项
- .children()不适用于jquery返回的指定索引
- 如何计算“children's的身高不合适
- Jquery.children()未按预期工作
- A d3.select... equivalent to jQuery.children()
- jQuery的.children()方法返回'undefined'
- j查询冲突!在WordPress的POST EDIT页面上显示白屏
- Javascript - 确定对 Element.children 功能的支持
- d3 can't edit children css