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