ChatGPT解决这个技术问题 Extra ChatGPT

如何缩放嵌入 <object> 标签的顽固 SVG?

我有一些指定 widthheight 以及 viewbox 的 SVG 文件,如下所示:

<svg width="576pt" height="432pt" viewBox="0 0 576 432" > ...

但是如何以我决定的大小在浏览器中显示它们?我希望它们更小并尝试过:

<object width="400" data="image.svg"></object>

但后来我得到可见的滚动条。

如果我将 SVG 文件更改为将 widthheight 设置为 100%,它会起作用,但我想决定 HTML 中的大小,而不管 SVG 文件中使用什么大小。这可能吗 ?

我很困惑,最后一句读起来像您正在寻找的解决方案?将 SVG 宽度/高度设置为 100%/100% 让 HTML 来定义绘制它的区域?
问题是我发现无法在用于生成 svg 文件的库中更改它。如果我可以从 html 覆盖它,这对我来说是有意义的。所以基本上我想知道除了更改 svg 文件是否还有其他解决方案。

z
zwol

您可以将“preserveAspectRatio”和“viewBox”属性添加到 <svg> 标记来完成此操作。

在编辑器中打开 .svg 文件并找到 <svg> 标记。在该标签中,添加以下属性:

preserveAspectRatio="xMinYMin meet"
viewBox="0 0 {width} {height}"

将 {width} 和 {height} 替换为 viewBox 的一些默认值。我使用了 SVG 标签的“宽度”和“高度”属性中的值,它似乎有效。

保存 SVG,它现在应该可以按预期缩放。

我在这里找到了这些信息:

https://blueprints.launchpad.net/inkscape/+spec/allow-browser-resizing


#protip 只需将它添加到此 preserveAspectRatio="xMinYMin meet"
@samccone:似乎只有 preserveAspectRatio="xMinYMin meet" 对我来说还不够。我还需要提供答案中提到的viewBox。遗憾!
如果您想以任意方式拉伸 svg,也可以执行 preserveAspectRatio="none"
不要像我一样陷入同样的问题:“viewbox”!=“viewBox”:)
此外,我必须将实际宽度和高度属性设置为 100%,如 this answer 所述。
Z
Zitrax

当我在 2009 年问这个问题时,这里给出的答案都没有对我有用。因为我现在再次遇到同样的问题,我注意到将 <img> 标记和宽度与 svg 一起使用效果很好。

<img width="400" src="image.svg">

这比其他选项简单得多!如果有人好奇,这里有一张 which browsers can handle SVG's in <img> tags 的表格。
如果 SVG 中没有超链接,这可能是最好的路径,否则 img 是不够的,仍然必须使用像 embed 这样的替代方法。
当您使用 <img> 时,您将失去与链接、javascript 等的所有交互性。
次要:img 元素应该是自闭的,即<img width="400" src="image.svg"/>
@JanAagaard:它是 not required to close the img tag,XHTML 除外。
S
Stephan
<body>

<div>
<object type="image/svg+xml" data="img/logo.svg">
   <img src="img/logo.svg" alt="Browser fail" />
</object>
</div>

图像/徽标.svg ...

<svg
   width="100%" 
   height="100%"
   viewBox="0 0 640 80"
   xmlns="http://www.w3.org/2000/svg"
   version="1.1" />

这个设置对我有用。


这实际上效果很好!真正重要的是实际定义 viewBox="0 0 640 80"。显然,如果这没有定义,你不能真正缩放它或让 CSS 使用例如 width: 100% 等来为你缩放它。
这行得通! tks,我需要将 svg 加载到对象中以访问 contentDocument 而不是“img”标签
j
joeforker

您可以使用 JavaScript 访问嵌入式 svg:

var svg = document.getElementsByTagName('object')[0].\
  contentDocument.getElementsByTagName('svg')[0];
svg.removeAttribute('width');
svg.removeAttribute('height');

由于您的 svg 已经有一个 viewBox,Firefox 应该将 viewBox 中的 576 像素宽度缩放到文档中的 400 像素宽度。其他 svg 可能会受益于从广告宽度和高度派生的新视图框(这些通常是相同的数字)。其他浏览器可能会受益于不同的 svg 调整。


这给了我:Security error: attempted to read protected variable
svg 是否与您的网页托管在同一个域中?
它不是(本地主机到外部)所以可能就是这样,但是我最终使用了下面的答案,因为它更简单。
A
Andrew Swift

我遇到了一个问题,即 iPad 上的 iOS 无法正确调整 <object> 标记中的 SVG 图像大小。

CSS 样式会增加或减小 <object> 容器的大小,但其中的图像不会被修改(在 iPad、iOS 7 上)。

SVG 图像是从 Adobe Illustrator 导出的,结果证明解决方案是在此替换宽度和高度:

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="481.89px" height="294.843px" viewBox="0 0 481.89 294.843" 
enable-background="new 0 0 481.89 294.843"
xml:space="preserve">

和:

width="100%" height="100%"

我需要使用 <object> 标记,因为 <img> 标记当前不支持在 SVG 中嵌入位图图像。


这是正确的答案,特别是如果您有内联 SVG 并且不使用
L
Lorenz Lo Sauer

设置缺少的viewbox并在svg标签中填写设置的height和height属性的height和width值然后只需将height和width设置为所需的百分比值即可缩放图片。祝你好运。您可以使用 preserveAspectRatio="x200Y200 meet 设置固定的纵横比,但这不是必需的

例如

 <svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="10%" 
   height="10%"
   preserveAspectRatio="x200Y200 meet"
   viewBox="0 0 350 350"
   id="svg2"
   version="1.1"
   inkscape:version="0.48.0 r9654"
   sodipodi:docname="namesvg.svg">

V
Vlado

只需使用 CSS 让浏览器调整 SVG 的大小!像这样:<object style="width:30%"> 有关详细信息,请参阅 http://www.vlado-do.de/svg_test/。我也只是在本地尝试了一个 SVG,它的宽度和高度在“pt”中给出。它在 Firefox 中运行良好。


P
PhiLho

让我们看看。我不得不刷新我对 SVG 的记忆,这些年来我没有用太多。

从我今天发现的情况来看,如果您指定没有单位的对象的尺寸,它们的尺寸是固定的(我认为以像素为单位)。显然,当您调整 SVG 大小时,无法调整它们的大小(它只会更改视口/画布大小)。

除非,正如所指出的,您以百分比指定 SVG 的大小或指定 viewBox(例如 viewBox="0 0 600 500")。

现在,如果您无法更改导出的 SVG,恐怕您就不走运了。你用什么图书馆?


matplotlib 中的 svg 后端。我尝试过 set_figwidth(val) 之类的函数,但它似乎不起作用,但我对这个库不是很熟悉,所以我可能正在查看错误的函数。
D
Dieter Gribnitz

这是基于 Jim Keller 的回答使用 QueryPath 的 PHP 解决方案。

加载 QueryPath 后,只需将您的 svg 脚本传递给该函数。

function scaleableSVG($svg){
    $qp = qp($svg, 'svg');
    $width = $qp->attr('width');
    $height = $qp->attr('height');
    $qp->removeAttr('width')->removeAttr('height');                       
    $qp->attr('preserveAspectRatio', "xMinYMin meet");
    $qp->attr('viewBox', "0 0 $width $height");
    return $qp->html();
}