【问题标题】:How to center text and scale font size based on container using SVG?如何使用 SVG 基于容器使文本居中并缩放字体大小?
【发布时间】:2017-08-27 16:05:09
【问题描述】:

对于响应式网站,我正在尝试使用 SVG 将文本居中并缩放其字体大小,这样我就不需要使用 JavaScript 进行任何计算。

我的第一个问题是我尝试将x="50%" 和y="50%" 与text-anchor="middle" 和alignment-baseline="central" 一起使用,但是虽然这适用于Chrome,但在IE、Edge 和Firefox 中,文本不是垂直居中的,但它的基线是这样文字本身就有点太高了。在没有固定高度的情况下,如何在这些浏览器中垂直居中文本?

我的第二个问题是缩放。到目前为止,我在 Internet 上发现的是使用 lengthAdjust="spacingAndGlyphs" ,但这会产生奇怪的结果,文本看起来会被拉伸。如何像缩放图像一样缩放所有内容?

这是我的起始笔:https://codepen.io/smares/pen/QMVPvN

我还阅读了有关 viewBox 的信息,但我不完全了解如何使用它,因为我没有固定大小的容器。

我必须使用内联 SVG,因为文本实际上是由 Vue 生成的。

【问题讨论】:

  • 对于 Firefox 使用显性基线而不是对齐基线。其他 UA 也可能支持主导基线。

标签: svg


【解决方案1】:

垂直对齐

对于垂直对齐问题,问题是由于 Firefox 不支持对齐基线。类似问题可以参考this answer:

不幸的是,虽然这是实现你想要的结果的“正确”方式,但 Firefox 并没有为 SVG 文本模块 ('SVG in Firefox' MDN Documentation) 实现很多表示属性。

编辑(感谢@Robert Longson):另一方面,支持dominant-baseline (MDN article),并且似乎实现了相同的效果。

缩放

对于缩放,使用preserveAspectRatio="xMinYMin" 和viewBox 将使SVG(及其text)正确缩放,而不会被拉伸。您可以将 SVG 的 width 和 height 设置为 100% 或其他尺寸...

<svg preserveAspectRatio="xMinYMin" viewBox="0 0 800 450" width="100%" xmlns="http://www.w3.org/2000/svg">

注意使用 100% 设置 SVG 的大小不会在 IE11 中产生适当的结果,可能也在 Edge 中。据我回忆,以像素为单位的维度效果很好。

来自 CSS Tricks 的文章“How to scale SVG”非常清晰和完整,可以理解不同的概念。

更新的代码笔

这里是updated pen,设置了dominant-baseline,以及缩放属性。调整窗口大小以查看相应更新的 SVG 大小。

【讨论】:

  • 好吧,我最终使用了带有自定义值的dy 垂直居中,因为dominant-baseline 适用于 Firefox,但不适用于 Edge。至于viewBox,我发现我只需要给它坐标以及在 100% 时框有多大(以像素为单位)。当width 发生变化时,缩放本身就会发生,感谢您的preserveAspectRatio,一切看起来都很好。
猜你喜欢
  • 2019-05-28
  • 1970-01-01
  • 2020-02-12
  • 2017-09-09
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
相关资源
最近更新 更多