D3 用于getComputedStyle
确定转换的起始值。不幸的是,getComputedStyle
对于 CSS 变换返回变换矩阵,而不是您指定的变换字符串。因此,反向转换的起点如下所示:
matrix(0, -1, 1, 0, 0, 0)
(我实际上不确定为什么第一个转换有效。元素上没有转换时的转换矩阵值是“matrix(1, 0, 0, 1, 0, 0)”,并且字符串插值器能够以某种方式用它做点什么,但我不知道为什么。)
要解决此问题,您有几个选择:
如果您的起点和终点定义明确(如示例中所示),您可以创建一个自定义补间,它自己运行interpolateString,根据当前旋转状态作为“旋转”字符串传入已知的开始和结束变换。
您可以将“旋转”字符串转换为变换矩阵并将其传递给transition.style
。关于CSS 转换的 MDN 文章说这rotate(angle)
相当于[cos(angle) sin(angle) -sin(angle) cos(angle) 0 0]
.
您可以切换到使用带有text
元素的 SVG。d3 可以很好地理解 SVG 转换,并且在大多数情况下都可以使用(您的示例就是一个),而无需您进行特殊处理。
我确实找到了一个与 Firefox 有关的错误报告,其中有一些关于更改此问题的讨论,但考虑到 Firefox 和 WebKit 中都出现了相同的行为,似乎我们将在一段时间内忍受这种行为。