CSS里transform变形这个属性有点学习难度,尤其在CSS3里加上了3D效果之后,2维变3维学习成本更是成倍提高。为什么设计师的眼里饱含着泪水,因为对页面效果爱的深沉。本篇就介绍一下transform。(擎天柱:Autobot transform!) transform本质上是一系列变形函数,分别是translate位移,scale缩放,rotate旋转,skew扭曲,matrix矩阵。戒骄戒躁,我们一个个讲。
前置属性transform-origin用于指定元素变形的中心点。默认中心点就是元素的正中心,即XYZ轴的50% 50% 0处。可以通过该属性改变元素在XYZ轴的中心点,正值表示正向位移,负值表示负向位移。(XYZ轴的正向分别是往右,往下,靠近用户眼睛。反之为反向) 表示2维的 默认中心点在元素正中心,因此关键字top等价于top center等价于50% 0%(x轴仍旧留在50%处,y轴位移到0%处)。同理各关键字例如right等价于right center等价于100% 50%,不多赘述。 一图胜千言:为图片设置不同的中心点后,看它们旋转,扭曲,缩放的效果。例如图1表头的第一行center表示 另外transform-origin指定变形中心点对translate位移没有影响。translate位移始终相对于元素正中心进行位移,有怀疑精神的可以自己试一下。 其实transform-origin只是一个语法糖而已,你总是可以用translate来代替它。每个transform-origin都可以被两个translate模拟出来(by CSS变形规范的编辑Aryeh Gregor)。例如: transform: rotate(30deg); transform-origin: 200px 300px; //等价于 transform: translate(200px, 300px) rotate(30deg) translate(-200px, -300px); transform-origin: 0 0; transform-style这个属性比较简单只有两个值 .div1 { float: left; background-color: red; transform: perspective(200px) rotateY(45deg); } .div1 img{ transform: translateZ(16px); } .p3d { transform-style: preserve-3d; } <div class="div1"><img src="head75.png" /></div> <div class="div1 p3d"><img src="head75.png" /></div> 两图唯一的区别是:右图的父div上设了 另外如果同时设了 perspective指定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); } <img class="x" src="head75.png" /> <img class="y" src="head75.png" /> <img class="z" src="head75.png" /> 从图中也可以看出,烤羊肉串就是x轴旋转,钢管舞就是y轴旋转,彩票转盘就是z轴旋转。上面z轴只是一个点,想象一下就能明白,该点其实是一根垂直于屏幕的线,而perspective视距就是该线从屏幕到用户眼睛的距离。 实现3D的关键就是要有perspective视距,如果将上述代码中 perspective只能设px值,不能设%百分比。值越小表示用户眼睛距离屏幕越近,相当于创建一个较大的3D舞台。反之,值越大表示用户眼睛距离屏幕越远,相当于创建一个较小的3D舞台。这很容易理解,离的越近东西看起来越大,离的越远东西看起来越小。但具体该怎么设呢?借用W3C的图配合translateZ来帮助理解视距。 .divsp { display: inline-block; border: 1px blue dashed; margin-left: 30px; perspective: 100px; } .z1 { transform: translateZ(-75px); } .z2 { transform: translateZ(0px); } .z3 { transform: translateZ(25px); } .z4 { transform: translateZ(101px); } <div class="divsp"><img class="z1" src="head75.png" /></div> <div class="divsp"><img class="z2" src="head75.png" /></div> <div class="divsp"><img class="z3" src="head75.png" /></div> <div class="divsp"><img class="z4" src="head75.png" /></div> 4张图的视距都是100px,表示4张图的3D舞台距离你的眼睛100px。我们从右往左来理解。图4的 仔细看代码的可以看出来,上面介绍XYZ轴旋转时是直接在变形元素img上指定的
perspective-origin设置视距的基点,看W3C的图就能明白 .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舞台的位置。 backface-visibility用于是否可以看见3D舞台背面,默认值visible表示背面可见,可以设成hidden让背面不可见。通常当旋转时,如果不希望背面显示出来,该属性就很有用,设成hidden即可。一图胜千言: .stage{ float: left; margin: 5px; perspective: 200px; } .container { transform-style: preserve-3d; } .image { backface-visibility: hidden; } .front { position: absolute; z-index: 1; } .back { transform: rotateY(180deg); } .stage:nth-child(1) .container{ transform: rotateY(0deg); } .stage:nth-child(2) .container{ transform: rotateY(30deg); } .stage:nth-child(3) .container{ transform: rotateY(60deg); } .stage:nth-child(4) .container{ transform: rotateY(90deg); } .stage:nth-child(5) .container{ transform: rotateY(120deg); } .stage:nth-child(6) .container{ transform: rotateY(150deg); } .stage:nth-child(7) .container{ transform: rotateY(180deg); } <div class="stage"> //为节约篇幅该DOM请无脑复制7个 <div class="container"> <img class="image front" src="head75.png" /> <img class="image back" src="bg75.png" /> </div> </div> DOM结构中就能看出,是两张图片(一正一反)叠在了一起。由于变形元素img设了 至此5个前置属性介绍完毕。它们多用于3D场合,因此常见的3D的HTML结构如下: <舞台> //为舞台加上perspective <容器> //为容器加上preserve-3d,使容器内元素共享同一个3D渲染环境 <元素> //为元素加上transform效果 </容器> </舞台> 2D变形2D变形有translate位移,scale缩放,rotate旋转,skew扭曲,matrix矩阵。基本的内容就不细说了,自行参照w3cschool,这里只介绍一些w3cschool上没有讲的内容。 translate位移translate位移系列中用于2D的有:translate,translateX,translateY translate位移,类似于position:relative属性。可设单值,也可设双值。正数表示XY轴正向位移,负数为反向位移。设单值表示只X轴位移,Y轴坐标不变,例如 上面说了效果类似于position:relative属性,但和position语义不同,position用于页面布局,而translate属于transform中的一个系列,用于元素变形。你可能觉得语义不同有什么卵用,效果OK不就行了?就看你用什么标准来衡量效果了。CSS的神奇之处在于你可以将一个属性用在完全违背它原意的场景下,抛开代码可读性不谈,违背原意有时还是会有细微差别的。如结合动画效果时,translate能小于1px过渡,因此动画效果更为平滑。但position最小单位就是1px,动画效果肯定打折扣。另外用translate实现动画时,可以使用GPU,动画的FPS更高,而position显然无法享受这个优势。其他如回流和重绘也都有差异。因此如果你在该用translate的地方用了position,今后一些需求变动达不到要求,你也没什么立场可抱怨的了。 scale缩放scale缩放系列中用于2D的有:scale,scaleX,scaleY scale缩放,同样可以设单值和双值。单值时表示X轴和Y轴等值缩放。默认值为1,要缩小请设0.01~0.99之间的值,要放大请设超过1的值。例如缩小一倍可以 如果只想X轴缩放,可以用 设双值可以实现X轴Y轴不等比例缩放,如 transform: scale(-.5, -1.5); ,效果见上面右图。为何反转能理解吧?XY轴像素矩阵各值取反后,效果等价于反转。当然你同样可以用rotate实现反转。rotate旋转rotate旋转系列中用于2D的有:rotate rotate旋转,比较简单,只能设单值。正数表示顺时针旋转,负数表示逆时针旋转。如 skew扭曲skew扭曲系列中用于2D的有:skew,skewX,skewY skew扭曲可以设单值和双值。单值时表示只X轴扭曲,Y轴不变,如 matrix矩阵matrix矩阵前面没有直接接触,但却是所有2D变形的本质,上面所有2D变形效果都可以用matrix矩阵来实现。本篇先略过,将它和3D矩阵matrix3d留到下一篇再介绍。 3D变形3D变形有translate3d位移,scale3d缩放,rotate3d旋转, matrix3d矩阵。(注意skew扭曲是没有3D的)。3D的用法和2D差不多,只不过多了个Z轴的值而已(这不是废话么…)。 translate3d位移translate3d位移系列中用于3D的有:translate3d,translateZ translate3d(tx,ty,tz),其中tz的Z轴长度只能为px值,不能为%百分比。translateZ等价于 scale3d缩放scale3d缩放系列中用于3D的有:scale3d,scaleZ scale3d(sx,sy,sz),其中sz为Z轴的缩放比例,取值同sx,sy一样,在0.01~0.99时元素缩小,1时大小不变,大于1时元素变大。scaleZ等价于 rotate3d旋转rotate3d旋转系列中用于3D的有:rotate3d,rotateX,rotateY,rotateZ rotate3d(x,y,z,a)这里多了一个参数a(读音是阿尔法…)表示3D舞台上旋转的角度,而xyz的取值为0~1为各轴的旋转矢量值。rotate3d,rotateX,rotateY,rotateZ的效果在上面都有展示,不赘述。 matrix3d矩阵最后matrix3d矩阵是所有3D变形的本质,上面所有3D变形效果都可以用matrix3d矩阵来实现。本篇先略过,将它和上面的2D矩阵matrix留到下一篇再介绍。 层级影响现在来看看变形对CSS层级的影响。说起层级,absolute绝对是层级间的高富帅,见一个睡一个,sorry,是见一个压一个,sorry,是见一个覆盖一个。 //左图 <img style="position:absolute;" src="bg100.png" /> <img src="head75.png" /> //右图 <img style="position:absolute;" src="bg100.png" /> <img style="transform:scale(1);" src="head75.png" /> 左图因为第一张img具有absolute,完全无视DOM结构中的顺序,妥妥地覆盖了第二张img。右图给第二张img设了transform,通常我们会认为 (这里使用的是scale,你可以改成rotate,skew等,效果都一样。即层级和transform有关,但和具体哪个transform函数无关) 因为absolute和transform平级,你可以调整上面两张img的顺序,这样设了transform的图片会被absolute覆盖。如果你非要让absolute高人一等,可以设 和absolute同系列的relative和fixed也适用上述层级关系。如果你页面上有个fixed广告标签,页面滚动时被transform元素覆盖了,请不要惊讶,试试设一下z-index。 总结transform变形的用法介绍到这就差不多了。为缩减篇幅,文中代码都省略-ms,-o等前缀,需要浏览器全适应的请自行加上。下一篇matrix/matrix3d会更深入其本质,看看这些变形函数究竟是如何变换坐标位置,显示出各种效果的。 |
|