SVG lengthAdjust 仅用于收缩而不用于拉伸

SVG lengthAdjust only for shrinking but not for stretching

是否有一种简单易行的方法来实现 lengthAdjust (together with textLength) 的功能,以便在必要时收缩文本(如果太宽)但从不尝试拉伸文本?

我想到了通过JS生成SVG的两种可能的解决方案:

恕我直言,这两种解决方案都非常丑陋(根据我对过去遇到 getBBox() 的回忆,可能存在错误)。是否有我错过的更好的解决方案?

看看这个: 本质上,创建一条跨越您想要在路径上展开文本的精确坐标的路径。测量这条路径。然后,测量文本需要多少像素,字体大小为 1px(以及其他所需的字体特征)。现在调整字体大小以填充可用路径前进宽度的所需百分比。调整起始偏移量和文本锚点。现在最终计算您的作者指定的 textLength 并选择一个 lengthAdjust 值以在低精度/不一致的渲染器上获得精确对齐。

最后,如果您需要支持在路径渲染支持上没有文本的查看器,您可以使用具有 javascript 支持的一致查看器来创建向后的 compatible/fallback 版本。呈现内容并使用 SVG DOM api 获取每个 character/glyph 的 x、y 和旋转值,现在创建一个具有指定属性的新 SVG DOM 表示。您可能还需要 javascript 来计算根 svg 元素的绝对宽度和高度,以及正确指定的 viewBox,并且 cascade/resolve/convert 所有 css selectors/rules/properties 来内联属性。但是通过这种方式,您可以获得跨平台,cross-browser/viewer 文本呈现,每个不可变源文件版本只需一个编译步骤。

我还做了一个要点来简化最后一步,解析 css 并删除所有类名,同时保留呈现的最终结果:https://gist.github.com/msand/4b37d3ce04246f83cb28fdbfe4716ecc

这是为了一个单一的通用svg + javascript代码库,和web+ios+android软件开发(基于react + react-native + react-native -svg)