【问题标题】:D3, retrieve the x position of a <g> element and apply multiple transformD3,检索 <g> 元素的 x 位置并应用多重变换
【发布时间】:2014-06-10 03:15:06
【问题描述】:

使用 D3.js,我想从组的当前位置开始多次转换 groupx(例如,通过单击按钮 a 导致每次点击都发生转换)。问题是我无法检索组的 x,即使我找到它,我也找不到任何内置函数可以让我更改组的 x 从它当前的x。我错过了什么重要的东西吗?很奇怪,我无法获得添加到 SVG“舞台”的元素的 x

我的代码如下(为 Lars 编辑):我按照您昨天建议的方式创建了节点(克隆它们)。

var m=[5,10,15,20,25,30];

var count=0;

d3.select('svg').on("mouseup", function(d, i){

     count+=0.5;

     var n = d3.selectAll(".myGroup");

     n.each(function(d,i) {

        if(i!=0){
            // here I need to know the current x of the current n element but I 
            // can't get it
            // this causes error "Uncaught TypeError: undefined is not a function"
            // var currentx = d3.transform(this.attr("transform")).translate[0];

            this.setAttribute("transform", "translate("+((100/m[i])*count)+",10)");

        }

     });

});

【问题讨论】:

    标签: svg d3.js transform


    【解决方案1】:

    获取和更改g 元素的位置相对简单。比如这样:

    var g = d3.select("#myG");
    
    // get x position
    var currentx = d3.transform(g.attr("transform")).translate[0];
    
    // set x position
    g.attr("transform", "translate(" + (currentx + 100) + ",0)");
    

    编辑:

    如果你有一个原始的 DOM 元素,请先用 D3 选择它:

    var currentx = d3.transform(d3.select(this).attr("transform")).translate[0];
    

    【讨论】:

    • 嗨 Lars,我更新了问题以试图更好地解释事情。
    • Lars,非常感谢:我认为d3.selectAll(".myGroup") 导致循环体内部thisd3.select(this) 的结果相同
    • 是否可以使用.style() 获得转换翻译集?我需要匹配 Leaflet CSS 中的动画集,并且使用 .translate() 动画不同步。
    • 是的。使用.style("transform")
    • D3v4 "d3.transform 方法已被移除。" github.com/d3/d3/blob/master/CHANGES.md
    猜你喜欢
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    相关资源
    最近更新 更多