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

推荐订阅源

U
Unit 42
S
Securelist
小众软件
小众软件
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The GitHub Blog
The GitHub Blog
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 司徒正美
博客园 - Franky
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
O
OpenAI News
Cloudbric
Cloudbric
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
MongoDB | Blog
MongoDB | Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
V
V2EX
PCI Perspectives
PCI Perspectives
T
Troy Hunt's Blog
Schneier on Security
Schneier on Security
P
Palo Alto Networks Blog
M
MIT News - Artificial intelligence
V2EX - 技术
V2EX - 技术
阮一峰的网络日志
阮一峰的网络日志
Hacker News - Newest:
Hacker News - Newest: "LLM"
G
Google Developers Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
The Last Watchdog
The Last Watchdog
The Register - Security
The Register - Security
腾讯CDC
N
News and Events Feed by Topic
C
Check Point Blog
爱范儿
爱范儿
T
Tailwind CSS Blog
Webroot Blog
Webroot Blog
P
Proofpoint News Feed
S
Schneier on Security
MyScale Blog
MyScale Blog
N
News | PayPal Newsroom
Recorded Future
Recorded Future
T
Tenable Blog
I
InfoQ
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Microsoft Security Blog
Microsoft Security Blog
Simon Willison's Weblog
Simon Willison's Weblog
Engineering at Meta
Engineering at Meta

囧克斯

奔四了,写给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 发布了! [译]如何成为一名卓越的前端工程师 手机淘宝前端的图片相关工作流程梳理 [译]如何让办公室政治最小化 Vue.js 源码学习笔记 从原型到发布——“团队时间线” 1.0 开发心得 Vue + webpack 项目实践 用 Koa 写服务体验 webcomponents 笔记 之 配置管理 小秀个人的13~14年摄影作品 (共19张) 由今年D2前端论坛想到的 [译]CSS命名神马的真心难 [译]Git 分支的最佳实践 [译]撰写可测试的 JavaScript [译]语义化版本管理 [译]通过HTML5 Canvas API调节图像的亮度和颜色 [译]JavaScript V8性能小贴士 [译]视觉差,走起! [译]Chrome开发者工具中评估性能的五大新特性 精气神儿 细节无微不至,彩屏让人又爱又恨——新老“神机”大对决:Nokia 1050 vs Nokia 1202 秦升拿到红牌之后…… 用Sass重新整理自己的博客主题样式 Connect中间件使用手册 巧用 RequireJS Optimizer 给传统的前端项目打包 编辑器小调查结果 [译]JSLint 文档 烟火——写给蛇年的傲游和我 小秀个人的全年摄影作品 (共15张) 2012年终毫无正能量的总结 标签?ID?还是CLASS? 微创新=伪创新 HTML5峰会归来 分享bookmarklet一则:随意阅读 国际羽联和中国队之间的恶性循环 ZeroClipboard 学习笔记 “思考人生” 听杨东杰弹吉他 学习精髓 网站装修笔记20120426 网站装修笔记20120414 网站装修笔记20120406 分享Typecho插件:百度统计助手 我的得奖感言 网站装修笔记20120331 用CSS3制作尖角标签按钮样式 分享Typecho插件:Markdown 解析器 + 编辑器 分享Typecho皮肤:我的字很大 汇总自己过去的一些HTML5科普文章 html5中的消息通信简介 + 我的新网站开张 网站装修计划 Typed Arrays 是神马? 文明看球 HTML5中的文件处理 之 File Writer API HTML5中的文件处理 之 File API 独生子女、互相等和不耐烦 IndexedDB技术简介(四) IndexedDB技术简介(三) IndexedDB技术简介(二) IndexedDB技术简介(一) 把博客的字体进一步调大,同时去掉了侧边栏 “模仿别人是为了找到自己” 写给我未婚妻的2011年 写给自己的2011年 手把手教你入门EaselJS做HTML5动画 “吃了吧,不吃就浪费了” 写给傲游的2011年 所谓专业 写给HTML5的2011年 对HTML5中LocalStorage的一些使用建议 回味一下我2011年看到的最过瘾的5场足球比赛 浅浅浅谈开饭店被顾客吃出“异物”的用户体验 前端的本职
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就非常好理解了!