WebKit 博客详细介绍了 如何在 Safari 技术预览版的最新版本中使用单独的 CSS Transform 属性。这使得浏览器与 CSS Transforms 模块级别 2 规范 保持一致,该规范将 translate()
、rotate()
和 scale()
函数从 transform
属性中分解成它们自己的单独属性:translate
、scale
和 rotate
。
因此,与其在 transform
属性上链接这三个函数
.some-element {
transform: translate(50px 50px) rotate(15deg) scale(1.2);
}
…我们可以将它们分别写成自己的属性
.some-element {
translate: 50px 50px;
rotate: 15deg;
scale: 1.2;
}
如果您像我一样,您的脑海中会立即想到“我们为什么要编写更多代码?”。我的意思是,我们习惯于看到单个属性成为简写属性的子属性,而不是相反,就像我们在 background
、border
、font
、margin
、padding
、place-items
等中看到的那样。
但 WebKit 团队概述了一些我们为什么要这样做的充分理由
- 当只需要一个函数时,编写单个属性更简单,例如
scale: 2;
而不是transform: scale(2);
。 - 当它们链接在一起时,无需担心意外覆盖其他
transform
属性。 - 更改单个属性上的关键帧动画要比在将它们与
transform
链接时必须“预计算”和“重新计算”中间值简单得多。 - 我们可以更精确地控制单个属性的时间和关键帧。
该帖子还指出了一些有用的提示。例如,新的单独转换属性首先应用——translate
、rotate
和 scale
,按此顺序——然后是 transform
属性中的函数。
哦,我们不能忽视浏览器支持!在撰写本文时,它非常有限……基本上仅限于 Safari 技术预览版 117 和 Firefox 72 及更高版本,全球支持率高达 3.9%
该帖子建议如果您想开始使用这些属性,请使用 @supports
@supports (translate: 0) {
/* Individual transform properties are supported */
div {
translate: 100px 100px;
}
}
@supports not (translate: 0) {
/* Individual transform properties are NOT supported */
div {
transform: translate(100px, 100px);
}
}
这是从帖子中直接提取的代码示例。修改此代码可以帮助我们避免使用 not
运算符。我不确定这是否是代码的改进,但这样做感觉更像是渐进增强
div {
transform: translate(100px, 100px);
}
@supports (translate: 0) {
/* Individual transform properties are supported */
div {
transform: none;
translate: 100px 100px;
}
}
这样,我们就可以清除简写函数并为单独的属性腾出空间,但前提是它们受支持。
拥有单独的属性很棒,它可能会产生更少的代码而不是更多(想想以前用来重现它们未覆盖的所有内容的覆盖),并有助于使代码更具模块化。为什么他们需要另一种语法我无法理解。我们在没有冒号的情况下获得的东西,在认知开销方面损失了。
我渴望一个 CSS 语法统一。列表应该用逗号分隔或不分隔。斜杠不是列表项分隔符。属性以名称开头,在冒号后定义其值。函数是函数,并具有名称并接受(遵循规则的分隔)参数列表。嵌套结构使用大括号。一旦所有这些都存在,简写/完整写法遵循一个简单的规则:简写是完整写法的语法糖。
Chrome 也支持“实验性 Web 平台功能”标志背后的单独转换属性,该标志可以从
chrome://flags
中启用我个人对它们的实用性有点矛盾。我会选择“在某些情况下非常有用,但在大多数情况下不是一种选择”。
我最大的问题是它们只能按特定顺序应用(并且,除了某些例外情况外,转换顺序很重要)。这通常不是我应用转换函数的顺序。我通常使用转换以逻辑模式在 2D 或 3D 中分布元素。这意味着从一个或多个旋转开始,然后应用平移。在这里,我们还遇到了一个问题,即当我以 3D 方式分布项目时,我通常首先使用
rotatey()
,然后使用rotatex()
,这仅允许进行单次旋转。当然,还可以填写矩阵、将它们相乘、获取迹线并计算组合成单个rotate3d()
所需的所有其他内容。但这很麻烦。但是,我发现它们在以下情况下很有用:我只有一个旋转和一个我想动画化的统一缩放,并且这两个需要不同的时间函数。就像这个 立方体动画 或 这些三角形开口。