当前位置: 首页 > 知识库问答 >
问题:

调整Viewbox以包含svg元素

段干帅
2023-03-14

所以我正在用svg开发一个地图,我希望能够根据用户输入缩放到svg中的预定义区域(一个州或国家)。我找到了一个教程,该教程既能做到这一点,又能对其进行动画化,在这里:https://css-tricks.com/interactive-data-visualization-animating-viewbox/ith codepen在这里:https://codepen.io/sdras/pen/512230ed732f9b963ad3e50c8d4dcbb8

现在我在用自己的SVG复制这方面遇到了问题。当我让它缩放到某个区域时,它会缩放到另一个区域。我尝试过复制他们代码的精确结构,但没有成功。我开始认为错误是在我的SVG本身。

HTML:

<svg id="foo" xmlns="http://www.w3.org/2000/svg" 
xmlns:xlink="http://www.w3.org/1999/xlink"  viewBox="0 0 1440 776">

那么在这里复制和粘贴的代码太多了。

萨斯:

html
  body
    svg
      width: 100vw
      height: 100vh

jQuery:

var test = document.getElementById("_x32_");
console.log(test);
var s = test.getBBox();

//check the console for the SVGRect object
console.log( s );

//we store the values from the object as our new viewBox string
var newView = "" + s.x + " " + s.y + " " + s.width + " " + s.height;
console.log(newView);
//we then set the new viewBox string as the viewBox attribute on the SVG
var foo = document.getElementById("foo");
console.log(foo);
//foo.setAttribute("viewBox", newView);

代码页在这里:https://CodePen.io/mat148/pen/xqwmxr

共有1个答案

仰翰采
2023-03-14

您遇到的问题是因为getBbox()返回的边界框表示该元素的coords的边界,然后该元素被其祖先元素上的Transform属性转换。

如果我们检查该文件,我们会看到元素的父级如下所示:

<svg>
  <g id="north-america" transform="translate(100.000000, 45.000000)">
    <polygon id="_x32_" ...>

因此在这个特定元素的情况下,它的位置实际上是从getBbox()返回的位置向右100和向下45的点。

如果我们黑掉这些偏移量,你就能看到它起作用了。

显然,这不是一个通用的解决方案。

这个问题没有一个非常简单的解决方案,但下面是您可以尝试的几种方法:

>

  • 通过将SVG应用于路径和多边形,更改SVG以移除所有转换。此堆栈溢出问题描述了使用Inkscape实现此目的的一些方法。

    我相信RaphaelJS库有一个函数可以返回转换后的包围盒。请参阅element.getBbox()。

    您可以将元素及其祖先克隆到单独的 中,然后在 上调用getBbox()。即创建一个简化的SVG,它看起来像这个答案中的代码块ealier中的SVG( )。

  •  类似资料:
    • 我无法将svg的大小调整为20px到20px。下面是svg的原始代码大小,它是巨大的0 0 35.41 35.61: 但是,然后我将viewbox值更改为“0 0 20 20”,而不指定svg本身的宽度和高度,并且大小仍然非常大: 然后我在主svg文件中添加了一个宽度20和高度20,结果的大小变小了,但是它现在被裁剪了。 我阅读了SVG文档,并且理解了如果您不指定宽度/高度,它将使用ViewBox

    • SVG VIEWBOX viewport 首先来了解下SVG中的viewport这个概念,简单来说viewbox就是值指SVG图片本身可视区域的大小,除了SVG本身,其它一些元素也有可视区域的限制,比如symbol、image、pattern等。 在SVG中viewport主要是通过width和height属性来定义的。比如,我们定义一个width="600"和height="600"就表示我们定

    • 我有两个div容器。第一个包含许多小的SVG图像,第二个应该包含一个您单击的SVG图像。 单击第一个div中的任何SVG图像时,我想: 克隆SVG映像。 将它(克隆)重新缩放到原来大小的5倍。 在第二个div容器中查看。 我做了一些研究,发现我可以使用ViewBox控制SVG图像的缩放和大小。所以我设置了viewBox属性。一个小型svg如下所示: 现在,在“IncreaseSize”方法中,我执

    • 我正在使用osmdroid和osmbonuspack库。在活动中,我有一个地图,上面有几个来自osmbonuspack的标记,每个标记在点击时打开一个InfoWindow。但当标记接近MapView的上边缘时,它的infowindow打开超出界限。有没有一种方法可以调整mapview,以便让Marker的InfoWindow像这个iOS库一样完整地呈现出来?https://www.mapbox.c

    • 我正在研究一个svg平面布局,用户应该可以放大和缩小。 当我第一次编码它时,缩放特性起作用,但是svg不响应容器大小。我添加了viewbox属性以使其具有响应性,但这会干扰缩放功能--即使您尝试缩放,它也会缩放,并且缩放不像添加viewbox之前那样工作。 以下是两个相互依存关系来演示此问题: 没有ViewBox-SVG可以正确缩放,但不响应容器大小 https://codepen.io/nico

    • 我想调整SVG元素的尺寸以适应其内容。 JSfiddle:http://jsfiddle.net/4pD9N/ 这里我有一个例子。SVG应该“收缩”以适应每边10像素的元素边距。换句话说:我想为未使用的空间裁剪svg... 我知道我必须使用getBBox。但是我如何计算总宽度和总高度呢?