transform是诸多css3新特性中最打动我的,因为它让方方正正的box module变得真实了。

transform通过一组函数实现了对盒子大小、位置、角度的2D或者3D变换。不过很长时间内,我对以下问题都想不太明白:

1、尺寸缩放scalezoom变换有何不同,为什么被scale的盒子里的内容不会错位,但zoom不是。

2、位移(transform:translate)与相对定位、绝对定位(position:relative | absolute)有何关系?

3、在实际项目中发现,位图(无论是background-image还是img)在被transform后会模糊掉,尤其是scale;不仅如此,在一些网站,比如tmall.com,即使是矢量的svg文件在使用transform后,依然模糊了,transform是否对作用的盒子进行了类似栅格化的操作?

4、在实际项目中发现,如果父级元素使用了transform且其中的子元素进行了position:fixed定位,那么设置了position:fixed的子元素将不再基于窗口定位。

5、这种场景暂时未能重现,在chrome下:父级元素使用了position:fixed,子元素<a href=".."></a>设置了:hover伪类、transition过渡动画、并使用javascript动态添加/删除其class,此时会出现:hover样式失效或添加的class样式失效且transition过渡动画失效的现象。

等等。

先说原理吧。

在网上查看了一些大神的博客,transform是通过一系列矩阵变换完成的,scale等transform-function都是对matrix的封装,w3c里没找到有关说明。对于线性代数里的东西,博主表示非常小白,其中的数学原理,还是交给其他人去解释吧o(︶︿︶)o

w3里的解释是,transform基于可视化格式模型(visual formatting model,这样翻译对不对啊)并为其绘制出一个坐标系,而且所有在这个坐标系内进行的操作,如向右向下,都是在这个坐标系内以像素方式表示,原文:

The CSS visual formatting model describes a coordinate system within each element is positioned. Positions and sizes in this coordinate space can be thought of as being expressed in pixels, starting in the origin of point with positive values proceeding to the right and down.

那是不是意味着scale缩放,是否只是像素意义上的缩放呢?由此,因缩放导致的svg等矢量内容模糊失真是情理之中了??_?

个人猜测,应该先转换成像素,然后进行渲染,这应该和每个浏览器具体渲染过程有关,相关文档我没有查,如果有知道的,请给我留言。

要理解transform,还有一个事情要搞清楚,就是visual formatting model,借助谷歌度娘,找到了w3chelp上的中文版解释:

可视化格式模型是非常抽象的概念。它是 CSS 布局的核心,通过它,框( box )可以获得应有的尺寸,放到需要的位置。

我们通常所看到的页面都是平面 2D 的效果,但可视化模型却是 3D 的,除了 X 轴,Y 轴,还有决定元素显示顺序1的 Z 轴。 Z 轴垂直穿过计算机屏幕,面向用户的一侧是正轴,框在 Z 轴方向上离用户越近,显示越是靠前。

可视化格式模型的官方说法是,它规定了用户端在媒介中如何处理文档树( document tree )

……

本部分会涉及很多新概念,如包含块、元素的类型、定位体系、块级格式化上下文、行内格式化上下文、浮动、绝对定位和 z-index,以及可视化格式模型的细节部分,自动宽度高度的计算等。

博主第一次听到visual formatting model这个概念,但看了解释应该知道,这不是一个新概念,姿势水平捉急了?_?

根据这个解释,元素设置了transform并不会改变元素所在的文档流,其布局仍然受盒模型支配,因此这里的变换的效果是可以与浮动、定位并存的。

  • 当元素设置了transform后,会为该元素定义一个坐标系,并且在该坐标系内进行矩阵变换,将变换结果映射到用户坐标系(也就是实际上的上下文)中。

  • 多个矩阵变换函数将依次从左到右计算,如transform:translate(80px, 80px) scale(1.5, 1.5),浏览器会先计算位移,再缩放1.5倍。以下两种代码效果相同:

    html <div style="transform: translate(80px, 80px)"> <div style="transform: scale(1.5, 1.5)"> <div style="transform: rotate(45deg)"></div> </div> </div>

    html <div style="transform: translate(80px, 80px) scale(1.5, 1.5) rotate(45deg);"> </div>

  • 坐标原点的位置受属性 transform-origin的影响。

  • 如果是3D变换,则还会将其加入一个3D渲染上下文(3D rendering context)。根据个人理解,无论有多少个转换为3D的元素,其将始终在这个上下文内并可能相互影响,类似一个文档中的多个被绝对定位的元素。

  • 任何非none的transform值都会导致一个堆叠上下文(stacking context)和包含块(containing block)的创建。

不过,并不意味着和谐,不然怎么会有那么多坑问题嘛!(,,?▽?,,)

如果元素因为transform而撑开了父级元素,父级元素会根据自身的overflow属性决定是否出现滚动条、隐藏溢出的部分或是别的什么。

另外,根据规范,由于堆叠上下文的创建,该元素会影响其子元素的固定定位:被设置position:fixed的子元素将不会基于viewport定位,而是基于这个父元素。

我们知道,一般情况下,所有的position值不为static的元素都会被放到同一个堆叠上下文内(ie不高级浏览器不算),也就是说,只存在 一个堆叠上下文。而设置了transform的元素则不同,由于它创建了一个新的堆叠上下文,也就是说,其内部被定位的元素的z-index会放在一个完 全独立的空间内。

但是这个堆叠上下文不包含被定义transform的元素本身,它仍被放在更大的堆叠上下文(如果有的话)里。

说到这,开篇提到的问题2、4都已经找到答案了,但目前,Chrome还存在一个bug:rendering bug : position:fixed AND -webkit-transform。

上面提得另一个问题重现场景比较麻烦,先不讨论了。

留几个坑回头填:

  • transform 遇见 display:table | table-row | table-cell
  • 3D渲染上下文是个什么玩意
  • 陌生又熟悉的backface-visibility
  • transform 与 css3动画
  • transform 与 canvas
  • transform 与 svg

转载于:https://www.cnblogs.com/gyjWEB/p/4832998.html

transform你不知道的那些事相关推荐

  1. java 静态代码块_关于Java你不知道的那些事之代码块

    前言 普通代码块:在方法或语句中出现的{},就被称为代码块 静态代码块:静态代码块有且仅加载一次,也就是在这个类被加载至内存的时候 普通代码块和一般语句执行顺序由他们在代码中出现的次序决定,先出现先执 ...

  2. 看完就会明白windows RT推出的原因、它和window 8到底有些什么区别、微软有什么战略企图--有关于微软Windows RT 你不知道的那些事

    关于微软Windows RT 你不知道的那些事 Microsoft与Windows这两个单词对于个人电脑用户而言可以说无人不知,最初的微软Windows系统仅是PC端为用户提供办公与生活的操作系统软件 ...

  3. 关于系统架构你不知道的那些事-架构设计流程:评估和选择备选方案

    关于系统架构你不知道的那些事-架构设计流程:评估和选择备选方案 前言 架构设计第 3 步:评估和选择备选方案 评估和选择备选方案实战 备选方案 1:采用开源 Kafka 方案 备选方案 2:集群 + ...

  4. 关于系统架构你不知道的那些事-架构设计流程:设计备选方案

    关于系统架构你不知道的那些事-架构设计流程:设计备选方案 前言 架构设计第 2 步:设计备选方案 第一种常见的错误:设计最优秀的方案. 第二种常见的错误:只做一个方案. 第三种常见的错误:备选方案过于 ...

  5. 读研期间学计算机,你不知道的考研事之读研期间学习生活大揭秘(学习篇)

    随着各大院校考研复试的陆续进行,研究生招生阶段也逐渐进入尾声.接下来一批又一批努力而优秀的同学在经过备考.初试.复试的洗礼也将步入令人振奋的研究生阶段,开启人生的新篇章.这既是对于奋发拼搏精神的总结和 ...

  6. 北京指标公户你不知道的那些事

    北京指标公户你不知道的那些事,不看后悔哦 自从北京实施机动车限号政策到现在 北京小客车指标摇号命中率真是"镜中花,水中月"可望而不可即来形容了 小编亲身经历过37期摇号的客户,对此 ...

  7. 关于移动广告平台,你不知道的那些事

    移动互联网进入存量博弈时代. 智能手机出货量下降,用户增速放缓,用户时长逐渐见顶--营销人员纷纷采取更加激进的广告营销策略获取用户. 但面对日益繁多的移动广告平台,广告主在选择变多的同时也对其选择高效 ...

  8. java compare 返回值_关于Java你不知道的那些事之Java8新特性[Lambda表达式和函数式接口]...

    前言 为什么要用Lambda表达式? Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,将代码像数据一样传递,这样可以写出更简洁.更灵活的代码,作为一个更紧凑的代码风 ...

  9. Asp.Net Core 中间件应用实战中你不知道的那些事

    一.概述 这篇文章主要分享Endpoint 终结点路由的中间件的应用场景及实践案例,不讲述其工作原理,如果需要了解工作原理的同学, 可以点击查看以下两篇解读文章: •Asp.Net Core EndP ...

最新文章

  1. php手工注入语句,PHP+MySQL 手工注入语句大全
  2. 分析拼多多的崛起【产品思维】
  3. CodeForces 1361E James and the Chase(dfs + 结论)
  4. MonoRail学习-介绍篇(一)
  5. 多重异常处理 java
  6. Linux入门学习(七)
  7. Android 功耗(10)---如何测试 Mediatek 平台各个场景的功耗数据?
  8. js等待5秒后执行_厦门同安首台智能垃圾分类回收柜机投用 扫二维码5秒后回收变现...
  9. Angular官方教程采坑
  10. Python的数学计算库scipy介绍
  11. TCP长连接和短连接的区别(好文章!)
  12. Win7下Hyenae的安装
  13. Google网站流量统计工具
  14. 环信开发的坑(环信客户互动云)
  15. 华清远见上海中心22071班
  16. Uniapp 制作海报功能
  17. 听完“Java 教父”李刚的分享,我总结了两点建议
  18. Shufti Pro宣布获得2000万美元A轮融资以加速发展
  19. 计算机组成原理包健百度云,计算机组成原理包健版的答案解析.doc
  20. 前端 用nginx解决js跨域问题

热门文章

  1. 程序员发展应该尽早明白13个道理
  2. 征信逾期花钱就能修复?小心跳进骗子的坑里面去
  3. 大额存单20万起存,一次性存入40万能得到双倍利息吗?
  4. Pushing Policy Failed because Checkpoint Firewall “Load on module failed – no memory”
  5. 菜鸟做设计必看!有关如何做设计的整体思路,以及能否综合的笔记
  6. spi flash驱动
  7. 实现mvcc_一文读懂 etcd 的 mvcc 实现
  8. mysql第四章分页显示查询出租房屋信息_MYSQL必知必会读书笔记第四章之检索数据...
  9. idea创建springboot项目+mybatis_Spring Boot + MyBatis 多模块项目搭建教程
  10. postgresql是如何求年龄的_Postgresql 通过出生日期获取年龄的操作