从样式表定位内联 SVG

Posted

技术标签:

【中文标题】从样式表定位内联 SVG【英文标题】:Targeting Inline SVG from stylesheet 【发布时间】:2015-09-11 17:46:52 【问题描述】:

我很惊讶遇到这个问题,但我还没有完全理解 SVG + CSS 一定很有趣。

短版,这不起作用:

html

<div class="svg-container>
    <svg class="mybox">...</svg>
</div>

样式表中的 CSS

.mybox  max-height: 150px; 

加长版

我有一些 SVG“小部件”,一些是 2:1 的宽:高比,另一些是 1:1 的宽:高,需要灵活处理。

“小部件”将显示在画廊中,每个项目的宽度为 318 像素,高度为 150 像素。

但是,画廊并不是这些“小部件”的唯一(甚至是主要)展示,它们将在其他地方使用,并且需要缩放,因此添加 max-height: 150px 的内联 SVG 样式块不是选项。每个 SVG 都位于一个容器“svg-container”中。

重复:内联 SVG 样式不是一个选项。 SVG 本身可能必须是内联的,因为我们将数据传递给 SVG,因此链接到 SVG 作为图像等,不是一个选项。

这是一个CodePen(是的,它很丑,概念证明)

注意:里面的箭头调整到最大高度 150px,然而,SVG 失去了它的纵横比,正如你从边框看到的那样。

【问题讨论】:

你打赌,我在上面添加了一个 CodePen。 箭头确实保持了所需的纵横比,但是,正如你所说,SVG 本身没有,这就是我想要实现的 - 我希望整个 SVG 调整到最大-150px的高度(宽度:自动) 你想要两个不兼容的东西,如果你想让 SVG 占据一个不同纵横比的盒子,那么两个边缘需要有间隙,或者纵横比需要更改为与容器相同。没有第三种方法。 @PaulIsLoud:我不知道这是否有帮助,但据我了解,this 是您最好的选择。我同意罗伯特上面的评论。 @PaulIsLoud:My last try。我认为这可以满足您的需求。如果没有,请随时加入我this chat room。 【参考方案1】:

诀窍是在.svg-container 上设置height。这意味着 SVG 元素的 height25vw(视口宽度单位)但最大不超过 150px。由于元素的高度现在已知,因此宽度是根据 SVG 上指定的 viewBox 设置的。实际值(本例中为25vw)只是一个随机值,可以根据需要进行修改。

容器上的text-align: center(如您所料)是使 SVG 元素在容器内水平居中。

.svg-container 
  text-align: center;
  height: 25vw;
  /* This is the key. I have used vw units for responsiveness */
  margin-bottom: 10px;
  border: 1px solid;

.mybox 
  max-height: 150px;
  height: 100%;
<div class="svg-container">
  <svg class="mybox" style="border: solid" x="0" y="0" viewBox="0, 0, 500, 500">
    <polygon fill="orange" points="256,512 512,256 352,256 352,0.001 160,0 160,256 0,256 "></polygon>
    <text text-anchor="middle" x="250" y="250" style="font-size: 100px;" stroke="black" fill="black">000</text>
  </svg>
</div>

<div class="svg-container">
  <svg class="mybox" style="border: solid" x="0" y="0" viewBox="0, 0, 250, 500">
    <polygon fill="orange" points="128,512 256,256 176,256 176,0.001 80,0 80,256 0,256 "></polygon>
    <text text-anchor="middle" x="125" y="250" style="font-size: 50px;" stroke="black" fill="black">000</text>
  </svg>
</div>

【讨论】:

以上是关于从样式表定位内联 SVG的主要内容,如果未能解决你的问题,请参考以下文章

外部样式表中带有 fill:url(#id) 样式的 Firefox SVG,内联样式很好

html 放大时图形不会向上扩展.svg大小可以移动到样式表,但img大小必须保持内联。

o'Reill的SVG精髓(第二版)学习笔记——第五章

使用从内容加载的 SVG 样式表

如何将带有css样式的内联SVG从浏览器保存/导出到图像文件

CSSCSS 层叠样式表 ① ( 简介 | CSS 引入方式 - 内联样式 | 内联样式语法 | 内联样式缺点 )