【问题标题】:How to justify SVG text?如何证明 SVG 文本的合理性?
【发布时间】:2023-04-09 04:57:02
【问题描述】:

我正在尝试使用 javascript 来证明 <tspan> 元素中的文本,因为 SVG 尚不支持 text-align: justify。我确信我非常接近正确的解决方案,但似乎无法在单词之间获得正确的单词间距,以便每一行都向左和向右对齐。

这里有一个CodePen link 来查看该问题的全部内容。只需单击页面底部的其中一个按钮即可运行该功能(向下滚动页面以查看按钮)。

但我认为问题出在某个地方:

首先,我遍历每个 <tspan> 元素并将其原始长度推送到数组中。

for (i = 0; i < tspan.length; i++) {
 spanText.push(tspan[i].offsetWidth);
}

然后我将该数组中最长的值存储在一个变量中

longestSpan = Math.max.apply(Math, spanText);

然后我再循环遍历每个&lt;tspan&gt; 并计算每个单词之间所需的间距,以使每一行的文本与&lt;tspan&gt; 的最大宽度对齐

for (i = 0; i < tspan.length; i++) {
 var spanLength = longestSpan - tspan[i].offsetWidth;
 var wordCount = tspan[i].innerHTML.split(/\s/).length;
 var wordSpacing = spanLength / (wordCount - 1);
 tspan[i].setAttribute('word-spacing', wordSpacing);
}

正如您在上面的链接中看到的,每行两端对齐的文本略有偏差。

是否有一个纯 SVG 解决方案?如果不是,我如何正确计算每个单词之间的间距以获得对齐的文本。

【问题讨论】:

标签: javascript html css text svg


【解决方案1】:

只需fixed间距计算:

wordSpacing = spanLength / (wordCount-1) / 2

减去1得到空格数,发现间距加倍。还修复了字数计算。

【讨论】:

  • 现在负 1 是有意义的,但为什么要除以 2?我尝试使用 (wordCount - 1) 并获得比原始代码和除以 2 建议更理想的结果。但有些线还是有点偏离。我知道可能没有完美的解决方案,但似乎第一行和最后一行比其他行长。
猜你喜欢
  • 2018-02-12
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多