在 svg 中居中文本无法正常工作

Posted

技术标签:

【中文标题】在 svg 中居中文本无法正常工作【英文标题】:Centering a text in svg not working correctly 【发布时间】:2021-10-31 18:49:53 【问题描述】:

我无法在 svg 的矩形内居中文本。我遵循了使用主要基线的建议,但文本显示偏离了几个像素,我想了解这是从哪里来的。

下面是 2 个并排标签的 react sn-p,一个使用 svg,另一个使用 flexbox 模型供参考。

我们看到差异的原因是什么?如何在 svg 中实现与 flexbox 对齐项目和对齐内容相同的行为?

const TestSvg = () => 
    const x = 10;
    const width = 52.35581970214844 ;
    const y = 0;
    const height = 14;

    const svg = (
        <svg width='65px' height='30px'>
            <g width=width height=height>
                <rect x=x y=y width=width height=height rx='3px' fill='red'/>
                <text
                    x=x + width / 2 y= y + height / 2
                    style=
                        fontSize: '11px',
                        fontWeight: 700,
                        fill: '#fff',
                        textAnchor: 'middle',
                        dominantBaseline: 'middle'
                    >'BLA'</text>
            </g>
        </svg>
    )

    const flex = (
        <div>
        <div style=display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: 'red', borderRadius: '3px', width: width>
            <div style=
                fontSize: '11px',
                fontWeight: 700,
                color: '#fff',
                textAnchor: 'middle',
                dominantBaseline: 'middle'
            >'BLA'</div>
        </div>
        </div>
    )

    return (
        <div style=display: 'flex'>
            svg
            flex
        </div>
    )

【问题讨论】:

请发布生成的输出 SVG 或工作中的 minimal reproducible example。因此,我们不必为了查看您的代码运行而自己构建 Web 应用程序。 使用 textAnchor: 'middle',dominantBaseline: 'middle' 应该可以解决问题。你能否检查一下 React 返回的结果,并按照@PaulLeBeau 的建议将其发布在这里 【参考方案1】:

我无法解释您报告的差异。

我制作了您的代码的香草版本并删除了&lt;g&gt;&lt;text&gt; 需要放在中间(50% 50%)。在 SVG 中,相对位置、大小等通常更容易。

:root 
  --width: 100%;
  --height: 100%;


svg>rect 
  width: var(--width);
  height: var(--height);
  rx: 3px;
  fill: red;


div#s1 
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: red;
  border-radius: 3px;
  width: 65px;


svg>text,
div#s1>div 
  font-size: 11px;
  font-weight: 700;
  fill: #fff;
  color: #fff;
  text-anchor: middle;
  dominant-baseline: middle;
<div style="display: flex;">
  <svg  >
      <rect x="0" y="0" />
      <text x="50%" y="50%">BLA</text>
  </svg>
  <div id="s1">
    <div>BLA</div>
  </div>
</div>

【讨论】:

以上是关于在 svg 中居中文本无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

在 JDesktopPane 中居中 JInternalFrame 无法正常工作

NSTextAlignmentCenter 仍然无法正常工作

如何让文本在可滚动的 UILabel 中居中?

SVG 到 PDF 在 Rails 5.0 中无法正常工作

SVG 圆形笔划无法正常工作

SVG - 多边形悬停无法正常工作[重复]