首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SVG在Chrome/Edge中的位置不正确,但在Firefox中却不正确

SVG在Chrome/Edge中的位置不正确,但在Firefox中却不正确
EN

Stack Overflow用户
提问于 2022-08-22 00:59:07
回答 1查看 76关注 0票数 0

我正在使用一个SVG元素,它包含具有以下结构的文本元素

代码语言:javascript
复制
    <g class="textGroup2">
          <text class="split0" x="640" y="80" dy="0" stroke="black">
            <tspan alignment-baseline="hanging" data-t="0" style="font-size: xx-large;">S</tspan>
            <tspan alignment-baseline="hanging" data-t="1" style="font-size: xx-large;">V</tspan>
            <tspan alignment-baseline="hanging" data-t="2" style="font-size: xx-large;">G</tspan>
          </text>
      </g>

通过这样做,我试图为每个tspan提供一个xy属性。

代码语言:javascript
复制
    document.querySelectorAll('body > svg > g.textGroup2 > text[class^="split"]>tspan').forEach(
    (a, i) => {
        const dim = a.getStartPositionOfChar(0);
        a.setAttribute('x', `${dim.x}`);
        a.setAttribute('y', `${dim.y}`);
        a.removeAttribute('alignment-baseline');
    });

因此,火狐返回

Chrome/Edge则返回以下内容

如何使Chrome/Edge返回Firefox返回的内容,即具有x和常量y属性的每个tspan?完整代码如下

代码语言:javascript
复制
    document.querySelectorAll('body > svg > g.textGroup2 > text[class^="split"]>tspan').forEach(
(a, i) => {
    const dim = a.getStartPositionOfChar(0); 
    a.setAttribute('x', `${dim.x}`);
    a.setAttribute('y', `${dim.y}`);
    a.removeAttribute('alignment-baseline');
});
代码语言:javascript
复制
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720">
      <rect class="vBoxRect" width="1280" height="720" fill="#EFEFEF"></rect>
      <g class="textGroup2">
          <text class="split0" x="640" y="80" dy="0" stroke="black">
            <tspan alignment-baseline="hanging" data-t="0" style="font-size: xx-large;">S</tspan>
            <tspan alignment-baseline="hanging" data-t="1" style="font-size: xx-large;">V</tspan>
            <tspan alignment-baseline="hanging" data-t="2" style="font-size: xx-large;">G</tspan>
          </text>
      </g>
    </svg>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-22 07:03:51

解决方案是从alignment-baseline="hanging"中删除<tspan/>,或者如果您最初需要此属性,可以在确定<tspan/>的位置之前在循环中删除它。

代码语言:javascript
复制
document
  .querySelectorAll('body > svg > g.textGroup2 > text[class^="split"]>tspan')
  .forEach((a, i) => {
    a.removeAttribute('alignment-baseline');
    const dim = a.getStartPositionOfChar(0);
    a.setAttribute('x', `${dim.x}`);
    a.setAttribute('y', `${dim.y}`);
  });
代码语言:javascript
复制
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 720">
  <rect class="vBoxRect" width="1280" height="720" fill="#EFEFEF"></rect>
  <g class="textGroup2">
    <text class="split0" x="640" y="80" dy="0" stroke="black">
      <tspan alignment-baseline="hanging" data-t="0" style="font-size: xx-large">S</tspan>
      <tspan alignment-baseline="hanging" data-t="1" style="font-size: xx-large">V</tspan>
      <tspan alignment-baseline="hanging" data-t="2" style="font-size: xx-large">G</tspan>
    </text>
  </g>
</svg>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73439294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档