javascript - 如何向加载到 D3.js 的外部 SVG 添加缩放 + 拖动行为?

标签 javascript html xml d3.js svg

我想要做的是将现有的 SVG(XML 格式)加载到 D3 中。

它工作得很好,直到我开始向 SVG 添加缩放 + 拖动行为。

实际上添加行为似乎可行,但是当我拖动 SVG 中的对象时,会出现奇怪的跳跃(或闪烁)。一次缩放后情况会变得更糟,然后对象移动得比应有的要多得多。

我想您在尝试代码示例后就会立即明白我的意思。

如何让“缩放 + 拖动”发挥应有的作用?

提前致谢

var main_chart_svg = document.body;

d3.xml("https://upload.wikimedia.org/wikipedia/commons/a/a0/Circle_-_black_simple.svg", function(error, documentFragment) {
        if (error) {console.log(error); return;}
    
        var svgNode = documentFragment
                    .getElementsByTagName("svg")[0];
    
        main_chart_svg.appendChild(svgNode);
        
        d3.selectAll('circle').style('fill', 'green'); //only in order to show, that selections work

        //this is where my problem happens
        d3.select('svg').call(d3.zoom().on("zoom", function () {
          d3.select('svg').attr("transform", d3.event.transform)
        }));
    });
<script src="https://d3js.org/d3.v4.min.js"></script>

最佳答案

您正在对 svg 元素执行缩放/平移转换。它通常应用于包含您要缩放的内容的 g 元素。要使用 g,在您的情况下,您需要将此元素插入到现有的 svg 中:

<!DOCTYPE html>
<html>

<head>
  <script data-require="d3@4.0.0" data-semver="4.0.0" src="https://d3js.org/d3.v4.min.js"></script>
</head>

<body>
  <script>
    var main_chart_svg = document.body;

    d3.xml("https://upload.wikimedia.org/wikipedia/commons/a/a0/Circle_-_black_simple.svg", function(error, documentFragment) {
      if (error) {
        console.log(error);
        return;
      }

      var svgNode = documentFragment
        .getElementsByTagName("svg")[0];

      main_chart_svg.appendChild(svgNode);

      var svg = d3.select('svg'),
        g = svg.append('g');

      g.node().appendChild(svg.select('circle').node());

      d3.selectAll('circle').style('fill', 'green'); //only in order to show, that selections work

      //this is where my problem happens
      d3.select('svg').call(d3.zoom().on("zoom", function() {
        g.attr("transform", d3.event.transform)
      }));
    });
  </script>
</body>

</html>

或者,如果您不想这样做,您可以直接将缩放应用于圆圈:

<!DOCTYPE html>
<html>

<head>
  <script data-require="d3@4.0.0" data-semver="4.0.0" src="https://d3js.org/d3.v4.min.js"></script>
</head>

<body>
  <script>
    var main_chart_svg = document.body;

    d3.xml("https://upload.wikimedia.org/wikipedia/commons/a/a0/Circle_-_black_simple.svg", function(error, documentFragment) {
      if (error) {
        console.log(error);
        return;
      }

      var svgNode = documentFragment
        .getElementsByTagName("svg")[0];

      main_chart_svg.appendChild(svgNode);

      var svg = d3.select('svg'),
        c = d3.select('circle');


      c.style('fill', 'green'); //only in order to show, that selections work

      //this is where my problem happens
      d3.select('svg').call(d3.zoom().on("zoom", function() {
        c.attr("transform", d3.event.transform)
      }));
    });
  </script>
</body>

</html>

关于javascript - 如何向加载到 D3.js 的外部 SVG 添加缩放 + 拖动行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48479297/

相关文章:

javascript - Uncaught ReferenceError : jQuery is not defined even working on console

javascript - 新添加行的数据表分页

android - 在主页上重置 html 中的历史记录?

c# - 使用 LINQ 选择随机 XML 节点

JavaScript 输入意外结束并带有中断

javascript - 无法使模式下的Youtube视频停止在IE和Chrome中播放

javascript - 使用 Javascript 或 jQuery 将文件保存到源目录而不使用 PHP?

html - 如何自动将我的网站翻译成用户的语言?

java - 将 XML 文件与其他 PDF 文件一起附加在 zip 文件中

xml - XSLT 总结值