惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
有赞技术团队
有赞技术团队
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
大猫的无限游戏
大猫的无限游戏
博客园 - 司徒正美
S
SegmentFault 最新的问题
Jina AI
Jina AI
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
小众软件
小众软件
WordPress大学
WordPress大学
爱范儿
爱范儿
博客园 - Franky
量子位
V
V2EX
Apple Machine Learning Research
Apple Machine Learning Research
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网

囧克斯

奔四了,写给40岁的自己 有序退网 我和 Vue.js 的十年 我参与《代码之外 Beyond Code》的故事 博客站迁移至 VitePress 的备忘 写给我的奶奶 中文格式化小工具 zhlint 及其开发心得 vue-mark-display:用 markdown 语法轻松撰写幻灯片 我对技术会议的一些看法 VueConf Hangzhou 见闻 第四届 CSSConf CN 见闻 [译]Web 表单的未来 [译]苹果正在做一些他们的程序员明摆着不想要的东西 [译]为什么我不会无偿加班且你也不应该 [译]如果管理是唯一可走的路,那就完蛋了 [译]如何撰写 Git 提交信息 [译]C 程序的原则 Vue 2.0 来了! Weex 近 4 个月的开源之路 Weex 在 JS Runtime 内的多实例管理 我理解的 SPA 我理解的 Flux 架构 【整理】Vue 2.0 自 beta 1 到 beta 4 以来的主要更新 通过一张图走进 Vue 2.0 Code Review for Vue 2.0 Preview Vue 2.0 发布啦! 务实的小而美 Vue.js 1.0.0 发布了! [译]如何成为一名卓越的前端工程师 手机淘宝前端的图片相关工作流程梳理
CSS 3 中的 Transform 用法,含Matrix(注意:不是黑客帝国里...
勾三股四 · 2011-02-23 · via 囧克斯

本文摘自 勾三股四 更早时期的 不老歌 博客。


transform-origin

首先,图形在变形(transform)之前,需要确定一个中心(origin),在SVG、CSS中,默认的中心都是坐标原点(0,0)。如果需要自定义中心,则可以使用transform-origin属性:

Name:           transform-origin
Value:          [ [ <percentage> | <length> | left | center | right ]
                  [ <percentage> | <length> | top | center | bottom ]? ] |
                  [ [ left | center | right ] || [ top | center | bottom ] ]
Initial:        50% 50%
Applies to:     block-level and inline-level elements
Inherited:      no
Percentages:    refer to the size of the element's box
Media:          visual
Computed value: For <length> the absolute value, otherwise a percentage

然后就是平移(translate)、拉伸(scale)、倾斜(skew)和旋转(rotate)了,这些东西通通使用transform属性来控制:

transform

Name:           transform
Value:          none | <transform-function> [ <transform-function> ]*
Initial:        none
Applies to:     block-level and inline-level elements
Inherited:      no
Percentages:    refer to the size of the element's box
Media:          visual
Computed value: Same as specified value.

这里面的transform-function就包含了这四种:

  • translate:平移,有translate(value[, value])、translateX(value)、translateY(value)三种写法,表示要平移的横纵坐标,很好理解。
  • scale:缩放的比例,有scale(number[, number])、scaleX(number)、scaleY(number)三种写法,里面的number参数分别表示了横向、纵向需要缩放的比例,比如1为不缩放,2为放大1倍,0.5为缩小一倍等等
  • skew:倾斜的比例,同样有skew(angle[, angle])、skewX(angle)、skewY(angle)三种写法。里面的angle参数分别表示横坐标、纵坐标要分别顺时针旋转多少度,比如skewX(45deg)表示横坐标顺时针旋转45度,可以把一个矩形变成一个锐角45度的平行四边形。
  • rotate:旋转,只有一种写法rotate(angle),表示顺时针旋转的角度。

这四个东东可以写在同一个css属性里,比如:

<div style="transform:translate(-10px,-20px) scale(2) rotate(45deg) translate(5px,10px)"/>

它的效果相当于:

<div style="transform:translate(-10px,-20px)">
  <div style="transform:scale(2)">
    <div style="transform:rotate(45deg)">
      <div style="transform:translate(5px,10px)">
      </div>
    </div>
  </div>
</div>

相信关注css3的童鞋对上面的这些东西并不陌生,没有关注过css3的童鞋,估计看过上面的描述,也可以很快的理解和掌握这些用法。

不过这些变换如果比较复杂,有没有更简单的写法呢?当然有了,这才是我今天要重点介绍的东西:

transform: matrix

matrix的写法很吓人:

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

相信很多人看过之后就蒙了,不知道这是啥意思。我自己就是这种情况,一直知道有个matrix,但是始终没有勇气尝试。
今天看到那本SVG的书,用相对通俗易懂的方式讲解了matrix这个东西,让我突然对自己有信心了,于是把我的理解分享给大家。
首先matrix里的6个参数会帮助我们构建一个3*3的矩阵……呃,还记得你们大学学过的线性代数么?就是那个可以点乘和叉乘的东东——没错,稍后会涉及到点乘的概念,不过不清楚也别担心,我会把它转化成代数方程,很好理解。
这个矩阵长这样:

|a c e|
|b d f|
|0 0 1|

原来图形中的每一个点(x, y)的新位置都是经过这个矩阵计算出来的(x', y'),大概的公示是:

|x|   |a c e|   |x'|
|y| = |b d f| . |y'|
|1|   |0 0 1|   |1 |

这个算是matrix的基本算法,进一步剖析之后,我们会发现:

  • 默认的matrix值为matrix(1, 0, 0, 1, 0, 0),即变换之后x和y没有变化;
  • e和f其实就是平移变换translate的两个参数,即translate(e, f)相当于matrix(1, 0, 0, 1, e, f);
  • a和d其实就是伸缩变换scale的两个参数,即scale(a, d)相当于matrix(a, 0, 0, d, 0, 0);
  • a、b、c和d共同促成了旋转变换,这个稍微有点复杂,但也是一看就懂:
    rotate(a)不难求证,相当于matrix(cos_a, sin_a, -sin_a, cos_a, 0, 0);
  • 旋转变换其实是特殊的倾斜变换加缩放,如果分解成倾斜变换,也不难求证:
    skewX(a)相当于matrix(1, 0, tan_a, 1, 0, 0);
    skewY(a)相当于matrix(1, tan_a, 0, 1, 0, 0);

所以,matrix其实是对多重旋转、缩放、平移等变换的合计缩写。有点transform雪碧的意思哈 O(∩_∩)O~

最后附一个css 3 transform的玩具:http://www.css88.com/tool/css3Preview/Transform.html,你可以在左侧的“变形参数”区域自由的调整matrix中a~f的值,右侧的div自然会随之变换,随便改一改那些属性值看看预览效果,matrix就非常好理解了!