跳转到主内容
极星编程网:以代码为星,赴技术山海!

怎么通过HTML的CSS Layout API的registerLayout注册自定义布局算法

registerLayout 必须在独立模块脚本中调用 浏览器只允许在 Layout Worklet 模块上下文中执行
registerLayout()
,直接写在主页面 script 标签或普通 JS 文件里会报错:
TypeError: registerLayout is not defined
。它不是全局函数,而是 Layout Worklet 环境注入的 API。 必须用
css/layout-worklet.js
这类单独文件,并通过
CSS.paintWorklet.addModule()
的同类方式加载——但注意:Layout Worklet 用的是
CSS.layoutWorklet.addModule()
(不是 paintWorklet)。 文件必须是 ES Module(含
type="module"
声明或 HTTP Header
Content-Type: application/javascript+module
) 不能有
export
或
import
循环,也不能依赖 DOM API(Layout Worklet 没有 window/document) 类定义必须出现在
registerLayout()
之前,且不能包裹在
if
、
function
或
try/catch
中——顶层作用域直出 布局类必须实现 inputProperties 和 layout 方法
registerLayout('masonry', MasonryLayout)
注册的类,至少要提供静态
inputProperties
和异步
layout()
方法。前者声明它想读取哪些 CSS 自定义属性,后者才是真正干活的布局逻辑入口。 常见漏项:
intrinsicSizes()
不是必需的,但若省略,浏览器将无法正确计算容器最小尺寸,导致
min-content
行为异常(比如 flex 容器内收缩失败)。 立即学习 “ 前端免费学习笔记(深入) ”;
inputProperties
返回字符串数组,如
['--columns', '--gap']
;不支持简写属性(如
margin
),只认自定义属性和部分原生属性(如
'width'
、
'font-size'
)
layout()
参数中
children
是
LayoutChild
实例数组,每个都有
intrinsicSize
、
setBounds()
等方法,不能直接改
style
返回值必须是
{ inlineSize, blockSize }
对象,表示容器最终尺寸;不返回或返回 null 会导致布局崩溃 CSS 中启用自定义布局需用 display: layout(...) 注册完还不算完。HTML 元素必须显式声明使用该布局,语法是
display: layout('masonry')
,不是
display: grid
那套,也不接受 fallback(没有浏览器支持时整个 display 值会被忽略,回退到
display: block
)。 使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件 如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Andr​​oid友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Andr​​oid应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更 下载 注意:目前(2026 年中)Chrome 124+ 支持,Firefox 和 Safari 仍无实现。别指望它在生产环境全平台可用。 必须搭配
container-type: inline-size
或
container-type: size
才能触发容器查询感知(否则
constraints
中
fixedInlineSize
可能为
undefined
) 不能和
display: grid
/
flex
混用;一旦设了
layout(...)
,传统布局模型完全退出 调试时可临时加
outline: 1px solid red
看容器是否生效,如果没 outline,大概率是
addModule()
失败或 CSS 语法写错 addModule() 加载失败时没有明确错误提示
CSS.layoutWorklet.addModule('masonry.js')
失败时,控制台通常只报 “Failed to load module”,不会告诉你具体哪一行错。最常踩的坑是路径 404、MIME 类型不对、或模块里用了
console.log
(Layout Worklet 不支持 console)。 建议在加载后加个简单检测:
await CSS.layoutWorklet.addModule('masonry.js'); // 检查是否注册成功(无官方 API,只能靠副作用) document.body.style.display = 'layout("masonry")'; if (getComputedStyle(document.body).display !== 'layout("masonry")') { console.warn('layout worklet may not be ready or registered'); }
真正难调试的点在于:Layout Worklet 错误不会中断主线程,也不会抛出可捕获异常,所有逻辑都在隔离线程运行。一旦
layout()
方法里 throw Error,整个容器渲染就静默失败——只留空白。

相关文章