下一代CSS的Transform

特别声明:如果您喜欢小站的内容,可以点击年卡¥199.00元(原价: ¥598元)季卡¥78.00元(原价: ¥168元)月卡¥28.00元(原价: ¥68元)进行全站阅读。如果您对付费阅读有任何建议或想法,欢迎发送邮件至: airenliao@gmail.com!或添加QQ:874472854(^_^)

最新版本的Firefox(v72)浏览器的发布,在CSS方面带来了一些变化,比如对CSS路径动画(CSS Motion Path)的支持和CSS Transforms Module Level 2部分功能的支持。在这篇文章,我们就来一探CSS Transforms Module Level 2给CSS Transform带来的变化以及和CSS Transforms Module Level 1的差异。但在这篇文章中我们不会和大家聊所有Level 2中的内容,只是聊聊和level 1的变化,如果你感兴趣的话,请继续往下阅读。

未来的CSS Transform

首先给大家上一张图:

从上图中我们可获知,在未来使用CSS的transform时,我们可以独立的使用相关的函数。目前为止,Firefox 72+中,我们要是使用CSS的transform的话,对于translatescalerotate三个变换函数可以独立使用,不再需要放到transform属性中。

独立使用translaterotatescale属性允许使用者(CSSer)独立的指定简单的transform,而不必记住transform中的顺序,这些顺序使translate()rotate()scale()的操作独立于屏幕坐标。

那么这三个属性独立使用和放置到transform中的差异是什么呢?如果感兴趣,请继续往下阅读。

如果希望能看到translate()rotate()scale()独立使用渲染出来的效果,首先请使用Firefox 72+版本。在接下来的示例中,如无特别声明,请使用该版本的Firefox浏览器查阅。

Transform Level 1 和 Transform Level 2的异和同

接下来的内容只会围绕着translaterotatescale三者展开,有关于CSS Transform内容暂不在该文讨论。

在CSS Transforms Module Level 1中,translate()rotate()scale()三者是transform的函数(<transform-function>,他们都是transform属性的值。在transform中可以独立使用,也可以组合使用。而且独立使用和组合使用得到的效果都将不同,在组合状态和书写顺序也有着紧密的联系。

在CSS Transforms Module Level 2中,translaterotatescale三者不再是transform的函数,而是独立的CSS属性

虽然在Level 1和Level 2中,他们的性质不同,但效果是不是相同呢?这个就需要我们一探究竟。

translate

先来看他们在语法上的差异:

// Level 1
transform: translate( <length-percentage> [, <length-percentage> ]?)

translate()可以拆分为三个独立的函数:translateX()translateY()translateZ()。而Level 2的语法则是:

// Level 2
tanslate: none | <length-percentage> [ <length-percentage> <length>? ]?

translate属性接受1~3个值,每个值指定一个轴上的平移,这三个值分别代表的是XYZ轴的值:

  • 如果只给translate属性指定一个或两个属性值,那么该属性就指定了一个2D空间的平移,相当于transformtranslate()函数。如果第二个值缺失,则默认为0px
  • 如果给translate属性指定三个属性值,那么该属性氷指定了一个3D空间的平移,相当于transformtranslate3d()函数

来看一个示例:

.old {
    transform: translate(20vh, 30vh);
}

.new {
    translate: 20vh 30vh;
}

效果如下:

在Chrome浏览器中开启“Web实验性属性”(chrome://flags/#enable-experimental-web-platform-features),也可以看到正常的效果。

注意,为了便于向大家展示3D空间的变换效果,接下来的示例将以下面的HTML结构来构建:

<div class="camera"> 
    <div class="space"> 
        <div class="box"></div> 
    </div> 
</div>

这个结构在transform3D空间是很有用的。最外层的div.camera相当于设定了摄影镜头,在该元素上设置perspective-originperspective两个属性的值:

.camera {
    perspective-origin: center center; 
    perspective: 500px;
}

简单来说就是透视点以及镜头到透视点的距离

第二层的div.space用来设定一个立体空间,这个空间的设定方式很简单,只需要将transform-style属性的值设置为3d就能构建一个3D立体空间:

.space{ 
    transform-style:3d; 
}

第三层的div.box大家应该清楚了,就是我们要变换的元素盒子。我们接下来所做的位移、旋转和缩放都是围绕着.box来做的:

为了大家更好的看到相应的效果,在上面的示例基础上做一些调整,你可以在示例中尝试着调整进度条来修改不同轴的值:

:root {
    --x: 50%;
    --y: 50%;
    --z: 0px;
}

.old {
    transform: translate3d(var(--x), var(--y), var(--z));
}

.new {
    translate: var(--x) var(--y) var(--z);
}

效果如下:

从效果上来看,transform: translate(x,y)translate: x y效果等同;transform: translate3d(x, y x)translate: x y z的效果等同。

在CSS Transforms Module Level 1中的translate()可以拆分为translateX()translateY(),而translate3d()可以拆分为translateX()translateY()translateZ()。即:

transform: translate() = transform: translateX() translateY()

transform: translate3d() = transform: translateX() translateY() translateZ()

但是在CSS Transforms Module Level 2中的t

剩余80%内容付费后可查看

如需转载,烦请注明出处:https://www.w3cplus.com/css/css-next-transform.html

如果文章中有不对之处,烦请各位大神拍正。如果你觉得这篇文章对你有所帮助,打个赏,让我有更大的动力去创作。(^_^)。看完了?还不过瘾?点击向作者提问!

赏杯咖啡,鼓励他创作更多优质内容!
返回顶部