有没有办法从 <svg> 标签外缩放内联 SVG?

Posted

技术标签:

【中文标题】有没有办法从 <svg> 标签外缩放内联 SVG?【英文标题】:Is there a way to scale an inline SVG from outside the <svg> tag? 【发布时间】:2021-04-18 02:59:43 【问题描述】:

我正在使用名为 rqrcode 的 Ruby gem 生成 QR 码作为 SVG,然后将其作为 API 响应发送。在前端(Vue.js)中,我需要以指定的大小显示 SVG。

现在我的代码看起来像这样,虽然它会渲染 SVG,但我无法指定大小。

<div v-html="qrCode" />

我尝试向 div 添加样式,但 SVG 完全忽略了它。为了给你一个想法,这就是它的样子:

我的理解是,您可以在&lt;svg&gt; 标签内使用widthheightviewBox 来缩放SVG。 但是,无法在 rqrcode 中指定这些属性 - 高度和宽度由 gem 决定,并且开始的 svg 标记如下所示:

&lt;svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" width="246" height="246" shape-rendering="crispEdges"&gt;

所以我的问题是,如何从父容器指定内联 SVG 的大小以适应父容器?

[编辑澄清]如果&lt;svg&gt; 标记中的尺寸大于我的 div 容器,我希望 svg 缩小以适合容器。 反之亦然 - 如果尺寸更小,我希望 svg 扩展以适应容器。我不确定这是否可能。

【问题讨论】:

对于 div,将位置更改为相对...在 div 样式中指定高度和宽度 对于 svg 类,将高度和宽度设置为 100% 而不是width="246" height="246" 使用viewBox="0 0 246 246" @enxaneta 正如我在问题中所写,我无法设置widthheightviewBox,因为&lt;svg&gt; 标签内的所有内容都是由rqrcode 自动生成的宝石。我的问题是您是否可以从其父容器缩放 SVG。 然后使用javascript摆脱widthheight并设置viewBox,正如enxaneta所说,这是你问题的根本原因 【参考方案1】:

您实际上可以使用 css 覆盖内联 heightwidth

请注意,css 不需要限定范围,因此如果需要,请创建另一个样式块。

<style scoped>
  ...
</style>
<style>
div > svg 
  height: 100px;
  width: 100px;

</style>

【讨论】:

谢谢,我试过了,它已经完成了一半 - SVG 元素现在具有指定的高度和宽度。问题是,它没有缩放。如,如果&lt;svg&gt; 标记中的widthheight200px,并且我在CSS 中指定100px,就像上面的代码一样,它只显示SVG 的左上角。有什么想法吗? @camaulay 谢谢,我认为这个解决方案不起作用,因为 SVG 的内部也有固定的宽度/高度,但否则你的解决方案就可以了。我接受答案。【参考方案2】:

将位置添加为相对位置并将宽度设置为 svg 类。不要忘记给 svg 一个类名。这里我假设类名是'svgClass'

div 
    height: 500px;
    width: 500px;
    border: 1px solid black;
    overflow: auto;
  position: relative; /* add this line! */


svg   /* class name of the svg */
  width:100% !important;
  height:100% !important;

【讨论】:

我认为没有办法向 SVG 添加类,因为我使用的是从 API 接收的 SVG 代码。如果我遗漏了什么,请告诉我。 没关系....只是将样式设置为 svg 本身...请检查我编辑的答案 position: relative; 添加到div 容器和max-width:100%;svg,但这会导致与其他解决方案相同的问题 - 如果 SVG 大于div 的尺寸。理想情况下,我希望 svg 缩小到 div 的大小,或者如果不够大则增大。 我添加了 !important...检查我编辑的答案 同样的结果,SVG 被截断而不是缩小以适应容器的大小:/

以上是关于有没有办法从 <svg> 标签外缩放内联 SVG?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 SVG 文件中嵌入 Google Web Font 脚本?

SVG渐变

将工具提示添加到 SVG rect 标签

如何在 SVG 的矩形内设置标题标签的样式? [复制]

以光标位置为变换原点缩放 SVG

如何 SVG图像用 内