CSS Transform

CSS Transform(上:2D Transform)

前言及Transform 基本介绍

MDN官方文档介绍:CSS中transform 属性允许你修改CSS可视化模型的坐标空间。通过transform,可以让元素进行移动(translate)、旋转(rotate)、缩放(scale)、拉伸(skew)。本文主要介绍2D transform的基本用法及其属性的原理。

浏览器兼容性

  • Internet Explorer 10、Firefox、Opera 支持 transform 属性
  • Internet Explorer 9 支持替代的 -ms-transform 属性(仅适用于 2D 变换)。
  • Safari 和 Chrome 支持替代的 -webkit-transform 属性(3D 和 2D 变换)。
  • Opera 只支持 2D 变换。

属性

skew

  • transform: skew(ax,ay)元素在X轴和Y轴负方向以指定的角度拉伸
  • transform: skew(ax)元素在X轴负方向以指定的角度拉伸
  • transform: skewX(ax)在X轴负方向以指定的角度拉伸
  • transform: skewY(ay)在Y轴负方向以指定的角度拉伸
    ax为x方向的角度,ay为y方向的角度,如:
  • transform: skew(20deg, 20deg);
  • transform: skew(2rad, 1.8rad);
  • transform: skew(20deg);
  • transform: skew(-20deg)
    demo在此

rotate
绕着Transform-origin点顺时针旋转,中心点初始值为50% 50%

  • transform: rotate(<angle>)
  • transform: rotate('a'turn)角度为'a' * 360°,'a'为小于1的数。例如transform: rotate(0.5turn)transform: rotate(180deg)

demo在此

目前Chrome 38+/ Opera 25+ ,我们还可以使用calc() 属性,例如transform: rotate(calc(0.25turn - 30deg))

skew和rotate的异同:

  • 接受的参数单位都是角度,如20deg,1rad;
  • skew接受两个参数或一个参数,rotate的语法是:transform: rotate(<angle>);
  • skew会使元素变形,rotate不会

translate

  • transform:translate(tx[, ty])在X轴\Y轴平移指定距离,用向量[tx, ty]完成2D平移,若没有ty则默认为0
  • transform:translateX(tx)沿X轴正方向平移指定距离
  • transform:translateY(ty)沿Y轴正方向平移指定距离
    tx\ty的单位可以为px\百分比。
    demo在此

scale

  • transform: scale(sx[, sy]);由[sx, sy]描述指定一个二维缩放操作。如果sy 未指定,默认认为和sx的值相同
  • transform: scaleX(sx);使用向量[sx, 1] 完成在X方向上的缩放.
  • transform: scaleY(sy);使用向量[1, sy] 完成在Y方向的缩放.
    transform-origin(初始值为50% 50%)为中心点进行缩放,向量坐标值大于1或小于-1时,在相应方向放大,坐标值处于区间(-1, 1)时缩小,值为1时不做变化。如果缩放向量的两个坐标是相等的,那么X和Y方向的缩放是均等的,所以元素的形状被保持。
    demo在此

ps: transform: scale(-1)可以实现180°镜像对称效果

matrix

  • 语法:transform: matrix(a, c, b, d, tx, ty)

  • a, c, b, d是一个二维矩阵:
    ┌ a b ┐
    └ c d ┘
    tx, ty就是基于X和Y坐标重新定位元素。

  • 用法:设变换的中心点为(x,y),长度值tx、ty创建向量[tx,ty],a,b,c,d,tx,ty创建矩阵


变换后的中心点坐标(x’, y’)


举个例子:transform: matrix(1, 0, 0, 1, 20, 20) 变换后的中心点横纵坐标:x' = 1 * 0 + 0 * 0 + 20 = 20, y' = 0 * 0 + 0 * 1 + 20 = 20,中心点坐标(0, 0) → (20, 20)
demo
因为中心点坐标初始值为(0, 0),则变换后的中心点坐标为(tx, ty),相当于用向量[tx,ty]进行坐标变换。transform:matrix(a, c, b, d, tx, ty)的变换效果等同于transform: translate(tx, ty), abcd的值与变换无关。
注意translate的参数需要单位,而matrix的参数的单位可省略。

Multiple values 同时使用多个属性

如```
.element{
width: 100px;
height: 200px;
transform: scale(2) skew(-20deg);
}

[demo](http://codepen.io/cruyun/pen/zZwWgP)
[CSS Tricks](https://css-tricks.com/almanac/properties/t/transform/) 提到:It’s worth noting that there is an order in which these transforms will be carried out, in the example above `skew` will be performed first and then the element will be scaled.

##Matrix与skew、scale、rotate、translate
**skew与matrix**、
`transform: matrix(1 tan(θy) tan(θx) 1 0 0)`的变换效果等同于`transform: skew( α + θx,  β + θy)`
设元素的原坐标为(x, y),进行matrix变换:![](http://upload-images.jianshu.io/upload_images/4938344-242de94fa8b90ce1.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

变换后的横坐标x' = x+y*tan(θx) ,纵坐标y' = x*tan(θy)+y

**scale与matrix**
`transform: matrix(sx 0 0 sy 0 0)`的变换效果等同于 `transform: scale(sx, sy)`
设元素的原坐标为(x, y),进行matrix变换:![](http://upload-images.jianshu.io/upload_images/4938344-5d205362d2069c34.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
变换后的元素坐标为(sx * x; sy * y),即x和y变为原来的sx、sy倍。

**rotate与matrix**
`transform: matrix(cosα sinα -sinα cosα 0 0)`的变换效果等同于`transform: rotate(α)`
设元素的原坐标为(x, y),进行matrix变换:![](http://upload-images.jianshu.io/upload_images/4938344-30b97e0090aae128.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
变换后的横纵坐标分别为x' = x * cosα - y * sinα, y' = x * sinα + y * cosα

**translate与matrix**
`transform: matrix(1 0 0 1 tx ty)`的变换效果等同于`transform: translate(tx, ty)`,上文已证。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Transform字面上就是变形,改变的意思。在CSS3中transform主要包括以下几种:旋转rotate、扭...
    hzrWeber阅读 22,120评论 0 19
  • 看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印象,因...
    DCbryant阅读 1,857评论 0 4
  • byzhangxinxufromhttp://www.zhangxinxu.com 本文地址:http://www...
    凌雲木阅读 7,170评论 0 8
  • 最近在学习CSS动画相关的知识,于是连带着把会用到的一些知识点进行了一些整理。在此,做一下总结。 Transfor...
    SCQ000阅读 7,091评论 0 51
  • 语法 transform:none|<transform-function>+ (1)rotate()旋转角度 r...
    april_Dong阅读 483评论 0 0