Houdini APIs

Houdini 是一组低级 API,它公开了 CSS 引擎的各个部分,让开发者能够通过挂钩浏览器渲染引擎的样式和布局过程来扩展 CSS。Houdini 是一组 API,让开发者能够直接访问 CSS 对象模型 (CSSOM),从而使开发者能够编写浏览器可以解析为 CSS 的代码,由此创建新的 CSS 功能,而无需等待浏览器原生实现它们。

Houdini 的优势

与使用 JavaScript HTMLElement.style 进行样式更改相比,Houdini 实现了更快的解析速度。浏览器会在应用脚本中找到的任何样式更新之前解析 CSSOM — 包括布局、绘制和合成过程。此外,布局、绘制和合成过程会针对 JavaScript 样式更新重复执行。Houdini 代码不会等待第一个渲染周期完成。相反,它会包含在第一个周期中 — 创建可渲染、可理解的样式。Houdini 提供了一个基于对象的 API,用于在 JavaScript 中处理 CSS 值。

Houdini 的 CSS 类型对象模型 API 是一个具有类型和方法的 CSS 对象模型,它将值公开为 JavaScript 对象,比以前基于字符串的 HTMLElement.style 操作更直观地操作 CSS。每个元素和样式表规则都有一个样式映射,可以通过其 StylePropertyMap 访问。

CSS Houdini 的一个特性是 Worklet。通过 worklets,您可以创建模块化的 CSS,只需一行 JavaScript 即可导入可配置的组件:无需预处理器、后处理器或 JavaScript 框架。

js
CSS.paintWorklet.addModule("css-component.js");

此附加模块包含 PaintWorkletGlobalScope.registerPaint 函数,该函数注册完全可配置的 worklets。

CSS paint() 函数是 <image> 类型支持的附加函数。它接受的参数包括 worklet 的名称,以及 worklet 所需的其他参数。Worklet 还可以访问元素的自定义属性:无需将它们作为函数参数传递。

在下面的示例中,paint() 函数传递了一个名为 my-component 的 worklet。

css
li {
  background-image: paint(my-component, stroke, 10px);
  --highlights: blue;
  --theme: green;
}

注意: 强大的力量伴随着巨大的责任!使用 Houdini,您可以发明自己的 masonry、grid 或 regions 实现,但这不一定是个好主意。CSS 工作组做了大量工作来确保每个功能都具有高性能,能够处理所有边缘情况,并考虑安全、隐私和可访问性。在通过 Houdini 扩展 CSS 时,请确保牢记这些考虑因素,并在进行更宏大的项目之前从小处着手。

Houdini API

下面您可以找到指向涵盖 Houdini 伞形 API 的主要参考页面的链接,以及帮助您学习如何使用这些 API 的指南链接。

CSS Properties and Values API

定义了一个用于注册新 CSS 属性的 API。使用此 API 注册的属性会提供一个解析语法,该语法定义了类型、继承行为和初始值。

CSS 类型化 OM

将 CSSOM 值字符串转换为有意义的类型化 JavaScript 表示形式并反向转换可能会产生显著的性能开销。CSS 类型化 OM 将 CSS 值公开为类型化 JavaScript 对象,以便对其进行高性能操作。

CSS Painting API

为了提高 CSS 的可扩展性而开发的 Painting API 允许开发者编写 JavaScript 函数,这些函数可以直接通过 paint() CSS 函数绘制到元素的背景、边框或内容中。

Worklets

一个用于在渲染管道的各个阶段运行脚本的 API,独立于主 JavaScript 执行环境。Worklets 在概念上类似于 Web Workers,并且由渲染引擎调用并扩展渲染引擎。

CSS Layout API

旨在提高 CSS 的可扩展性,此 API 使开发者能够编写自己的布局算法,例如 masonry 或 line snapping。

此 API 在 Chrome Canary 中有一些部分支持。MDN 上尚未对其进行文档记录。

CSS Parser API

一个更直接地暴露 CSS 解析器的 API,用于将任意类 CSS 语言解析为轻度类型化的表示形式。

此 API 目前是一个提议,没有浏览器实现或 MDN 上的文档。

Font Metrics API

一个公开字体指标的 API,用于访问排版布局结果。

此 API 目前是一个提议,没有浏览器实现或 MDN 上的文档。

另见