简单粗暴的解释css3中的transform属性

事先说明,本文范畴尚限制在2D的transform中。

对于css3的transform属性,真是爱不释手,有了这个特性,各种特效轻松搞定。引用一句歌词“旋转,跳跃,我不停歇”。transform就是这么时尚,就是这么任性。当然他任性的地方不只是在功能方面,还有在使用方面。我们看一下W3C官网中关于transform 2D的使用介绍。

看着有点多,首先先来分类一下:一个matrix,三个translate,三个scale,三个skew,一个rotate。而三个translate中又分为针对于XY,X,Y三样。对于这几个操作之间的关系,我画了一张图来粗暴的展现。

看到这也许有人疑惑为什么matrix会在其他所有操作的最顶端,其实除了matrix的其他操作都是属于对matrix的一个拓展,什么意思呢?translate、scale、skew和rotate这几个操作都是拿出来给不懂matrix原理的人用的,怕你不懂原理,所以封装了几个方法出来,让你便捷的使用matrix方法。何以证明?有兴趣的童鞋可以去查看该元素的样式(注:不是class规则,是计算后的样式),或者输出该元素的transform属性。看看是不是得到都是统一的matrix的结果,类似于:

matrix(1, 0.466307658154999, 0, 1, 0, 0)

不罗嗦了,既然这是个操作最终都是归于matrix,那么他们之间的关系是什么呢?如果我用矩阵的知识告诉大家是如何计算的,就不符合本文的标题了,而且这类文章已经有很多了,我也就不献丑了,还是坚持标题的原则:简单粗暴的解释。

首先说translate,翻译过来就是“转移”。首先解释一下translate的语法:

transform:translate(25px,26px)

,意思是向右向下各位移25像素和26像素,然后我们转换为matrix的语法来看这行语句:

transform: matrix(1, 0, 0, 1, 25, 26);

眼尖的童鞋应该已经发现问题了,最后的25和26就代表了X轴和Y轴的位移有兴趣的童鞋可以自己去尝试分别的X位移和Y位移,这里不拿来占篇幅了,当然这里还要强调一下transform的初始值,也就是没有任何转换的时候matrix的默认值是:transform: matrix(1, 0, 0, 1, 0, 0);,以免下面的解释大家看不懂。

然后再就是scale,我习惯翻译成“缩放”,这样翻译也是对应于他的功能:缩放组件。演示一下语法:

transform:scale(1.1,1.2);

同样我们看一下转换成matrix格式的语句:

  transform: matrix(1.1, 0, 0, 1.2, 0, 0);

显而易见,这里的X的缩放和Y轴的缩放分别对应matrix中的第一个值和第四个值,他们的值对应的所表达的意思是放大多少倍。还是一样,针对于X轴和Y轴的单独测试就不做了。

我们再来看看skew,我给翻译成“倾斜”,skew的功能就是让组件倾斜一定的角度,可以用来画平行四边形,向之前有见过“带惯性运动”的就是通过这个实现的,演示Skew用单个来演示比较靠谱

transform: skewX(45deg);
transform: skewY(45deg);

对应matrix格式的语句是:

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

发现问题了吗?X向倾斜对应的是改变第三个值,Y向倾斜对应的是改变第2个值,然后我来解释一下这个值的意思,这个值就是需要偏转的角度的tan值,需要旋转45°角,对应的就是1了,有兴趣可以试试其他值来验证。

到此,我们就了解了matrix的六个值分别代表的意义:

第一个元素:X轴放大倍数

第二个元素:Y向倾斜角度的tan值

第三个元素:X向倾斜角度的tan值

第四个元素:Y轴放大的备注

第五个元素:向右偏移的像素大小

第六个元素:向下偏移的像素大小。

说到这里还不算完,还有一个ratate没有解释,在解释之前先看一个插图:

这两幅图看起来效果差不多是吗?确实差不多,不过不同的地方在于上面的图是通过rotate实现的,而下面的图是通过skew实现的,就是旋转45度角了,分别拿两个生成后的样式来看:

  transform: matrix(0.707106781186548, 0.707106781186548, -0.707106781186548, 0.707106781186548, 0, 0);
transform: matrix(1, 0.466307658154999, 0.466307658154999, 1, 0, 0);

看到这,很多人的疑问就出来了,这一堆小数点分别是什么?上面的0.7指的是 根号2 分之一,也就是cos45°或者sin45°,那么这两种计算方式究竟是怎么回事呢?这得回到matrix实现的原理上去解释,我简单的说下transform的原理:首先寻找一个中心点(默认是最中间),然后计算每个像素相对于该点的坐标(100*100的左上角就是-50,50),然后获取matrix传入的六个值和0,0,1组成一个新的矩阵,再和原坐标组成的矩阵进行运算得到一个新的矩阵,然后再在新的矩阵中获取新的X坐标和新的Y坐标。

好吧,说成这样已经不简单了,有点偏离我的标题,还是简单粗暴来解释了,上面matrix替换为:(a,b,c,d,e,f)六个值,然后根据中心点计算每个像素的相对坐标,然后计算新的坐标,新坐标的计算公式为:

x‘ = a * x + c * y + e;  y‘ = b * x + d * y + f;在rotate的时候传入的分别是cosθ,sinθ,sinθ和cosθ,而skew传入的值则是:cosθ/consθ
, sinθ/cosθ , sinθ/cosθ , cosθ/cosθ。所以这也是为什么在使用skew进行旋转的时候图像会放大了根号2倍。

其实正常情况下,使用前面说的六种计算方式来使用matrix公式就够用了本文最后面这部分仅是为了文章的完整性而写,却反倒失去了简单粗暴的原则。

时间: 2024-09-29 23:33:09

简单粗暴的解释css3中的transform属性的相关文章

css3中的部分属性

1.阴影box-shadow:x轴偏移量 y轴偏移量 [阴影模糊半径] [阴影扩展半径] [阴影颜色] [投影方式] 注意:inset(内阴影) 可以写在参数的第一个或最后一个,其它位置是无效的实例 正值表示在对象的底部,负值表示在对象的顶部. .boxshadow-outset{ width:100px; height:100px; box-shadow:4px 4px 6px blue,4px 4px 6px red inset; } .boxshadow-inset{ width:100p

如何快速简单粗暴地理解Python中的if __name__ == '__main__'

1. 摘要 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明'):在你自己眼中,你是你自己(__name__ == '__main__'). if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行:当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行. 2. 程序入口

c33中的transform属性

css3的transform属性 1.旋转: transform:rotate(45deg); 该语句使div元素顺时针旋转45度.deg是CSS 3的"Values and Units"模块中定义的一个角度单位 2.缩放: transform:scale(0.8,1); 使用缩放的方法实现文字或图像的缩放效果,在参数中指定缩放倍率.该语句使用scale方法使该元素在水平方向上缩小了20%,垂直方向上不缩放. 3.倾斜: transform:skew(30deg,0deg); 该实例通

css3中的animation属性

作用:通过给元素添加animation属性,可以赋予该元素动画效果. <!DOCTYPE html><html>    <head>        <style>           div{width:100px;height:100px;background:red;animation:my 5s;}          @keyframes my         {              0%{background:red;width:100px;}

CSS3中的transform

CSS3 转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸. transform 在2D里主要是4个方法.除了rotate 其他都是接受x y值 translate skew rotate scale Translate:元素从其当前位置移动,根据给定的 left(x 坐标) 和 top(y 坐标)  transform: translate(100px, 50px); Skew:x,y有分别的方法. x 变化就是左右的倾斜 x 变化是 上下的倾斜 skewX(10deg) skewY(80

CSS3中的Transition属性详解(贝赛尔曲线)

transition语法: 1 transition : [<'transition-property'> || <'transition-duration'> || 2 <'transition-timing-function'> || <'transition-delay'> [, [<'transition-property'> || 3 <'transition-duration'> || <'transition-ti

CSS3中的transition属性详解

一.语法 transition: property duration timing-function delay transition属性是个复合属性,她包括以下几个子属性: transition-property :规定设置过渡效果的css属性名称 transition-duration :规定完成过渡效果需要多少秒或毫秒 transition-timing-function :指定过渡函数,规定速度效果的速度曲线 transition-delay :指定开始出现的延迟时间 默认值分别为:al

CSS3中的一些属性

1.可匹配部分字符串 1 /*^运算符,匹配字符串首部*/ 2 a[href^='http://website'] 3 /*$运算符,匹配字符串尾部*/ 4 a[href$='.png'] 5 /* *运算符 匹配任意位置的子字符串*/ 6 a[href*='google'] 2. box-sizing属性 可使用box-sizing属性选择盒子模型:border-box; content-box(默认); padding-box CSS3背景提供了 两个新属性:background-clip

CSS3 中的 box-sizing属性

语法: box-sizing: content-text | border-box | inherit; content-box(默认): 宽度和高度分别应用元素的内容框:在宽度和高度之外绘制元素的内边距和边框. border-box: 为元素设定的宽度和高度决定了元素的边框盒:就是说,为元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制:通过从已设定的宽度和高度分别减去边框和内边距才能得到内容的宽度和高度. inherit: 规定从父元素继承box-sizing属性的值. 示例: c