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

将平移位置设置为新的x、y位置

  •  1
  • tic  · 技术社区  · 6 年前
    var rec=svg.append("rect")
        .attr("width",30)
        .attr("height", 30)
        .attr("x", 10)
        .attr("y", 20)
        .attr("fill","#00ffff");
    
    rec.attr("transform"," translate(50,10)");
    

    是否有自动方法将转换位置(60,30)设置为新的未转换位置?(也就是说,要将translate参数添加到x和y属性,请将其转换为以前的值,同时将transform属性设置为null)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gerardo Furtado    6 年前

    我已经在你的报告里解释过了 previous question 在d3v4/v5中,没有本地方法可以轻松地获取元素的转换值。但是,正如在那个问题中一样,我将使用中提供的函数 this answer 要获取这些值:

    function getTranslation(transform) {
      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];
    }
    

    有了它,就只需要获得所有的价值( x , y , transform y 转型 null

    function setTranslated(element) {
      var currentTranslation = getTranslation(element.attr("transform"));
      element.attr("x", +element.attr("x") + currentTranslation[0]);
      element.attr("y", +element.attr("y") + currentTranslation[1]);
      element.attr("transform", null)
    }
    

    演示如下:

    var svg = d3.select('svg');
    
    var rec = svg.append("rect")
      .attr("width", 30)
      .attr("height", 30)
      .attr("x", 10)
      .attr("y", 20)
      .attr("fill", "#00ffff");
    
    rec.attr("transform", "translate(50,10)");
    
    setTranslated(rec)
    
    function setTranslated(element) {
      var currentTranslation = getTranslation(element.attr("transform"));
      element.attr("x", +element.attr("x") + currentTranslation[0]);
      element.attr("y", +element.attr("y") + currentTranslation[1]);
      element.attr("transform", null)
    }
    
    function getTranslation(transform) {
      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>

    如果你检查矩形,你会看到类似的东西:

    <rect width="30" height="30" x="60" y="30" fill="#00ffff"></rect>