CSS3transform介绍

CSS里transform变形这个属性有点学习难度,尤其在CSS3里加上了3D效果之后,2维变3维学习成本更是成倍提高。为什么设计师的眼里饱含着泪水,因为对页面效果爱的深沉。本篇就介绍一下transform。(擎天柱:Autobottransform!)

transform本质上是一系列变形函数,分别是translate位移,scale缩放,rotate旋转,skew扭曲,matrix矩阵。戒骄戒躁,我们一个个讲。

前置属性:

transform-origin

transform-style

perspective

perspective-origin

backface-visibility

2D变形:

translate

scale

rotate

skew

matrix

3D变形:

translate3d

scale3d

rotate3d

matrix3d

层级影响

用于指定元素变形的中心点。默认中心点就是元素的正中心,即XYZ轴的50%50%0处。可以通过该属性改变元素在XYZ轴的中心点,正值表示正向位移,负值表示负向位移。(XYZ轴的正向分别是往右,往下,靠近用户眼睛。反之为反向)

表示2维的x-offset/y-offset可以设px值也可以设%百分比,也可设top/right/bottom/left/center等keyword。表示3维的z-offset只能设px值,不能设%百分比,也没有keyword。

默认中心点在元素正中心,因此关键字top等价于topcenter等价于50%0%(x轴仍旧留在50%处,y轴位移到0%处)。同理各关键字例如right等价于rightcenter等价于100%50%,不多赘述。

一图胜千言:为图片设置不同的中心点后,看它们旋转,扭曲,缩放的效果。例如图1表头的第一行center表示transform-origin:center。第二行rotate(30deg);表示transform:rotate(30deg);。

另外transform-origin指定变形中心点对translate位移没有影响。translate位移始终相对于元素正中心进行位移,有怀疑精神的可以自己试一下。

其实transform-origin只是一个语法糖而已,你总是可以用translate来代替它。每个transform-origin都可以被两个translate模拟出来(byCSS变形规范的编辑AryehGregor)。例如:

transform:rotate(30deg);transform-origin:200px300px;//等价于transform:translate(200px,300px)rotate(30deg)translate(-200px,-300px);transform-origin:00;transform-style这个属性比较简单只有两个值flat和preserve-3d。用于指定舞台为2D或3D,默认值flat表示2D舞台,所有子元素2D层面展现。preserve-3d看名字就知道了表示3D舞台,所有子元素在3D层面展现。注意,在变形元素自身上指定该属性是没有用的,它用于指定舞台,所以要在变形元素的父元素上设置该属性。设定后,所有子元素共享该舞台。一图胜千言:

.div1{float:left;background-color:red;transform:perspective(200px)rotateY(45deg);}.div1img{transform:translateZ(16px);}.p3d{transform-style:preserve-3d;}

两图唯一的区别是:右图的父div上设了transform-style:preserve-3d;,因此呈现了3d效果。左图的父div没有设transform-style默认是flat,因此元素不会在Z轴展开(translateZ(16px)失效),只能呈现2D效果。

另外如果同时设了transform-style:preserve-3d;和overflow:hidden;,3D效果将失效,等价于transform-style:flat;。如果你发现3D效果没有像预想地那样出现,可以检查一下(包括祖先元素)是否有overflow:hidden;,该属性将flatteneverything…

指定3D的视距。默认值是none表示无3D效果,即2D扁平化。上面例子代码里其实已经用到过该属性了。介绍它之前,先借用rotateX/rotateY/rotateZ来明确一下xyz轴坐标的基本概念。一图胜千言,依次是rotateX轴旋转,rotateY轴旋转,rotateZ轴旋转:

.x{transform:perspective(200px)rotateX(60deg);}.y{transform:perspective(200px)rotateY(60deg);}.z{transform:perspective(200px)rotateZ(60deg);}从图中也可以看出,烤羊肉串就是x轴旋转,钢管舞就是y轴旋转,彩票转盘就是z轴旋转。上面z轴只是一个点,想象一下就能明白,该点其实是一根垂直于屏幕的线,而perspective视距就是该线从屏幕到用户眼睛的距离。

实现3D的关键就是要有perspective视距,如果将上述代码中perspective(200px)去掉,效果如下:

仔细看代码的可以看出来,上面介绍XYZ轴旋转时是直接在变形元素img上指定的transform:perspective(200px)rotateX(60deg);。而上面的代码是给变形元素img的父div指定perspective:100px;。你可以理解为前一种方式是perspective()函数,后一种方式是perspective属性。两种指定方式是有区别的:

前者perspective()函数指定只针对当前变形元素,需要和transform其他函数一起使用,仅表示当前变形元素的视距。

后者perspective属性指定用于3D舞台,即3D舞台的视距,里面的子元素共享这个视距

.td1{transform-style:preserve-3d;perspective:200px;perspective-origin:center;}为节约篇幅,只贴出来图1的3D舞台的配置,其余8图只需根据表头修改perspective-origin即可。根据上面9宫格图就比较容易理解perspective-origin视距基点的意思了。默认值50%50%即center表示眼睛在舞台正中心。然后根据XY轴的位移量,或关键字left(等价于x轴0%)等,调整眼睛看3D舞台的位置。

用于是否可以看见3D舞台背面,默认值visible表示背面可见,可以设成hidden让背面不可见。通常当旋转时,如果不希望背面显示出来,该属性就很有用,设成hidden即可。一图胜千言:

至此5个前置属性介绍完毕。它们多用于3D场合,因此常见的3D的HTML结构如下:

<舞台>//为舞台加上perspective<容器>//为容器加上preserve-3d,使容器内元素共享同一个3D渲染环境<元素>//为元素加上transform效果2D变形2D变形有translate位移,scale缩放,rotate旋转,skew扭曲,matrix矩阵。基本的内容就不细说了,自行参照w3cschool,这里只介绍一些w3cschool上没有讲的内容。

translate位移系列中用于2D的有:translate,translateX,translateY

translate位移,类似于position:relative属性。可设单值,也可设双值。正数表示XY轴正向位移,负数为反向位移。设单值表示只X轴位移,Y轴坐标不变,例如transform:translate(100px);等价于transform:translate(100px,0);。这点和CSS中其他单值属性稍有不同,不要误以为单值是X轴和Y轴均位移。当然最好还是用双值,如果真的和Y轴无关,也请用translateX(100px),虽然效果是一样的,但代码可读性更高。同理如果和X轴无关,可以用transform:translateY(100px);等价于transform:translate(0,100px);

上面说了效果类似于position:relative属性,但和position语义不同,position用于页面布局,而translate属于transform中的一个系列,用于元素变形。你可能觉得语义不同有什么卵用,效果OK不就行了?就看你用什么标准来衡量效果了。CSS的神奇之处在于你可以将一个属性用在完全违背它原意的场景下,抛开代码可读性不谈,违背原意有时还是会有细微差别的。如结合动画效果时,translate能小于1px过渡,因此动画效果更为平滑。但position最小单位就是1px,动画效果肯定打折扣。另外用translate实现动画时,可以使用GPU,动画的FPS更高,而position显然无法享受这个优势。其他如回流和重绘也都有差异。因此如果你在该用translate的地方用了position,今后一些需求变动达不到要求,你也没什么立场可抱怨的了。

scale缩放系列中用于2D的有:scale,scaleX,scaleY

scale缩放,同样可以设单值和双值。单值时表示X轴和Y轴等值缩放。默认值为1,要缩小请设0.01~0.99之间的值,要放大请设超过1的值。例如缩小一倍可以transform:scale(.5);,放大一倍可以transform:scale(2);。效果在最上面介绍transform-origin时图片里已经有了,不多赘述。

如果只想X轴缩放,可以用scaleX(.5)相当于scale(.5,1)。同理只想Y轴缩放,可以用scaleY(.5)相当于scale(1,.5)。

设双值可以实现X轴Y轴不等比例缩放,如transform:scale(.5,1.5);,原本75*75px的图片变成了37.5*112.5px大小。如左图:

rotate旋转系列中用于2D的有:rotate

rotate旋转,比较简单,只能设单值。正数表示顺时针旋转,负数表示逆时针旋转。如transform:rotate(30deg);,效果在最上面介绍transform-origin时图片里已经有了,不多赘述。(注意和上面不同,在2D层面上没有rotateX/rotateY,它俩和rotateZ都是3D旋转)

skew扭曲系列中用于2D的有:skew,skewX,skewY

skew扭曲可以设单值和双值。单值时表示只X轴扭曲,Y轴不变,如transform:skew(30deg);等价于transform:skew(30deg,0);。考虑到可读性,不推荐用单值,应该用transform:skewX(30deg);。skewY表示只Y轴扭曲,X轴不变。效果在最上面介绍transform-origin时图片里已经有了,不多赘述。

matrix矩阵前面没有直接接触,但却是所有2D变形的本质,上面所有2D变形效果都可以用matrix矩阵来实现。本篇先略过,将它和3D矩阵matrix3d留到下一篇再介绍。

3D变形有translate3d位移,scale3d缩放,rotate3d旋转,matrix3d矩阵。(注意skew扭曲是没有3D的)。3D的用法和2D差不多,只不过多了个Z轴的值而已(这不是废话么…)。

translate3d位移系列中用于3D的有:translate3d,translateZ

translate3d(tx,ty,tz),其中tz的Z轴长度只能为px值,不能为%百分比。translateZ等价于translate3d(0,0,tz)。Z轴的值越大表示离眼睛越近,元素就越大,但当值大于perspective视距时元素将消失,因为眼睛无法看见眼睛背后的东西,这在上面介绍perspective时已经介绍过,不再赘述。值越小表示离眼睛越远,元素就越小。实际使用中translateZ效果和2D的scale缩放效果非常像,但原理是有区别的,translateZ是Z轴上位移,而scale是XY轴的缩放。还是那句话,尽量将属性用在符合属性愿意的场合。

scale3d缩放系列中用于3D的有:scale3d,scaleZ

scale3d(sx,sy,sz),其中sz为Z轴的缩放比例,取值同sx,sy一样,在0.01~0.99时元素缩小,1时大小不变,大于1时元素变大。scaleZ等价于scale(1,1,sz)。需要注意的是单独使用scale3d或scaleZ不会有任何效果,需要配合其他属性在3D舞台上才能出现效果,否则Z轴的缩放比例根本无法定义。

rotate3d旋转系列中用于3D的有:rotate3d,rotateX,rotateY,rotateZ

rotate3d(x,y,z,a)这里多了一个参数a(读音是阿尔法…)表示3D舞台上旋转的角度,而xyz的取值为0~1为各轴的旋转矢量值。rotate3d,rotateX,rotateY,rotateZ的效果在上面都有展示,不赘述。

最后matrix3d矩阵是所有3D变形的本质,上面所有3D变形效果都可以用matrix3d矩阵来实现。本篇先略过,将它和上面的2D矩阵matrix留到下一篇再介绍。

//左图//右图左图因为第一张img具有absolute,完全无视DOM结构中的顺序,妥妥地覆盖了第二张img。右图给第二张img设了transform,通常我们会认为scale(1)是废代码,但实际从右图已经看出,由于设立transform,使元素具有了相当于absolute的层级,因此两张img平级了,根据DOM中的顺序,后者覆盖了前者。

(这里使用的是scale,你可以改成rotate,skew等,效果都一样。即层级和transform有关,但和具体哪个transform函数无关)

因为absolute和transform平级,你可以调整上面两张img的顺序,这样设了transform的图片会被absolute覆盖。如果你非要让absolute高人一等,可以设z-index:1这样层级会高于transform,达到覆盖效果。

transform变形的用法介绍到这就差不多了。为缩减篇幅,文中代码都省略-ms,-o等前缀,需要浏览器全适应的请自行加上。下一篇matrix/matrix3d会更深入其本质,看看这些变形函数究竟是如何变换坐标位置,显示出各种效果的。

THE END
1.translate3d()CSS属性参考jQuery之家CSS translate3d()函数用于在3D空间中移动元素。 translate3d()函数的语法如下: transform: translate3d( tx , ty, tz); translate3d()函数用于在3D空间中移动元素。参数tx和ty可以是<length>值或<percentage>值。tz值必须是<length>值,不能是<percentage>值。 参数为正值会使元素沿相应轴正方向移动,负数值...http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/translate3d.html
2.关于translate3d关于translate3d为什么要用translate3d而不是用translate2d或者translatex或y呢?明明其余两个数值都不会变化的,,有什么区别呢?yumihuhu 2015-07-24源自:Web App下图片滑动组件的开发 4-2 关注问题 我要回答 2497 分享 操作 收起 4 回答慕用7077196 2016-08-09 tasnslate3d 在移动端会开启手机本身GPU硬件加速...https://www.imooc.com/qadetail/88360
3.13transform变形之translatetranslate3dtranslateX...使用transform 规则控制元素的变形操作,包括控制移动、旋转、倾斜、3D转换等,下面会详细介绍每一个知识点。 下面是CSS提供的变形动作。 重要: translate在进行设置偏移量的时候。并不会两个或者多个元素叠在一起。除非是元素设置position。 比如:两个没有设置position的div。长宽都是100%的。那么两个元素都设置translat...https://www.jianshu.com/p/503c9a67e123
4.translate和translate3D的区别StackOcean1.translate3D 可以调用GPU进行3D加速 2.translate 因为是 2D 移动,所以不能调用GPU进行3D加速 3.translate3D 可以在一个 z-axis (Z轴) 方向进行移动,正值会感觉元素离你更近,负值会感觉更远,不像translate只能平移。 https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform-function/translateZ ...https://www.cnblogs.com/xiaolantian/p/12658469.html
5.CSStranslate3d()的用法是什么问答CSS的translate3d()函数用于将元素在3D空间中沿着X、Y和Z轴方向进行平移。 语法: translate3d(tx, ty, tz) 参数: tx:指定元素在X轴方向的平移距离,可以是一个长度值,也可以是百分比。正值表示向右平移,负值表示向左平移。 ty:指定元素在Y轴方向的平移距离,可以是一个长度值,也可以是百分比。正值表示向下平移...https://www.yisu.com/ask/22295805.html
6.CSS3D转换translate3d(x,y,z) 定义3D 转化。 translateX(x) 定义3D 转化,仅使用用于 X 轴的值。 translateY(y) 定义3D 转化,仅使用用于 Y 轴的值。 translateZ(z) 定义3D 转化,仅使用用于 Z 轴的值。 scale3d(x,y,z) 定义3D 缩放转换。 scaleX(x) 定义3D 缩放转换,通过给定一个 X 轴的值。 scaleY(y...https://www.w3school.com.cn/css3/css3_3dtransform.asp
7.CSS33D转换菜鸟教程translate3d(x,y,z)定义 3D 转化。 translateX(x)定义 3D 转化,仅使用用于 X 轴的值。 translateY(y)定义 3D 转化,仅使用用于 Y 轴的值。 translateZ(z)定义 3D 转化,仅使用用于 Z 轴的值。 scale3d(x,y,z)定义 3D 缩放转换。 scaleX(x)定义 3D 缩放转换,通过给定一个 X 轴的值。 http://doc.yaojieyun.com/www.runoob.com/css3/css3-3dtransforms.html
1.translate3d()The translate3d() CSS function repositions an element in 3D space. Its result is a <transform-function> data type.https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/translate3d
2.CSS3D转换我们主要学习工作中最常用的3D位移和3D旋转 2 3D移动 translate3d 3D移动在2D移动的基础上多加了一个可以移动的方向,就是Z轴方向。 translform:translateX(100px): 仅仅是在x轴上移动 translform:translateY(1OOpx): 仅仅是在Y轴上移动 translform:translateZ(100px): 仅仅是在Z轴上移动(注意:translat...https://blog.csdn.net/qq_46311811/article/details/128404060
3.translate3d()CSS官方教程translate3d() The translate3d() CSS function moves the position of the element in the 3D space. This transformation is characterized by a 3- CSS官方教程,w3cschool。https://www.w3cschool.cn/doc_css/css-transform-function-translate3d.html
4.translate3d()(Transforms)CSS中文开发手册该translate3d()CSS函数在三维空间中重新定位一个元素。 这种转换的特点是三维矢量。其坐标定义元素在每个方向上的移动量。 语法 代码语言:javascript 复制 translate3d(tx,ty,tz) 可能值 tx——表示平移矢量的横坐标的<length>值。 ty——表示平移向量的纵坐标的<length>值。 https://cloud.tencent.com/developer/section/1072456
5.CSS之3D转换(translate3d,透视perspective,旋转rotated3.../* transform: translate3d(100px, 100px, 100px); x,y不能省略写,不想要就写0。 2、透视perspective 透视又称视距,人的眼睛到屏幕的距离,距离视觉点越近在电脑上成像越大。 根据近大远小,物体遮挡后面看不见的原理。 透视写在被观察元素的父盒子上,透视越小(距离),我们看到的越大。 http://www.licqi.com/artikel/14976.html
6.AdvancedCSS32Dand3DTransformTechniques—SitePointNow that you have gone through the basic of 2D transformation, understanding 3D transformation won’t be a difficult task for you. 3D transform includes Z-axis transformation of the HTML elements. We will go through each of the new properties used in 3D transformation. translate3d(<translation...https://www.sitepoint.com/advanced-css3-2d-and-3d-transform-techniques/
7.css3带你实现3D转换效果css3CSS网页制作transform: translate3d(50px,100px,200px); } 3D位移 效果如下: 注意: 首先要设置perspectiv属性在被观察元素的父盒子上,不然不会有Z轴效果。 如果只是单独设置Z轴视距,可以直接使用translateZ属性。 Z轴设置的值越大,距离我们眼睛就越近,也就是简单理解元素被放大了 Z轴设置的值越小,或者为负数,...https://www.jb51.net/css/811832.html
8.3D全景图·前端笔记·看云对于transform属性:下图整理了 rotate3d、translate3d 的变换方向: 需要注意的是:transform 中的变换属性的顺序是有关系的,如 translateX(10px) rotate(30deg) 与 rotate(30deg) translateX(10px) 是不等价的。 另外,需要注意的是 scale 中如果有负值,则该方向会产生 180 度的翻转; ...https://www.kancloud.cn/surahe/front-end-notebook/1003156
9.CSS3DTransformsModuleLevel3For translate, translate3d, translateX, translateY, translateZ, scale, scale3d, scaleX, scaleY, scaleZ, rotate, rotateX, rotateY, rotateZ, skewX and skewY functions: the individual components of the function are interpolated numerically. For perspective, matrix, matrix3d and rotate3d: th...https://www.w3.org/TR/2009/WD-css3-3d-transforms-20090320/
10.GitHubtranslateX translateY translateZ translate3d skew skewX skewY matrix matrix3d perspective CSS Transforms are a whole subject to themselves, and unfortunately there isn't space to elaborate on them here. LuckilyDavid DeSandrohas created a great set of tutorials, which you can findhere. ...https://github.com/maccman/gfx