【问题标题】:How to create 2 svg's on one page?如何在一页上创建 2 个 svg?
【发布时间】:2017-10-19 15:43:13
【问题描述】:

我已经在这里问过一个类似的问题: How to use a svg inside a svg?

但现在我正在努力在一页上在 d3.js 中创建 2 个 svg。我想在位置 (0,0) 上有一个宽度为 900 的 svg。第二个 svg 应该是直接邻居,从位置 x = 901 开始。

var svg = d3.select("body").append("svg")
          .attr("width", 900)
          .attr("height", 900);

  var innerSVG = d3.select("body").append("svg")
      .attr("x", 901)
      .attr("y", 0)
      .attr('width',400)
      .attr('height',400);

但这并没有真正奏效。有人可以帮忙吗? 非常感谢!

【问题讨论】:

  • 您想要一个 HTML 页面中的两个 SVG 还是父 SVG 中的两个嵌套同级 SVG?
  • 这是一个非常好的问题。我可以告诉你,我希望与 2 个 svg 上的元素进行交互。这意味着,当我单击第一个 svg 中的元素时,我应该对第二个 svg 产生影响。那么这个案例的最佳解决方案是什么?

标签: javascript css d3.js svg


【解决方案1】:

xy 属性仅对内部(嵌套)SVG 有效。它们对像这样的顶级 SVG 没有影响。

如果你想在你的 HTML 页面上排列 SVG,你需要使用 CSS 来做。

默认情况下,SVG 实际上是display: inline-block,就像<img> 元素一样,所以它们通常会被排列在一起,就好像它们坐在一段文本的基线上一样。

var svg = d3.select("body").append("svg")
          .attr("width", 900)
          .attr("height", 900);

  var innerSVG = d3.select("body").append("svg")
      .attr('width',400)
      .attr('height',400);
            
svg {
  border: solid 1px blue;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

如果您的 SVG 不相邻,可能的原因是您的页面不够宽,而第二个 SVG 正在换行到下一行。您可以通过将它们放在足够宽以容纳两个 SVG 的父容器中来解决此问题。

var svg = d3.select("div").append("svg")
          .attr("width", 900)
          .attr("height", 900);

  var innerSVG = d3.select("div").append("svg")
      .attr('width',400)
      .attr('height',400);
svg {
  border: solid 1px blue;
}

div {
  width: 1305px;
  border: solid 1px green;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

<div></div>

您现在可能会想知道为什么这两个 SVG 都位于父 &lt;div&gt; 的底部。原因可以追溯到我之前所说的关于 SVG 是 inline-block 并且被定位为就像它们位于某些文本的基线上一样。

有几种方法可以解决这个问题。一种方法是制作 SVG display: block,然后让它们 float: left

var svg = d3.select("div").append("svg")
          .attr("width", 900)
          .attr("height", 900);

  var innerSVG = d3.select("div").append("svg")
      .attr('width',400)
      .attr('height',400);
svg {
  border: solid 1px blue;
  display: block;
}

svg:nth-child(1) {
  float: left;
}

div {
  width: 1305px;
  border: solid 1px green;
  overflow: auto;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

<div></div>

【讨论】:

  • 好答案,+1。我有一个关于 MDN 文档的问题:它说 SVG 默认是 inline 的(我在 my answer here 中也是如此),并且没有 inline-block。你认为哪一个是正确的? MDN 文档错了吗?
  • @GerardoFurtado 我可能夸大了它实际上 display: inline-block。然而它是一个replaced element,所以它的行为就像一个内联块。我认为将其描述为“内联”也很公平,因为它不是(默认情况下)block element
猜你喜欢
  • 2019-12-29
  • 2017-02-22
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 2011-04-30
相关资源
最近更新 更多