不要使用 transform-origin 属性
SVG 支持 transform
,而且写法似乎与 CSS 中相同,但是它的标准里并不支持 transform-origin
属性。虽然在部分浏览器中,给 SVG 元素指定 transform-origin
似乎是有效果的(写法和结果也与 CSS 一样),但是无法指望这个行为在所有浏览器里都有效。
自行解释 transformOrigin
既然不能通过 attribute 来指定变换原点,我们只好通过对其他 transform 值的变动来实现想要的效果了。
首先建立一个对象系统
|
此时有
|
经过简单的属性到 dom 的操作,得到
|
r2 的变换,先平移再缩放,平移的结果就是缩放的原点。
此处将 x/y 转为 translate 而不是 x
和 y
属性,是为了以统一的方式做坐标系的转换和运算,且考虑到许多元素没有 x
和 y
属性(如 circle
就只有 cx
和 cy
),但所有 SVG 元素都支持 transform 。
|
带位移补偿的缩放
计算缩放的位移补偿值,使得缩放再位移后效果就与以变换原点为中心缩放一样。
假设在缩放系数为 S 时,我们需要的 translate 为 TR,变换完的结果:
$$
x'=(x+TR_x)\times S_x\\\\
y'=(y+TR_y)\times S_y
$$
当以变换原点为特征点时,方程易于构建与求解。
令 Tx 和 Ty 为变换原点相对于原坐标系左上角的坐标,当 x = Tx, y = Ty 时,代入得到:
$$
TO_{x} \ \ =\ ( TO_{x} \ +TR_{x}) \times S_{x}\\\\
TO_{y} \ \ =\ ( TO_{y} \ +TR_{y}) \times S_{y}
$$
所以:
$$
TR_{x} \ =\frac{( 1-S_{x}) \times TO_{x}}{S_{x}}\\\\
\\\\
TR_{y} \ =\frac{( 1-S_{y}) \times TO_{y}}{S_{y}}
$$
带缩放修正值的 transform 计算方法改为:
|
例如一个缩放为2倍,
|
对应于缩放的变换应该是 scale(2,2) translate(-25,-12.5)
,再加上元素本身的位移,最后得到:
|
变换过程示意: