关于transform:Matrix()偏移缩放后的坐标问题

首先先简单说一下transform:Matrix()各参数的含义:

transform: matrix(a,b,c,d,e,f);

a、d控制缩放,b、c控制旋转,e、f控制位移。

其中ef能够直接影响元素的坐标,缩放间接影响坐标,旋转对坐标没有影响。

所谓坐标X,Y其实就是元素的left跟top的值。transform: matrix(1, 0, 0, 1, 30, 30)就相当于top:30px;left:30px。

<style>
.matrix_box { width:200px; height:200px; background-color:#f00; position:absolute;top:30px;left:30px;text-align:right}
.matrix_box1 { width:100px; height:100px; background-color:#a0b3d6; transform: matrix(1, 0, 0, 1, 30, 30);position:absolute;top:0;left:0}
</style>
<div id=”matrixBox1″ class=”matrix_box”>我不是matrix</div>
<div id=”matrixBox1″ class=”matrix_box1″>我是matrix</div>

结果如图:

QQ截图20160120112317

 

但是如果涉及到缩放,那么transform跟top、left就不一样了:

将以上transform代码改为transform: matrix(0.5, 0, 0, 0.5, 30, 30);

.matrix_box1 { width:200px; height:200px; background-color:#a0b3d6; transform: matrix(0.5, 0, 0, 0.5, 30, 30);position:absolute;top:0;left:0}

效果如图:

QQ截图20160120112544

造成这种现象的原因是transform: matrix先进行偏移再进行缩放的。

我们将以上代码拆开来看:

首先先不缩放:

.matrix_box1 { width:200px; height:200px; background-color:#a0b3d6; transform: matrix(1, 0, 0, 1, 30, 30);position:absolute;top:0;left:0}

效果如图:

QQ截图20160120112844

两个DIV重合:

接下来再执行缩放:

.matrix_box1 { width:200px; height:200px; background-color:#a0b3d6; transform: matrix(0.5, 0, 0, 0.5, 30, 30);position:absolute;top:0;left:0}

效果如图:

QQ截图20160120112544

从现象中可以看出matrix_box1在原来的基础上的中心点进行缩放了。

所以,transform: matrix平移的时候是以元素左上角作为参考坐标的,所放的时候是以元素中心点为参考坐标的。

由此,我们可以推导出缩放之后元素的top跟left即元素的X\Y坐标公式:

left=x1-(w1-w2)/2;

top=y1-(h1-h2)/2;

w1:缩放前元素宽度;
h1:缩放前元素高度;
w2:元素经matrix缩放后的宽度;
h2:元素经matrix缩放后的高度;
x1:缩放前元素的X坐标;
y1:缩放前元素的Y坐标;
left:元素经matrix平移后的X坐标;
top:元素经matrix平移后的Y坐标;

此处说明一下,如果不缩放的话,根据transform: matrix是能够求出元素平移后的坐标的,ax+cy+e为变换后的水平坐标,bx+dy+f表示变换后的垂直位置(具体信息自行百度)。但是涉及到缩放就不管用了。加入起始坐标是0,0,平移值是30,30,也就是说不管缩放值是多少,通过公式得出的值都是30,30。这跟最终效果是不符的。所以得用以上公式再进一步推导。

未经允许不得转载:前端撸码笔记 » 关于transform:Matrix()偏移缩放后的坐标问题

上一篇:

下一篇: