矩阵函数matrix()~全方位解析(Matrix)

一、matrix()的概述

在HTML5中,CSS3引入了Transform(变换)模块,包括2D和3D变换。而在2D变换中,经常用到的方法就是matrix()函数。这个函数可以实现包括旋转、缩放及移动等各式变化,是CSS3中非常重要的一个函数之一。

而这个函数的格式比较特殊,它是由一组矩阵组成的,所以被称之为矩阵变换。下面我们将从以下几个方面对它进行全面解析。

二、矩阵函数中的矩阵参数

matrix()是CSS3中最复杂的函数之一,它的参数个数非常规矩,为六个,分别表示 a,b,c,d,e,f,如下所示:

    matrix(a, b, c, d, e, f);
  • a(必需):表示变换的宽度
  • b(必需):表示倾斜 或 旋转角度的正切值
  • c(必需):表示倾斜 或 旋转角度的正切值
  • d(必需):表示变换的高度
  • e(可选):表示水平移动的距离
  • f(可选):表示垂直移动的距离

对于强制,前四个参数必须设定,后面两个参数是可选的。事实上,如果只有四个参数,matrix()函数将不会产生任何平移效果,我们将在后面的内容中提到。

三、a,b,c,d 影响哪些变化

在一个二维平面中,matrix() 可以实现 很多种变换。而这些变换中的 很多是通过改变 a,b,c,d 来实现的。下面我们将逐个列出。

1. 坐标变换

移动(平移)是一种基本的平面变换。这个变换通过添加偏移量(x,y)来实现。对应到matrix()中,就是通过指定e、f两个参数来实现。下面是示例:

    transform: matrix(1, 0, 0, 1, 50, 50);

意思是移动坐标系,使原来的位置在(50,50)处重新开始。如下:

2. 旋转变换

旋转变换就是将平面图形绕原点旋转。在matrix()中,旋转变化支持逆时针(顺时针使用负值)旋转一个给定的角度a。其中a的单位是弧度。这个角度是由矩阵中a、b、c、d 四个参数来确定的。下面是示例:

    transform: matrix(cos(30*180/Pi), sin(30*180/Pi), -sin(30*180/Pi), cos(30*180/Pi), 0, 0);

这里实现了一个顺时针(-30°)旋转。对应的示意图如下:

3. 缩放变换

缩放变换通过增加或抵消二维图形上的某些部分来增加或减少大小,所有坐标都小于原始值,或所有坐标都大于原始值。在matrix()中,缩放变暘认为是另一种基本变换之一。它通过为矩阵中的参数a和d设置比例因子来实现。a和d均以倍数指定输入矩阵的大小。下面是示例:

    transform: matrix(2, 0, 0, 2, 0, 0);

这里实现的是整个坐标系向外扩大2倍,相当于每个图形都扩大了2倍大小。效果如下:

4. 剪切变换

剪切变换又被叫做错切变换。这个变换是通过对横怕和纵坐标进行独立的平移来实现的。剪切变换特别适合于绘制简单文本,例如 凸字字母 和 费马大定理中的著名图形。在 matrix() 中,剪切变换使用 b 和 c 参数来实现。下面是示例:

    transform: matrix(1, tan(30*180/Pi), tan(70*180/Pi), 1, 0, 0);

这里实现了水向右上方斜切30°,垂直向上方斜切70°。示意图如下:

四、e,f 影响哪些变化

除了上述的四种转换之外,matrix()还有另外两个参数——e和f,它们用于实现其他变形。具体来讲,e是水平方向上进行的平移变形,而f是在垂直方向上进行的平移变形。

1. 按水平方向移动图形

matrix() 函数中的 e 值通常用来水平移动图形。水平移动表现在矩阵中,就是将坐标系沿着向量(1,0)移动。下面是示例:

    transform: matrix(1, 0, 0, 1, 60, 0);

这里将整个图形向右平移了 60px。效果如下:

2. 按垂直方向移动图形

与水平方向移动图形一样,通过 f 值可以在竖直方向上移动图形。竖直移动表现在矩阵中,就是将坐标系沿着向量(0,1)移动。下面是示例:

    transform: matrix(1, 0, 0, 1, 0, 40);

这里将整个图形向下平移了40px。效果图如下:

五、matrix()与其他属性的结合使用

除了可以单独使用之外,我们经常可以看到matrix()函数与其他CSS属性一起使用的场景,以实现更多更细致的效果。

1. transform-origin 属性

transform-origin 属性可以设置变换的原点。matrix()函数以元素左上角为原点,从而在使用 matrix() 的时候,变换的参考位置会产生变化。使用 transform-origin 属性可以解决这个问题。下面是示例:

    transform-origin: 50% 50%;
    transform: matrix(1, 0.3, 0.3, 1, 0, 0);

这里的transform-origin属性设定为50%,50%,表示设定为元素宽高中心,而后面的matrix()函数则实现了斜向右下方的缩放。效果如下:

2. transition 属性

transition 属性能使一个元素的某个属性平滑地过渡到新值。 和 matrix() 配合使用,通常用于产生平滑的轮廓、角度和大小变化。下面是示例:

    transition: transform 2s ease-in-out;
    transform: matrix(1.2, 0, 0, 1.2, 0, 0);

这里表示的是,将整个图片放大为原来的1.2倍,使用 transform 属性来实现平缓变化,持续时间为2s,采用缓动函数。效果如下:

六、矩阵函数的简化写法

在 matrix() 方法中,如果我们省略了第五个和第六个参数,则相当于我们原本的值分别是 0 和 0。如果我们只写四 个值,那么第五个和第六个值也将默认分别为 0。

当然,如果只有四个参数,那么图形会根据其中的旋转和缩放变换应用于元素自身,但是 必须保持初始大小和位置不变才能获得正确的结果,而不能实现平移效果。

下面是缩写示例:

    transform: matrix(1.2, 0.3, 0.1, 1.2);

这里省略了最后两个参数,即水平和垂直平移量。示意图如下:

七、总结

matrix() 是 CSS3 中非常重要的一个函数,通过它可以实现各种通用的平移、缩放、旋转和剪切等二维变形操作,用于提高网页的动画效果和交互性。但是它的格式和参数较为复杂,需要进行反复的练习和理解,方可真正掌握。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平