是否有一种简单明了的方法可以使lengthAdjust(和textLength)的功能在必要时缩小文本(如果太宽)但从不尝试拉伸它?
我想到了通过JS生成的SVG的两种可能的解决方案:
textLength
。 / LI>
textLength
的情况下执行此操作,然后使用getBBox()
确定文本是否需要缩小,在这种情况下textLength
将被设置。这两个解决方案都非常丑陋(从我对getBBox()
过去遇到的回忆中可能有些错误)。我错过了一些更好的解决方案吗?
答案 0 :(得分:1)
看看这个:https://stackoverflow.com/a/39886640/1925631 实质上,创建一个跨越您要在路径上传播文本的精确坐标的路径。测量此路径。然后,测量文本所需的像素数,字体大小为1px(以及其他所需的字体功能)。现在调整字体大小以填充可用路径前进宽度的所需百分比。调整start-offset和text-anchor。现在最后计算你的作者指定的textLength并选择一个lengthAdjust值来获得低精度/不一致渲染器的精确对齐。
最后,如果您需要在路径渲染支持上支持没有文本的查看器,您可以使用符合javascript支持的一致查看器来创建向后兼容/回退版本。渲染内容并使用SVG DOM api获取每个字符/字形的x,y和旋转值,现在创建一个具有指定属性的新SVG DOM表示。您可能还需要javascript来计算根svg元素的绝对宽度和高度,以及正确指定的viewBox,并将所有css选择器/规则/属性级联/解析/转换为内联属性。但是这样,您可以通过每个不可变源文件版本的单个编译步骤获得跨平台,跨浏览器/查看器的文本呈现。
我还要简化最后一步,解决css并删除所有classNames,同时保留渲染的最终结果:https://gist.github.com/msand/4b37d3ce04246f83cb28fdbfe4716ecc
这是为了一个通用的svg + javascript代码库,以及web + ios + android软件开发(基于react + react-native + react-native-svg)