SVG长度仅适用于收缩但不适用于拉伸

时间:2017-08-18 17:03:41

标签: svg text resize

是否有一种简单明了的方法可以使lengthAdjust(和textLength)的功能在必要时缩小文本(如果太宽)但从不尝试拉伸它?

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

  • 计算字符(或者更确切地说是字形簇)并基于此(除了使用固定宽度字体之外的一些启发式方法)确定是否设置textLength。 / LI>
  • 首先在未设置textLength的情况下执行此操作,然后使用getBBox()确定文本是否需要缩小,在这种情况下textLength将被设置。

这两个解决方案都非常丑陋(从我对getBBox()过去遇到的回忆中可能有些错误)。我错过了一些更好的解决方案吗?

1 个答案:

答案 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)