Gutenberg Details 块(core/details)完全指南:从 block.json 属性到服务端渲染增强
【免费下载链接】gutenbergThe Block Editor project for WordPress and beyond. Plugin is available from the official repository.项目地址: https://gitcode.com/GitHub_Trending/gu/gutenberg
导读
Details 块是 Gutenberg 编辑器内置的"折叠/展开"内容容器,对应原生 HTML<details>/<summary>语义,用于隐藏并展示附加内容(FAQ、免责声明、进阶阅读等)。本文以packages/block-library/src/details/README.md的自动生成 API 文档为骨架,结合该块在仓库中的完整源码(block.json、edit.jsx、save.jsx、index.php、测试用例),逐项拆解其属性定义、支持能力(Supports)、编辑器交互与混合块渲染机制,帮助你完全掌握该块的配置方式与二次开发要点。
一、块概览:一个 Hybrid 类型的文本容器
根据 details/README.md 与 block.json,core/details块的核心元数据如下:
| 元数据项 | 值 |
|---|---|
| 名称(Name) | core/details |
| 类别(Category) | text(文本类) |
| API 版本 | 3 |
| 块类型 | Hybrid(静态保存 + 服务端增强) |
| 关键词(Keywords) | summary、toggle、disclosure |
| 描述 | Hide and show additional content. |
关键词summary、toggle、disclosure直接映射了该块的使用场景:用户可以在块插入器中通过"summary""toggle""disclosure"等词搜索到它。它的内部实现是对原生 HTML<details>元素的封装,天然继承了浏览器原生的折叠/展开交互与无障碍语义。
从源码结构看,该块目录包含 block.json、edit.jsx(编辑器界面)、save.jsx(保存输出)、index.php(服务端渲染与注册)、transforms.js(块转换)、index.js(块设置聚合)以及编辑器/前端样式(editor.scss、style.scss),是一个典型的"静态保存 + 服务端增强"混合块。
二、属性(Attributes)详解:4 个配置项的定义与数据来源
README 中列出了该块的全部属性,这些属性通过 block.json 中的attributes属性定义(详见 block.json),并受 block-attributes 的类型校验约束:
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
showContent | boolean | false | 是否默认展开(对应<details>的open属性) |
summary | rich-text | — | 摘要文本,数据源为rich-text,选择器summary,角色content |
name | string | — | 分组名称,数据源为attribute,选择器.wp-block-details,HTML 属性name |
placeholder | string | — | 摘要占位提示文本 |
各属性的底层实现如下:
showContent:布尔属性,默认false。在 save.jsx 中直接映射到<details open={ showContent }>;当为true时,保存的前端 HTML 会带有open属性,页面加载即展开。summary:富文本(rich-text)属性,从<summary>元素内部提取内容,role: "content"意味着它属于块的内容层(可被全文搜索与内容校验感知)。在 save.jsx 中,若summary为空,会回退为默认文本'Details'。name:字符串属性,从.wp-block-details根元素上读取nameHTML 属性。它的作用是让多个 Details 块通过相同的 name 值互联——如同原生<details name="...">的行为,同一组内同时只能展开一个。placeholder:字符串属性,不绑定任何数据源,仅用于编辑器内的占位提示。在 edit.jsx 中,当placeholder为空时会回退到默认文案Write summary…。
三、Supports(支持能力)清单:可用的样式与行为控制
README 中列出的 Supports 配置均定义于 block.json 的supports属性,决定该块在编辑器侧栏中开放哪些控制项:
align:"wide"、"full"——支持宽幅与全宽对齐。anchor:true——允许设置锚点 ID,便于页面内跳转。color:gradients: true、link: true——支持渐变背景与链接颜色;block.json 中还声明了__experimentalDefaultControls: { background: true, text: true },即默认显示背景色与文字色两个控件。html:false——禁止 HTML 编辑模式,用户无法切换到代码编辑视图,保证输出结构的规范性。spacing:margin、padding、blockGap均为true(默认控件不展开)。typography:fontSize、lineHeight为true(fontSize 属于默认控件);block.json 进一步启用了实验性字体控制:__experimentalFontFamily、__experimentalFontWeight、__experimentalFontStyle、__experimentalTextTransform、__experimentalTextDecoration、__experimentalLetterSpacing。layout:allowEditing: false——不允许用户自行修改布局类型,锁定容器布局。interactivity:clientNavigation: true——声明该块兼容客户端导航(Client-side navigation),在站点前端交互路由场景下不会破坏其折叠状态。allowedBlocks:true——允许在其中嵌套任意块。
此外,block.json 还包含两个未在 README 表格中出现的实验性支持项:__experimentalOnEnter: true(在摘要内按 Enter 可切换展开状态,对应 edit.jsx 中的键盘处理)与__experimentalBorder: { color, width, style }(实验性边框控制)。这些配置共同构成了该块"外观可定制、结构受控"的双重设计取向。
四、Block Markup:混合块如何保存与增强
README 给出了该块保存到文章内容中的典型标记(Block Markup):
<!-- wp:details {"summary":"Details Summary"} --> <details class="wp-block-details"><summary>Details Summary</summary> <!-- wp:paragraph {"placeholder":"Type / to add a hidden block"} --> <p>Details Content</p> <!-- /wp:paragraph --> </details> <!-- /wp:details -->这是一个混合块(Hybrid Block):编辑器保存的是静态标记,服务端在渲染时可能再做增强。对照 save.jsx 可以看出保存逻辑:
- 输出根元素
<details>,挂上useBlockProps.save()生成的 class(含wp-block-details)与name、open(当showContent为真时)属性; - 摘要由
RichText.Content渲染到<summary>内; - 内部内容由
InnerBlocks.Content原样输出,因此嵌套块(如段落、图片)都会完整保留。
作为对照,编辑器内的实时预览(edit.jsx)同样渲染一个真实的<details>元素:open状态由isOpen || hasSelectedInnerBlock决定(选中内部块时自动展开,方便编辑),onToggle事件会同步内部展开状态,name属性透传。前端样式 style.scss 只做了两件事:box-sizing: border-box与<summary>的cursor: pointer,其余交互完全交给浏览器原生行为。
五、编辑器体验:从"默认展开"到"分组联动"
编辑器界面(edit.jsx)围绕四个核心交互点设计:
- 摘要富文本编辑:
<summary>内嵌一个RichText(identifier 为summary),通过aria-label提示"写入摘要,按 Enter 展开或折叠",并设置withoutInteractiveFormatting屏蔽格式化干扰。 - 键盘行为:在摘要上按 Enter(不按 Shift)切换展开/收起(
handleSummaryKeyDown,配合withIgnoreIMEEvents避免 IME 组合输入误触发);按空格时阻止默认行为,防止输入空格时误触发原生<details>的切换(handleSummaryKeyUp)。 - "Open by default" 开关:侧栏的 ToolsPanel(Settings)中提供
ToggleControl,直接读写showContent属性;resetAll与onDeselect均将其重置为false。 - Name attribute 输入:位于
InspectorControls group="advanced"的高级面板中,帮助文案明确说明其用途——"Enables multiple Details blocks with the same name attribute to be connected, with only one open at a time."(同名 Details 块互联,同一时间仅一个展开)。这是构建"手风琴式 FAQ"的关键属性。
在内容组织上,index.js 定义了一个默认内部模板:插入 Details 块时自动附带一个占位文本为Type / to add a hidden block的段落块,引导用户继续添加隐藏内容;同时通过__experimentalLabel为列表视图(list-view)、面包屑(breadcrumb)与无障碍(accessibility)上下文提供语义化标签——例如无障碍标签会是Details. <summary 文本>,空摘要时则为Details. Empty.。
六、服务端渲染增强:折叠态图片的fetchpriority="low"
作为混合块的"服务端增强"部分,index.php 做了两件事:
- 通过
register_block_type_from_metadata( __DIR__ . '/details' )在init钩子上注册core/details块; - 通过
render_block_core/details过滤器挂载block_core_details_set_img_fetchpriority_low:当showContent为false(默认折叠)时,使用WP_HTML_Tag_Processor遍历块内所有<img>标签并设置fetchpriority="low"。
其设计意图在注释中说明得很清楚:折叠状态下的图片对用户不可见,不应与 LCP(最大内容绘制)等关键渲染路径上的资源争抢加载优先级;而showContent为true时直接短路返回,把优先级判断交给核心逻辑(如为 LCP 图片保留fetchpriority="high")。
对应的单元测试位于 phpunit/blocks/render-block-details-test.php,覆盖三个典型场景:
- 折叠块内的
<img>被设置为fetchpriority="low"; - 展开块(
showContent: true)内的<img>不会被改成low; - 展开块内已显式声明的
fetchpriority="high"会被原样保留。
这三个断言精确锁定了"折叠降级、展开放行、显式值优先"的行为边界,是理解该增强逻辑的最直接证据。
七、块转换:任意块组一键收纳
transforms.js 为core/details定义了一条从任意块转换的规则:from中允许isMultiBlock: true且匹配任意块(blocks: [ '*' ]),条件为当前选区不是单个core/details块。转换时通过createBlock创建新的 Details 块,并将选中的多个块作为内部块(cloneSanitizedBlock逐个克隆并清理)放入其中。这意味着用户可以多选任意内容一键"收纳"进折叠容器,反向则无法直接转换回原块(需手动剪切)。
八、结语
core/details是一个结构精炼、语义完整的混合块:它用 4 个属性覆盖"默认展开、摘要文本、分组联动、占位提示"四种核心诉求,通过原生<details>/<summary>元素获得零成本的浏览器交互与无障碍支持,再以服务端渲染层(fetchpriority 降级)为页面性能兜底。无论是站点作者(使用 "Open by default" 与 "Name attribute" 搭建手风琴 FAQ),还是块开发者(参考其 block.json 的 Supports 组织方式与混合块渲染模式),都能从这套实现中直接获益。若需继续深入,可通读 details 源码目录 下的全部实现文件,并结合 render-block-details-test.php 验证其渲染行为。
【免费下载链接】gutenbergThe Block Editor project for WordPress and beyond. Plugin is available from the official repository.项目地址: https://gitcode.com/GitHub_Trending/gu/gutenberg
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考