代码之家  ›  专栏  ›  技术社区  ›  tic

整合D3中的连续翻译

  •  1
  • tic  · 技术社区  · 6 年前

    以下玩具代码( jsfiddle here )写入控制台日志 translate(20,0) translate(20,0) translate(20,0) translate(20,0) translate(20,0) 有没有可能 translate(100,0) 作为“合并”翻译?

    var svg = d3.select('svg');
    
    var rec=svg.append("rect")
        .attr("width",20)
        .attr("height", 20)
        .attr("x", 0)
        .attr("y", 20)
        .attr("fill","#00ffff")
        .attr("transform","")
        ;
       for (var i=0;i<10;i++) {
       rec
       .attr("transform",rec.attr("transform")+" translate(20,0)")
       ;
       }
       console.log(rec.attr("transform"))
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Gerardo Furtado    6 年前

    首先,我相信你想 translate(200,0) 结果,不是 translate(100,0) ,因为有10个循环。

    20 到第一个 0 到第二个。否则,您将像现在这样连接字符串。

    不幸的是,在d3v4/v5中没有本机方法来获取转换值,因此我将使用中提供的函数 this answer ,稍加修改 if "" ):

    function getTranslation(transform) {
      if (transform === "") {
        return [0, 0]
      };
      var g = document.createElementNS("http://www.w3.org/2000/svg", "g");
      g.setAttributeNS(null, "transform", transform);
      var matrix = g.transform.baseVal.consolidate().matrix;
      return [matrix.e, matrix.f];
    }
    

    所以,你所需要的就是得到当前的translate并在你的文件中添加你想要的值 for 回路:

    for (var i = 0; i < 10; i++) {
      var currentTransform = getTranslation(rec.attr("transform"));
      rec.attr("transform", "translate(" + (currentTransform[0] + 20) + ",0)");
    }
    

    演示如下:

    var svg = d3.select('svg');
    
    var rec = svg.append("rect")
      .attr("width", 20)
      .attr("height", 20)
      .attr("x", 0)
      .attr("y", 20)
      .attr("fill", "#00ffff")
      .attr("transform", "");
    
    for (var i = 0; i < 10; i++) {
      var currentTransform = getTranslation(rec.attr("transform"));
      rec.attr("transform", "translate(" + (currentTransform[0] + 20) + ",0)");
    }
    
    console.log(rec.attr("transform"))
    
    function getTranslation(transform) {
      if (transform === "") {
        return [0, 0]
      };
      var g = document.createElementNS("http://www.w3.org/2000/svg", "g");
      g.setAttributeNS(null, "transform", transform);
      var matrix = g.transform.baseVal.consolidate().matrix;
      return [matrix.e, matrix.f];
    }
    <script src="https://d3js.org/d3.v5.min.js"></script>
    <svg></svg>