编辑:不要使用这个!我对其进行了更多测试,并意识到 A->C 转换并非在所有情况下都可靠,并且其他一些路径命令组合也失败了。请改用这个!
终于让它在 Safari、Opera、IE9、Firefox 和 Chrome 中工作:http:
//jsfiddle.net/timo2012/M6Bhh/41/
该函数对 SVG 路径的数据进行归一化处理,以便将所有路径段转换为 M、C、L 和 z(= 绝对坐标,这意味着所有相对坐标都转换为绝对坐标)。所有其他线段都很简单且 100% 准确,但圆弧 (A) 是一种特殊情况,您可以选择将圆弧转换为直线 (L)、二次曲线 (Q) 还是三次曲线 (C)。最准确的是线条,但随后我们失去了分辨率独立性。由于某种原因,二次曲线在某些弧线中失败,但三次曲线更准确。
如果我们有以下路径:
<svg width="400" height="400">
<path stroke="red" stroke-width="3" d="M30 30 S40 23 23 42 L23,42 C113.333,113.333 136.667,113.333 150,80 t40,50 T230,240 q20 20 54 20 s40 23 23 42 t20,30 a20,30 0,0,1 -50,-50"/>
</svg>
并使用以下方法对其进行标准化:
var path = document.querySelector('path');
path.normalizePath(3, 0.1); // 3 = C = cubic curves. Best alternative, rather good accuracy and path data remains reasonable sized
标准化版本是这样的:
<svg width="400" height="400">
<path stroke="red" stroke-width="3" d="M 30 30 C 30 30 40 23 23 42 L 23 42 C 113.333 113.333 136.667 113.333 150 80 C 150 80 163.333 96.6667 190 130 C 216.667 163.333 230 200 230 240 C 243.333 253.333 261.333 260 284 260 C 284 260 324 283 307 302 C 307 302 313.667 312 327 332 C 324.811 336.924 321.997 341.154 318.719 344.448 C 315.441 347.741 311.762 350.033 307.893 351.194 C 304.024 352.355 300.04 352.361 296.169 351.213 C 292.298 350.064 288.616 347.783 285.333 344.5 C 282.05 341.217 279.23 336.996 277.035 332.078 C 274.839 327.161 273.311 321.642 272.537 315.839 C 271.763 310.035 271.759 304.06 272.525 298.254 C 273.291 292.448 274.811 286.924 277 282"/>
</svg>
如果我们将两者布局在彼此之上,结果是这样的(红色是标准化的,黑色是原始的):
其他可能性如下:
path.normalizePath(1,0.5); // A->L, Many lines, high accuracy. Very good accuracy, but not so resolution independent, because when scaled, the corners become visible
path.normalizePath(1,40); // A->L, Few lines, less accuracy
path.normalizePath(2,0.5); // A->Q, quadratic curves. I tested this, but not good. Fails in some cases.
这样做有什么好处?
规范化路径数据的本机方式尚未在所有浏览器中实现,所以到目前为止我们都是靠自己的。而当实现本机方式时,我们不确定所有浏览器都采用相同的方式。SVG 文档谈到将弧线转换为线,但这不是一个好方法,因为 SVG 的主要优势 - 分辨率独立性 - 将丢失。我们应该完全控制弧的标准化是如何完成的,这个脚本提供了一种方法。
当数据被规范化时,它可以像位图图像中的坐标一样被改变。如果我们想以 Illustrator 方式扭曲(Arc、Arch、Bulge、Shell、Flag、Wave、Fish、Rise、Fisheye、Inflate、Squeeze、Twist)路径或扭曲路径以实现透视错觉,可以修改归一化路径数据可靠。
该代码基于 YannickBochatay 的脚本,我使它更跨浏览器。