SVG入门-基本变换

133 阅读2分钟

前言

SVG元素的形变都会用到一个元素属性transform,跟CSS的transform的形变差不多。

HTML transform和SVG transform

SVG自带transform属性,例如:

<svg width="200" height="150">
    <rect x="30" y="30" width="120" height="90" transform="rotate(45)"></rect>
</svg>

功能基本上和CSS3中的transform差不多包括:位移translate, 旋转rotate, 缩放scale, 斜切skew以及直接矩阵matrix。不同的是没有单独的可以设置X或者Y的类似translateX, rotateX方法。

两者间不一样的地方有:

1、CSS3 transform一般用在普通元素上,虽然也可以应用在SVG元素上,但是IE浏览器(IE edge未测试)却不支持SVG元素;

2、HTML元素的CSS3 transform和SVG的transform坐标系统大相径庭;

平常我们使用transform其坐标是相对于当前元素而言的,默认是元素的中心点变换,我们可以通过transform-origin属性改变变换的中心点。而SVG中的transform的坐标变换的是相对于画布的左上角计算的,跟HTML的transform差别较大,理解上也更加麻烦。而本文就是彻底理清SVG中的transform到底是怎么工作的。

平移

你能把元素移动一段距离,甚至你可以根据相应的属性定位它。translate()变形方法专门效力于这个目的。

<rect x="0" y="0" width="10" height="10" transform="translate(30,40)" />

该示例将呈现一个矩形,移到点(30,40),而不是出现在点(0,0)。

如果没有指定第二个值,它默认被赋值0。

旋转

旋转一个元素是相当常见的任务。使用rotate()变形就可以了:

<rect x="20" y="20" width="20" height="20" transform="rotate(45)" />

该示例显示了一个方形,旋转了45度。rotate()的值是用角度数指定的。

斜切

利用一个矩形制作一个斜菱形。可用skewX()变形和skewY()变形。每个需要一角度以确定元素斜切到多远。

<rect x="20" y="20" width="20" height="20" transform="skewX(45)" />

缩放

scale()变形改变了元素的尺寸。它需要两个数字,作为比率计算如何缩放。0.5表示收缩到50%。如果第二个数字被忽略了,它默认等于第一个值。

<rect x="20" y="20" width="20" height="20" transform="scale(0.5)" />

用matrix()实现复杂变形


所有上面的变形可以表达为一个2x3的变形矩阵。组合一些变形,可以直接用matrix(a, b, c, d, e, f)变形设置结果矩阵,利用下面的矩阵,它把来自上一个坐标系统的坐标映射到新的坐标系统:

在这里插入图片描述