CSS 中的 11 个新特性和功能

2025-06-04

CSS 中的 11 个新特性和功能

注意:由于它是最新的并且目前处于工作草案的状态,本文中描述的许多功能将会发生变化,并且它们不会在所有浏览器中可用(有些是!)。

2024 年 9 月 13 日,CSS 工作组发布了CSS 值和单位模块第 5 级的第一个公共工作草案。它是上一级别的扩展,包含一些有趣的新增内容。

不久前还无法想象的事情正在进入规范:随机值、使用属性作为任何属性的值、能够在计算中使用顺序......看起来很有希望。

这些功能都有一个共同点:简化了 CSS 代码。以前需要多条规则或一些 hack 方案才能实现的功能,现在只需一两行 CSS 代码即可实现。正如我所说,它看起来非常有前景。以下是新变化的列表(更多详情见下文):

  • attr()功能变化:因此它可以与任何属性和任何 CSS 属性一起使用(不仅仅是内容)。
  • calc-size()功能:在计算中使用内在值,例如 auto 或 min-content。
  • 新的 first-valid() 函数可避免自定义属性具有无效值的问题。
  • 新的 *-mix() 函数系列具有新的比率符号。
  • 新的 *-progress() 函数系列用于计算范围之间或媒体或容器内的进度比。
  • 使用新功能random()random-item()函数进行随机化,从范围或列表中返回随机值(终于!)
  • 新的sibling-count()函数sibling-index()提供整数值,根据顺序和大小进行操作。
  • 用于设置嵌套元素样式的新toggle()功能可轻松循环遍历值列表。
  • 带有逗号分隔值列表的参数的新功能符号,以避免因逗号分隔参数而产生的歧义。
  • 新的 URL 修饰符可以对 url() 请求提供更多的控制。
  • 扩展位置类型以允许流相关值。

新功能和更新

attr()功能变更

在 CSS 中读取属性并使用它并不是什么新鲜事。在 CSS 中已经可以实现这一点attr(),但一个常见的抱怨是功能有限,只能处理字符串和 CSS 中的属性content

attr()函数将进行一些更新,因此任何数据属性(无论其数据类型如何)都可以在任何属性中使用。只需指定类型,并且如果需要,还可以指定一个后备值,以防出现意外情况。

这是一个期待已久的更新,它将会让很多开发人员感到高兴。

Attr() 函数。attr() 函数经过扩展,可以用于元素的任何属性,以及任何 CSS 属性(目前仅适用于内容)。它可以接受两个可选参数:属性的单位和后备值。CSS 代码片段


使用内在价值进行运算calc-size()

该模块还引入了一个新功能,可以安全地使用内在值(auto,,等)进行操作max-contentfit-content此功能在过渡和动画中特别有用。

它还添加了新的关键字(size),为计算提供更多的灵活性,使处理尺寸变得更容易。

既然已经有了函数,为什么还要新增一个呢calc()?正如文档所解释的,这样做既是为了向后兼容,也是为了实际原因(例如,在所有情况下都能实现平滑插值,尤其是在百分比运算时)。

calc-size 函数。calc() 函数非常适合处理确定的值,但无法处理固有值(例如 auto 或 fit-content)。新的 calc-size() 函数允许以安全且定义明确的方式使用固有值进行计算。CSS 代码片段


first-valid()功能

引入了一种新方法:first-valid()。其思路是将一个值列表传递给函数;这些值将被解析,并使用第一个有效的值。这在处理 CSS 自定义属性(又称 CSS 变量)时尤其有用。

使用 CSS 变量时的一个问题是,在声明中,即使实际包含的值无效,它们也会被视为有效值。设置 fallback 值也无济于事,fallback 声明也会被忽略。

通过这种方法,我们可以将所有后备声明合并为一个,从而简化代码first-valid()

first-valid() 函数。此函数接受一个参数列表,并返回第一个对该属性有效的参数。CSS 本身具有避免无效值的机制,但在使用自定义属性时,我们不能依赖它们。CSS 代码片段。


新的 *-mix() 函数系列

它还引入了一个新函数,mix()可以用来简化不同的 *-mix 函数。你想混合颜色吗?你可以使用类似的方法color-mix(red 60%, blue),或者更简单的mix(60%, red, blue)方法也可以。正如我们所说的颜色,我们还可以混合长度、变换函数等等。

该符号也扩展到其他 *-mix 函数系列:

  • calc-mix()
  • color-mix()
  • cross-fade()
  • palette-mix()

如果进度参数(第一个)中未指定缓动函数,linear则将默认应用。


新的 *-progress() 函数系列

它们表示给定值从一个起始值到另一个终止值的比例进展。结果是介于 0 到 1 之间的数字,可用于运算,但与前面描述的 *-mix 系列函数结合使用时会特别方便。

这个家族有三个函数:

  • progress():通用,适用于任何数学函数。
  • media-progress():用于媒体功能。
  • content-progress():用于容器查询。


CSS中的随机化函数

有趣的设计会包含一定程度的随机性,而这正是 CSS 所缺乏的。但此模块引入了两个新函数,它们可以从列表 ( random-item()) 或范围 ( random()) 中返回随机值。

无需再使用 hack 技巧或依赖其他语言来实现。语法简单易懂,功能强大,并且可以通过选择器或元素计算随机数。


新的同级函数

有时你可能希望根据容器内元素的顺序提供不同的样式。不幸的是,计数器在 CSS 中无法这样使用(这个问题留到以后再说)。

通过引入两个返回数字的新函数,可以对它们进行操作,这个障碍就被消除了:

  • sibling-count():返回兄弟姐妹的数量。
  • sibling-index():返回元素在兄弟列表中的位置/顺序。

不再需要在每个元素上设置自定义属性或使用 nth-child 编写单独的选择器。


toggle()功能

引入了一种便捷的新方法来定义嵌套元素中的值。该toggle()函数设置元素及其后代元素将循环使用的值,从而显著简化代码。告别复杂的规则或重新定义——所有操作只需一行代码即可完成。

例如,假设我们有一个包含四层嵌套的列表。我们希望奇数层包含圆盘,偶数层包含正方形。我们可以ul > li ul > li ul > li ul { ... }在不同的层级上做一些有趣的事情,或者像下面这样直接操作ul { list-style-type: disc, square; }。Boom!搞定!

这个函数唯一有点让人担心的是它的名字。也许只有我一个人觉得“toggle”这个词有“二元性”的含义:开/关,是/否——两个值可以相互切换。这个函数toggle()可以包含任意数量的参数,所以它被命名为“toggle”感觉有点奇怪。


参数的新函数符号

您可能已经注意到的一件事是,一些新函数(例如random()toggle())可以采用以逗号分隔的值列表作为参数。

在这些情况下,我们如何区分不同的参数呢?正因如此,才有人提议对函数式符号进行“逗号升级”。这意味着我们可以使用分号 (;) 代替逗号 (,) 来清晰地分隔参数。

例如,假设您想在页面上使用随机字体系列并指定不同的选项:

  • Times, serif
  • Arial, sans-serif
  • Roboto, sans-serif

所有这些参数都是用逗号分隔的值列表。如果我们用逗号分隔参数,那会非常混乱。但使用新的表示法,很容易识别一个参数在哪里结束,下一个参数在哪里开始:



.random-font {
  font-family: random-item(Times, serif; Arial, sans-serif; Roboto, sans-serif);
}


Enter fullscreen mode Exit fullscreen mode


职位类型扩展

marginCSS 已经具有、padding和 的逻辑属性border——这些值与文本书写方向相关,并且可能因语言不同而变化。

现在,位置类型(不要与position属性混淆)也引入了此功能。指示位置的属性(例如background-positionobject-position等)可以指定与文本流向和方向相关的值。

可以使用的新值有:

  • x-start
  • x-end
  • y-start
  • y-end
  • block-start
  • block-end
  • inline-start
  • inline-end


结论

它仍处于早期阶段,情况会发生变化,但 CSS 值和单位模块级别 5 中包含的一些新特性和功能看起来非常有前景。

有些功能也是期待已久的!尤其是可以将任意属性 (Attribute) 与任意属性 (Property) 一起使用。我记得很久以前在规范中看到过这个选项。希望这能成为实现它所需的动力。

别忘了查看CSS 值和单位模块 5 级工作草案,了解更多详情和信息。如有任何疑问或意见,请在其 GitHub 仓库提交工单

祝您 (CSS) 实验和编码愉快!

文章来源:https://dev.to/alvaromontoro/new-values-and-functions-in-css-1b9o
PREV
快速 A/B 投票:您更喜欢哪种卡片样式?
NEXT
CSS 中的 Homer Simpson... 仅使用一个 HTML 元素