【问题标题】:Put 2 svg side by side将 2 个 svg 并排放置
【发布时间】:2017-10-19 18:44:36
【问题描述】:

我可以在 d3.js 的一个屏幕上使用 2 个 svg。代码看起来像这样,效果很好:

<svg width="880" height="800" id="svg1"></svg>  
<svg width="880" height="800" id="svg2"></svg>

var svg1 = d3.select("#svg1");

var svg2 = d3.select("#svg2");

我唯一的问题是,svg2 出现在 svg1 下。但我的目标是将它们并排放置。你们知道如何解决这个问题吗?我试图用这段代码操纵 svg2 的 x 位置:

<svg cx="880" cy"100" width="880" height="800" id="svg2"></svg>

但这不是正确的解决方案。 谢谢大家!!

【问题讨论】:

  • 有很多方法可以将它们并排移动,但要让你的 SVG “响应式”,你需要用视图框替换宽度和高度属性。
  • 默认情况下 SVG 将并排放置,您不必定义 viewBox 或任何东西,但前提是它们有足够的空间。在这里查看我的答案:stackoverflow.com/a/39178944/5768908。您的窗口宽度可能没有 1760 像素。
  • 默认 svg 是一个块元素。使它们内联块并排显示
  • 我不明白为什么上面的评论有 2 个“赞成票”... SVG 默认是内联的:developer.mozilla.org/en-US/docs/Web/SVG/Attribute/display 同样,这在我的链接答案中非常清楚。
  • 您需要专门使父容器足够宽以将它们并排放置。 See my answer to this question.

标签: javascript html css d3.js svg


【解决方案1】:

在 HTML 中,svg&gt; 元素默认显示 inline,这意味着您无需执行任何操作即可并排显示它们。

这是一个小演示来证明它:

var svg = d3.select("body")
  .selectAll("feynman")
  .data([0,1])
  .enter()
  .append("svg")
  .attr("width", 100)
  .attr("height", 100)
  .style("background-color", function(d){ 
    return d? "blue" : "orange";
  });
&lt;script src="https://d3js.org/d3.v4.min.js"&gt;&lt;/script&gt;

你的问题是宽度:因为每个 SVG 有 880px 宽,你需要一个至少 1780px 的窗口才能并排看到它们。

另一种方法是将两个 SVG 放在宽度大于 1760 像素的 &lt;div&gt; 中(正如 LeBeau 解释的 in his answer here),这将在底部创建一个滚动条:

<div style="width:1770px">
  <svg width="880" height="160" id="svg1" style="background-color:blue"></svg>
  <svg width="880" height="160" id="svg2" style="background-color:orange">></svg>
</div>

你也可以玩overflowoverflow-x

【讨论】:

  • 这很有趣,因为我找不到明确说明这一点的规范。我很确定默认情况下 SVG 会被视为块元素,但是,为了证明你错了,我找不到任何支持这两者的参考,比如 假设。您是否知道这样的引用,或者您知道默认值是如何隐式派生的?
  • 我已经读过好几次(不幸的是我现在不记得这些网站了)SVG 默认是内联的,所以现在我知道这一点心知肚明。在我在对该问题的评论中分享的 MDN 链接中,inline 以粗体显示,我假设这是他们用来指定默认值的方式。 his answer 的 LeBeau 也说了同样的话。
  • 另外,根据 Amelia Bellamy-Royds 的说法,他写了一本关于 SVG 的书,SVG 默认是内联的:stackoverflow.com/a/33746702/5768908 无论如何,我们可以通过运行 sn-p 来简单地检查这一点:它们的行为类似于内联(或内联块),但不是作为块。
  • HTML中的SVG默认是内联的,与imgobject等一致。我不知道它是在任何地方指定的(它在 HTML、CSS 和 SVG 规范之间有点丢失)。但是inlinedisplay 的初始值,用于没有指定其他值的any 元素。对于CSS scaling,SVG 应被视为可能具有固有大小和/或纵横比的“对象”。这也意味着display: inline 的行为类似于inline-block
  • 我认为许多人认为 SVG 默认为 display: block 的原因是,如果你给 SVG 一个 viewBox 但没有宽度/高度,所有现代浏览器都会将它拉伸到完整容器宽度。所以即使它在技术上仍然是一个内联对象,它看起来就像是块状的,因为它在布局中占据了整行。
猜你喜欢
  • 1970-01-01
  • 2021-07-17
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 2015-08-10
  • 2012-11-01
相关资源
最近更新 更多