transform你不知道的那些事

 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
时间: 2024-11-05 18:38:24

transform你不知道的那些事的相关文章

开源 VS 商业,消息中间件你不知道的那些事

11月23日,新炬网络中间件技术专家刘拓老师在DBA+社群中间件用户组进行了一次主题为"开源 VS 商业,消息中间件你不知道的那些事"的线上分享.小编特别整理出其中精华内容,供大家学习交流.  嘉宾简介   新炬网络中间件技术专家 曾任职于IBM华南GTS 4年,IBM WebSphere.MQ.CICS产品线技术专家 5年移动运营商(广东移动.浙江移动)运维经验,3年JAVA开发及售后经验 演讲实录   随着云计算的兴起,Docker.微服务的流行,分布式消息队列技术成为云计算平台中

关于微信,你不知道的那些事?

中介交易 SEO诊断 淘宝客 云主机 技术大厅 关于微信,你不知道的那些事? 别只谈微信自媒体了,好不?别只在媒体圈看微信了,好不?一个自媒体粉丝有多少?一个媒体微信公众号的粉丝能有多少?如果只在圈内,你真的会发现这圈子太小了~ 为啥招行.南航.小米等动则微信粉丝就上百万;还有不敢对外透露的腾讯微生活会员卡,现在粉丝还好几千万了;连最近刚刚冒出来的猎豹浏览器微信一天粉丝就能涨10万,这些大家都知道么? 我们知道,2013年在微信自媒体的盈利模式.内容形式等,我们谈了无数次.自媒体的盈利模式还未清

4G推迟发牌,你不知道的那些事

4G这件事情其实没几个人关心,尤其是普通老百姓,就像当年的3G一样,除了叽叽喳喳的媒体和聒噪的专家,以及其背后的利益集团,真正关心的没几个人. 本来嘛,按照技术的演进路线,按照市场的发展需求,一个市场改发什么牌,什么时候发牌,改给谁发什么牌,都不是什么需要操心的事情,但是这件事情放在我们这个特色的市场经济体里面,就有了不同--精英们总想代表点什么,一副在老百姓面前煞有其事的样子,摆出正儿八经的研究和讨论的嘴脸,总以为自己能够表演的天衣无缝,其实在百姓的眼中也不过是光着屁股的猴子--沐猴而冠罢了.

关于Android bitmap你不知道的一些事_Android

本文为大家分享了Android bitmap使用细节,供大家参考,具体内容如下 1.计算机表示图形的几种方式 1)BMP :几乎不进行压缩 占用空间比较大 2)JPG : 在BMP的基础上对相邻的像素进行压缩,占用空间比BMP小 3)PNG : 在JPG的基础上进一步压缩 占用空间比较小 这是对三种格式进行一个简单的介绍,知道是怎么回事就行,在Android中一般都用png格式的图片,因为他占用空间小 2.图形的大小 图形的大小 = 图片的总像素*每个像素的大小 图片总像素 = 图片的长*图片的

关于热门发明你不知道的那些事

你知道橡皮泥,其实是清洁剂 公司发明的吗?你是最早的充气娃娃构思,居然是出自希特勒之手?你知道风靡世界的魔方,之前其实是建筑学院中的教具吗?你知道如今大街小巷中皆可买到的雪 糕,曾经只能是王宫里才出现的吗?世界真奇妙,平日里我们已经熟悉的那些热门发明,其实背后却有着十分有趣的诞生经历!   魔方     魔方,magic cube 又叫魔术方块,是匈牙利布达佩斯建筑学院鲁比克教授在1974年发明的.当初他发明魔方,仅仅是作为一种帮助学生增强空间思维能力的教学工具.但要使那些小方块可以随意转动而不

EntityFramework之你不知道的那些事(七)

前言 前面一系列几乎都是循序渐进式的进行叙述,似乎脚步走得太快了,于是我开始歇一歇去追寻一些我所不太了解的细枝末节,在此过程中也屡次碰壁,但是唯有如此才能更好的成长,不是吗!希望此文对你亦有帮助. 属性私有化  我们之前有点太循规蹈矩对于模型的建立,所以你才不会遇到问题(当然我也是),也许你大概也这样做过,当建立实体时我们都是建立公有的(public)的,那为什么不试试私有(private)的呢?建立一个学生(Student)类并给其一个私有属性,如下: public class Student

深入了解Linux你不知道的那些事?

建议Linux新手把本教程认真的看完.这是一个开始,肯定有收获.我也是从新手走过来的,一步步了解Linux,安装上Linux,然后成为了一名Linux相关的http://www.aliyun.com/zixun/aggregation/7155.html">开发人员.当然,我更愿意把我的心得与广大Linux学习者分享. 首次接触Linux,应该怎么走? 简单的说,先认识Linux,知道他的一些真实事情,然后了解他的正确安装方法及一些注意事项.当你成功安装上Linux,我的任务算是完成了一大

CSS3的transition和transform

CSS3中的transition和transform是制作HTML5动画一定要使用到的两个属性. 注:这篇文章不考虑兼容性,只讨论webkit核心的浏览器.所以本文的所有例子请用chrome,safari或360极速浏览器看. transition transition对标签的变化过程进行设置.比如我需要将这个图在2s内进行翻转180的动画,就使用到这个了   transition可以配置的属性有: transision-property 要变化的属性,可以的参数请参考:http://www.z

Android自定义view实现电影票在线选座功能_Android

先看看电影票在线选座功能实现的效果图: 界面比较粗糙,主要看原理. 这个界面主要包括以下几部分 1.座位 2.左边的排数 3.左上方的缩略图 4.缩略图中的红色区域 5.手指移动时跟随移动 6.两个手指缩放时跟随缩放 主要技术点 1.矩阵Matrix 2.GestureDetector与ScaleGestureDetector 3.Bitmap的一下基本用法 4.这里只需要重写view的onDraw就可实现全部功能 可以发现这个其实没什么难度,主要就是一些位置的计算. 为了能便于理解首先把要用到