缩放 SVG 到相邻元素的高度

Posted

技术标签:

【中文标题】缩放 SVG 到相邻元素的高度【英文标题】:Scale SVG to height of an adjacent element 【发布时间】:2022-01-18 06:29:02 【问题描述】:

我正在尝试缩放具有固定纵横比的 SVG,以匹配相邻元素(包含一系列不同元素的 div)的高度。

出于演示目的,这里我简单地将 SVG (#triangle) 的高度设置为 10rem,这恰好与右侧 div (#text) 的高度相匹配。但是如果你调整窗口大小,一切都会改变。 (见本题末尾的代码sn-p)

我想要实现的是能够调整窗口大小,并且随着文本换行(更改其高度),SVG 的高度会调整以匹配:

我以为会有 CSS 网格或 Flexbox 解决方案,但目前我还没有找到。

(我也很高兴使用 CSS 解决方案而不是 SVG,例如使用剪辑路径或其他样式的 div,但关键问题是它应该具有固定的纵横比)

创建一个 javascript 解决方案是可以的,但它比最初看起来要复杂一些。

困难在于,决定#text 是否换行(从而决定#text 的高度)的可用空间取决于#triangle 的宽度。 #triangle 有一个固定的纵横比,所以它的宽度取决于它的高度,这将取决于#text 的高度...

实用说明:显然,这种布局并不能提供很大的灵活性,并且只能用于特定类型的内容——狭窄的 SVG 和相当短的文本元素。 在桌面屏幕上,右侧会有很多空白空间,没有换行,而在移动设备上,它会占据整个宽度,并带有一些换行的文本。

#container 
  border: 1px goldenrod solid;
  padding: 1em;
  display: flex;
  flex-direction: row;
  justify-content: flex-start;
  gap: 1em;


#triangle 
  border: 1px steelblue solid;
  height: 10rem;


#text 
  border: 1px steelblue solid;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
<div id="container">

  <svg id="triangle" 
       viewBox="0 0 6 8">
    <polygon points="0,8 3,0 6,8"
             fill="tomato"/>
  </svg>


  <div id="text">
    <h1>
      Triangle
    </h1>
    <p>
      A polygon with three edges and three vertices.
    </p>
    <a href="https://en.wikipedia.org/wiki/Triangle">
    Triangle on Wikipedia
    </a>      
  </div>


<div>

</body>

【问题讨论】:

您可能不得不重新考虑您的要求。您可能会进入一个反馈循环,您的文本会变得越来越窄;这使得三角形更大更宽;这反过来又使文本更窄更高。 【参考方案1】:

这不是完美的解决方案,但也许其他人可以扩展它。

主要技巧是 SVG (svg) 的高度为 0,但会根据父元素 (.triangle) 增长 (flex-grow: 1;)。

这个解决方案的问题是.triangle.text 之间的共享是固定的(grid-template-columns: 1fr 4fr;)。这个份额是可以调整的,但是如果用例在文本高度上有很大的不同,那就是个问题了。

#container 
  border: 1px goldenrod solid;
  padding: 1em;
  display: grid;
  grid-template-columns: 1fr 4fr;
  grid-column-gap: 1em;


.triangle 
  display: flex;
  align-items: stretch;
  flex-direction: column;


.triangle svg 
  border: 1px steelblue solid;
  flex-grow: 1;
  height: 0;


.text 
  border: 1px steelblue solid;
<div id="container">
  <div class="triangle">
    <svg viewBox="0 0 6 8">
      <polygon points="0,8 3,0 6,8" fill="tomato"/>
    </svg>
  </div>
  <div class="text">
    <h1>Triangle</h1>
    <p>A polygon with three edges and three vertices.</p>
    <a href="https://en.wikipedia.org/wiki/Triangle">
    Triangle on Wikipedia
    </a>
  </div>
</div>

【讨论】:

这很有帮助!当这种方法失效时,我最终将您的解决方案与媒体查询一起使用以切换到另一个布局。

以上是关于缩放 SVG 到相邻元素的高度的主要内容,如果未能解决你的问题,请参考以下文章

创建一个缩放到浏览器高度但具有设定宽度的 svg

使用背景图像填充 SVG 路径元素,无需平铺或缩放

带有 viewBox 和宽度的 SVG 在 IE 中无法正确缩放高度

如何在 Firefox 中不尊重纵横比的情况下缩放 SVG 背景图像?

使用 Javascript 动态添加时,SVG 元素无法正确缩放

如何为 react.js 应用缩放 svg 背景?