【问题标题】:Cant get a SVG path to fit into SVG Box无法获得适合 SVG 框的 SVG 路径
【发布时间】:2013-11-12 08:20:35
【问题描述】:

我一直试图让一个 SVG 路径出现在我的 SVG 矩形的中间,它填充了整个 svg 元素。到目前为止,我已经尝试了以下方法,但无济于事

  1. 将路径元素放在<g> 标记中,并根据我从elementgetBBox() 获得的值转换组。我会使用这些值和整个 SVG 框的值来尝试获得正确的数字来缩小元素,但它仍然不适合,也没有居中
  2. 与#1 做同样的事情,但使用嵌套的<svg> 标签而不是<g> 标签。
  3. 试图转换元素本身。

我遇到的主要问题是:

  • 我似乎找不到将路径元素动态匹配到正方形上的方法
  • 路径元素似乎出于某种原因挂在右侧。我想让它与顶部和左侧齐平

我有一个jsfiddle of the svg that I'm trying to work with,如果有帮助的话。

【问题讨论】:

  • 通过扩大 SVG 画布来修复它以在 SVG 中居中路径很容易——将 height 和 width 属性设置为 600 是否有效? jsfiddle.net/remus/epTp9/1 但是进入动态领域后,如果您希望它相应地调整大小,您将不得不在 path 计算中使用某种变量。
  • @r3mus 如果我这样做,那么图像会显得很大

标签: javascript jquery html css svg


【解决方案1】:

如果你给矩形你想要一个“矩形”的 id,那么这将使星形适合矩形:

var rectBBox = rect.getBBox();
var path = document.getElementById("star-2-outline");
var pathBBox = path.getBBox();

var scaleX = rectBBox.width / pathBBox.width;
var scaleY = rectBBox.height / pathBBox.height;
var translateX = rectBBox.x - pathBBox.x;
var translateY = rectBBox.y - pathBBox.y;

path.setAttribute("transform", "scale(" + scaleX + ", " + scaleY + ") translate(" + translateX + ", " + translateY + ")");

【讨论】:

【解决方案2】:

对于方法#2,如果路径的边界不是很明显(您使用的是相对路径命令,那么您的不是),只需尝试使用 viewBox 直到找到正确的边界。对于你的星星,结果是 (50,55 - 460,455)。

<svg viewBox='0 0 350 200' height='200' width='350' xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <rect width="350" height="200" x="0" y="0" fill="#126d62"></rect>

    <svg  width="350" height="200" x="0" y="0" viewBox="50 55 410 400">
       <path id="star-2-outline" d="M256,128.858l42.98,88.667l97.61,13.478l-71.047,68.278l17.346,96.996L256,349.809l-86.89,46.469l17.346-96.996l-71.047-68.278l97.61-13.478L256,128.858z M256,60.082l-62.978,129.92L49.999,209.75L154.1,309.793l-25.415,142.125L256,383.828l127.315,68.09L357.9,309.793L462.001,209.75l-143.023-19.748L256,60.082z" class="flag-icon" ></path>
      </svg>

</svg>

http://jsfiddle.net/epTp9/4/

对于方法 #3,只需找到正确的比例,然后将其转换到正确的位置。

<svg viewBox='0 0 350 200' height='200' width='350' xmlns="http://www.w3.org/2000/svg" 
  xmlns:xlink="http://www.w3.org/1999/xlink">
    <rect width="350" height="200" x="0" y="0" fill="#126d62"></rect>

    <path id="star-2-outline" d="M256,128.858l42.98,88.667l97.61,13.478l-71.047,68.278l17.346,96.996L256,349.809l-86.89,46.469l17.346-96.996l-71.047-68.278l97.61-13.478L256,128.858z M256,60.082l-62.978,129.92L49.999,209.75L154.1,309.793l-25.415,142.125L256,383.828l127.315,68.09L357.9,309.793L462.001,209.75l-143.023-19.748L256,60.082z" class="flag-icon"
          transform="scale(0.5) translate(90 -55) "></path>

</svg>

http://jsfiddle.net/epTp9/5/

【讨论】:

  • 这行得通,但它不是很好地居中。使用我正在制作的应用程序,有时背景图像会被分成两半,并且在这种情况下图像看起来会消失Here's a fiddle of what it looks like with 2 colors
  • 这只是意味着我的转换有点偏离。我几乎是靠肉眼做到的。改成translate(95 -55)就好了。见jsfiddle.net/epTp9/9`。我列出的两种方法中的第一种可能是更好的整体解决方案。找到正确的 viewBox 后,您可以轻松地在多个位置重复使用星形并使其自动居中。
【解决方案3】:

这是一个有效的小提琴

http://jsfiddle.net/epTp9/3/

这是路径的更改代码。

<g transform="scale(0.4)">
<path id="star-2-outline" d="M256,128.858l42.98,88.667l97.61,13.478l-71.047,68.278l17.346,96.996L256,349.809l-86.89,46.469l17.346-96.996l-71.047-68.278l97.61-13.478L256,128.858z M256,60.082l-62.978,129.92L49.999,209.75L154.1,309.793l-25.415,142.125L256,383.828l127.315,68.09L357.9,309.793L462.001,209.75l-143.023-19.748L256,60.082z" class="flag-icon" ></path>

  </g>

【讨论】:

  • 它适合,但在矩形内没有对齐
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多