我需要操作轴的第一个和最后一个刻度的text元素,使它们更靠近中心。我试图选择它们,一次一个,用svg.select('.tick:last-child text')之类的东西,但它不起作用。我做错了什么吗?我怎么才能做到这一点?
text
svg.select('.tick:last-child text')
zbq4xfa01#
您可以通过向d3.selection.prototype添加方法来创建自定义子选择。您可以创建一个selection.first()方法来选择选择中的第一个项目,创建一个selection.last()方法来选择最后一个项目。例如:
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就是一个例子。
igsr9ssn2#
以下是我找到的最干净的方法:
g.selectAll(".tick:first-of-type text").remove(); g.selectAll(".tick:last-of-type text").remove();
b1payxdu3#
正如google把我带到这里,我也想给Adam Grey写的东西添加一个更干净的方法,有时候你只是想在不引用selectAll的情况下这样做。
svg.selectAll('.gridlines').filter(function(d, i,list) { return i === list.length - 1; }).attr('display', 'none');
filter函数的第三个参数为您提供所选的元素列表。
j5fpnvbx4#
d3中并不特别存在这些方法,但是可以在节点上使用.firstChild和.lastChild方法。您可以先选择节点的所有父节点,然后在.each()方法的范围内进行操作,如下所示:
.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 ,因此节点上的所有标准方法都可用。
this
ncecgwcz5#
将.filter()与函数一起使用也可以 selection.filter(过滤器):
.filter()
var gridlines; gridlines = svg.selectAll('.gridlines'); gridlines.filter(function(d, i) { return i === gridlines.size() - 1; }).attr('display', 'none');
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)');
hjqgdpho7#
这是另一个例子,尽管我用了费瑞德的解决方案来解决我遇到的一个问题。
d3.select(d3.selectAll('*').nodes().reverse()[0])
7条答案
按热度按时间zbq4xfa01#
您可以通过向
d3.selection.prototype
添加方法来创建自定义子选择。您可以创建一个selection.first()
方法来选择选择中的第一个项目,创建一个selection.last()
方法来选择最后一个项目。例如:这将允许您执行以下操作:
当然,如果这样做的话,你需要确保你只有一个轴。否则,在你最初的选择中指定轴:
HERE就是一个例子。
igsr9ssn2#
以下是我找到的最干净的方法:
b1payxdu3#
正如google把我带到这里,我也想给Adam Grey写的东西添加一个更干净的方法,有时候你只是想在不引用selectAll的情况下这样做。
filter函数的第三个参数为您提供所选的元素列表。
j5fpnvbx4#
d3中并不特别存在这些方法,但是可以在节点上使用
.firstChild
和.lastChild
方法。您可以先选择节点的所有父节点,然后在
.each()
方法的范围内进行操作,如下所示:在
.each()
的范围内,this
指的是单个节点,它没有被d3选择所 Package ,因此节点上的所有标准方法都可用。ncecgwcz5#
将
.filter()
与函数一起使用也可以 selection.filter(过滤器):oipij1gg6#
它适用于D3.js v4
示例:
hjqgdpho7#
这是另一个例子,尽管我用了费瑞德的解决方案来解决我遇到的一个问题。