SVG lengthAdjust 仅用于收缩而不用于拉伸
SVG lengthAdjust only for shrinking but not for stretching
是否有一种简单易行的方法来实现 lengthAdjust (together with textLength) 的功能,以便在必要时收缩文本(如果太宽)但从不尝试拉伸文本?
我想到了通过JS生成SVG的两种可能的解决方案:
- 计数字符(或者更确切地说字形簇)并基于此(结合一些启发式方法,除非使用固定宽度大小的字体)确定是否设置
textLength
与否。
- 首先在不设置
textLength
的情况下执行此操作,然后使用 getBBox()
确定文本是否需要缩小,在这种情况下将设置 textLength
。
恕我直言,这两种解决方案都非常丑陋(根据我对过去遇到 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)
是否有一种简单易行的方法来实现 lengthAdjust (together with textLength) 的功能,以便在必要时收缩文本(如果太宽)但从不尝试拉伸文本?
我想到了通过JS生成SVG的两种可能的解决方案:
- 计数字符(或者更确切地说字形簇)并基于此(结合一些启发式方法,除非使用固定宽度大小的字体)确定是否设置
textLength
与否。 - 首先在不设置
textLength
的情况下执行此操作,然后使用getBBox()
确定文本是否需要缩小,在这种情况下将设置textLength
。
恕我直言,这两种解决方案都非常丑陋(根据我对过去遇到 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)