如何在d3.js中选择:last-child?

vjhs03f7  于 2022-11-12  发布在  其他
关注(0)|答案(7)|浏览(216)

我需要操作轴的第一个和最后一个刻度的text元素,使它们更靠近中心。
我试图选择它们,一次一个,用svg.select('.tick:last-child text')之类的东西,但它不起作用。
我做错了什么吗?我怎么才能做到这一点?

zbq4xfa0

zbq4xfa01#

您可以通过向d3.selection.prototype添加方法来创建自定义子选择。您可以创建一个selection.first()方法来选择选择中的第一个项目,创建一个selection.last()方法来选择最后一个项目。例如:

d3.selection.prototype.first = function() {
  return d3.select(this[0][0]);
};
d3.selection.prototype.last = function() {
  var last = this.size() - 1;
  return d3.select(this[0][last]);
};

这将允许您执行以下操作:

var tickLabels = svg.selectAll('.tick text');

tickLabels.first()
  .attr('transform','translate(4,0)');
tickLabels.last()
  .attr('transform','translate(-4,0)');

当然,如果这样做的话,你需要确保你只有一个轴。否则,在你最初的选择中指定轴:

var tickLabels = svg.selectAll('.axis.x .tick text');

HERE就是一个例子。

igsr9ssn

igsr9ssn2#

以下是我找到的最干净的方法:

g.selectAll(".tick:first-of-type text").remove();
g.selectAll(".tick:last-of-type text").remove();
b1payxdu

b1payxdu3#

正如google把我带到这里,我也想给Adam Grey写的东西添加一个更干净的方法,有时候你只是想在不引用selectAll的情况下这样做。

svg.selectAll('.gridlines').filter(function(d, i,list) {
    return i === list.length - 1;
}).attr('display', 'none');

filter函数的第三个参数为您提供所选的元素列表。

j5fpnvbx

j5fpnvbx4#

d3中并不特别存在这些方法,但是可以在节点上使用.firstChild.lastChild方法。
您可以先选择节点的所有父节点,然后在.each()方法的范围内进行操作,如下所示:

d3.selectAll('.myParentElements').each(function(d,i){
  var firstChild = this.firstChild,
      lastChild = this.lastChild;

  //Do stuff with first and last child
});

.each()的范围内,this指的是单个节点,它没有被d3选择所 Package ,因此节点上的所有标准方法都可用。

ncecgwcz

ncecgwcz5#

.filter()与函数一起使用也可以 selection.filter(过滤器):

var gridlines;

gridlines = svg.selectAll('.gridlines');

gridlines.filter(function(d, i) {
  return i === gridlines.size() - 1;
}).attr('display', 'none');
oipij1gg

oipij1gg6#

它适用于D3.js v4

d3.selection.prototype.first = function() {
    return d3.select(
        this.nodes()[0]
    );
};
d3.selection.prototype.last = function() {
    return d3.select(
        this.nodes()[this.size() - 1]
    );
};

示例:

var lines = svg.selectAll('line');
   lines.first()
      .attr('transform','translate(4,0)');
   lines.last()
      .attr('transform','translate(-4,0)');
hjqgdpho

hjqgdpho7#

这是另一个例子,尽管我用了费瑞德的解决方案来解决我遇到的一个问题。

d3.select(d3.selectAll('*').nodes().reverse()[0])

相关问题