Gutenberg 核心块深度解析:core/column 列块的多属性架构、静态标记与源码实现
【免费下载链接】gutenbergThe Block Editor project for WordPress and beyond. Plugin is available from the official repository.项目地址: https://gitcode.com/GitHub_Trending/gu/gutenberg
core/column是 Gutenberg(WordPress 块编辑器项目)中core/columns列组块的子容器块,负责承载并渲染单个列内的嵌套内容。本文以该块的自动生成 API 文档为主体骨架,结合当前仓库中 block.json、edit.jsx、save.jsx 等真实源码,深入讲解其属性定义、能力支持(Supports)、序列化标记、编辑器交互逻辑与响应式样式,帮助读者完整掌握这一静态块的设计与实现。
块概览:静态列块在 Gutenberg 中的定位
根据 column/README.md 的官方定义,core/column是"columns 块中的一个单列"(A single column within a columns block)。其核心元信息如下:
- 名称(Name):
core/column - 分类(Category):design(设计类)
- API 版本(API Version):3,对应 block.json 中的
"apiVersion": 3 - 块类型(Block Type):静态块(Static),标记直接保存在文章内容中
静态块的含义是:块的最终 HTML 标记由save函数在保存时生成并写入post_content,前端直接输出该标记,不经过服务端渲染函数。这一点与"动态块"(依赖 PHPrender_callback实时渲染)形成对比,也是理解下文"Block Markup"小节的基础。
块关系:core/column 与 core/columns 的父子契约
文档明确指出core/column的直接父块(Parent)只有一个:
core/columns
该约束定义在两个层面:
- 子块侧:block.json 声明
"parent": [ "core/columns" ],即该块只允许作为core/columns的直接子块存在; - 父块侧:columns/block.json 声明
"allowedBlocks": [ "core/column" ],即core/columns只允许容纳core/column作为直接子块。
这种双向约束保证了列组与列之间的严格层级关系:columns直接包含多个column,而每个column内部再通过InnerBlocks容纳段落(paragraph)、图片(image)等任意块。此外,父块core/columns还提供了isStackedOnMobile(移动端是否堆叠,默认true)属性与"列间对齐"能力,与子块的verticalAlignment相互配合,详见下文。
Attributes 属性详解
core/column的全部属性均通过 block.json 的attributes字段声明,共三个:
| Attribute | 类型 | 枚举/说明 | 默认值 |
|---|---|---|---|
verticalAlignment | string | 列内内容的垂直对齐方式:top、center、bottom、stretch | — |
width | string | 列宽,作为 CSSflex-basis使用,支持%、px、em、rem、vw等长度单位 | — |
templateLock | string \| boolean | 内部块的模板锁定级别:all、insert、contentOnly、false | — |
三个属性的语义细节如下:
verticalAlignment:垂直对齐
控制列内内容在列高度方向上的对齐方式。在编辑器端(edit.jsx)通过BlockVerticalAlignmentToolbar提供['top', 'center', 'bottom', 'stretch']四个选项。值得注意的是,设置列自身的对齐会同时重置父块core/columns的对齐属性——edit.jsx 中的updateAlignment先setAttributes更新自身,再调用updateBlockAttributes( rootClientId, { verticalAlignment: null } )清除父块的统一对齐,从而避免两级对齐设置相互冲突。
width:列宽(flex-basis)
列宽以行内样式flex-basis的形式写入输出标记。源码对宽度值做了两类兼容处理:
- 数值类型向后兼容:历史上(API 版本 3 之前的模板中)
width可能是0–100的数字,被视为百分比。当前 edit.jsx 与 save.jsx 均使用Number.isFinite( width ) ? width + '%' : width将数字统一转换为百分数字符串; - 百分比浮点精度修正:save.jsx 中,若宽度以
%结尾且非整数,会将其舍入到至多 12 位小数(Math.round( parseFloat( width ) * 1e12 ) / 1e12 + '%'),避免长浮点数污染输出标记。
在编辑器中,宽度通过__experimentalUnitControl(带单位输入框)编辑,可用单位由useSettings( 'spacing.units' )读取,兜底为['%', 'px', 'em', 'rem', 'vw'](见 edit.jsx);负数值会被钳制为'0'(edit.jsx)。
templateLock:模板锁定
控制列内InnerBlocks的编辑约束,取值与块 API 文档一致:all(完全锁定,不可增删改内部块)、insert(禁止插入新块)、contentOnly(仅允许编辑内容,不允许结构调整)、false(不锁定)。该值会直接透传给编辑器端的useInnerBlocksProps(edit.jsx),适合在主题模板中固定列内的块结构。
Supports 能力支持详解
core/column通过supports声明了丰富的样式与行为能力,文档表格与 block.json 完全一致:
| 能力 | 值 | 说明 |
|---|---|---|
anchor | true | 支持 HTML 锚点(id),可用于页内跳转 |
reusable | false | 禁用"转为可复用块"(现为同步模式) |
html | false | 禁止自定义 HTML 编辑,保证标记由块统一输出 |
color.gradients | true | 支持背景渐变 |
color.heading | true | 支持标题颜色 |
color.button | true | 支持按钮颜色 |
color.link | true | 支持链接颜色 |
shadow | true | 支持阴影 |
spacing.blockGap | true | 支持列内块间距 |
spacing.padding | true | 支持内边距 |
typography.fontSize | true | 支持字号 |
typography.lineHeight | true | 支持行高 |
layout | true | 支持布局控制 |
interactivity.clientNavigation | true | 支持客户端导航(查看视图交互) |
allowedBlocks | true | 支持限制内部允许的块类型 |
在 block.json 中还存在文档表格之外的实验性支持项,可作为深入了解的补充:
__experimentalOnEnter: true:允许在列内按 Enter 换行;__experimentalBorder(color / radius / style / width):完整边框支持;typography下的__experimentalFontFamily、__experimentalFontWeight、__experimentalFontStyle、__experimentalTextTransform、__experimentalTextDecoration、__experimentalLetterSpacing:字体族、字重、字型、大小写变换、文本装饰与字间距;color.__experimentalDefaultControls(background / text)与spacing.__experimentalDefaultControls(padding / blockGap)用于控制检查器中的默认显示。
Block Markup:静态标记与序列化格式
作为静态块,core/column的标记由保存端 save.jsx 生成并直接写入文章内容。文档给出的典型序列化标记为:
<!-- wp:column --> <div class="wp-block-column"> <!-- wp:paragraph --> <p>Column One, Paragraph One</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>Column One, Paragraph Two</p> <!-- /wp:paragraph --> </div> <!-- /wp:column -->要点解读:
<!-- wp:column -->与<!-- /wp:column -->是块的注释标记(block comment delimiters),包裹实际 DOM;- 外层
div固定携带wp-block-column类名,由 save.jsx 的useBlockProps.save输出; - 设置
verticalAlignment时会追加is-vertically-aligned-top/center/bottom等类名(save.jsx); - 设置
width时输出行内样式style="flex-basis: …"(save.jsx); - 内部块通过
useInnerBlocksProps.save递归序列化到div内(save.jsx)。
历史标记迁移:deprecated 机制
仓库中 deprecated.jsx 记录了旧版块的标记形态:早期width是number类型(min: 0, max: 100),直接输出style={ { flexBasis: width + '%' } }。迁移逻辑(migrate)将数字转换为百分数字符串(如50→"50%"),isEligible通过isFinite( width )识别旧标记并触发自动迁移。这解释了为何当前源码需要反复兼容"数字宽度"这一历史形态。
编辑器端实现:宽度、对齐与 InnerBlocks 的协作
编辑组件 edit.jsx 完整呈现了列块在编辑器中的交互逻辑:
- 宽度面板:
ColumnInspectorControls使用__experimentalToolsPanel与__experimentalToolsPanelItem提供可折叠的"Settings"面板,其中UnitControl绑定width属性,输入框宽度为calc(50% - 8px),支持选择器切换单位(edit.jsx); - 对齐工具栏:
BlockControls中的BlockVerticalAlignmentToolbar提供四个对齐按钮,修改时同步清空父块core/columns的统一对齐(edit.jsx); - 行内样式:通过
useBlockProps将flexBasis注入编辑态 DOM,确保编辑预览与前端输出一致(edit.jsx); - 嵌套容器:
useInnerBlocksProps接收templateLock、allowedBlocks,并在无子块时渲染ButtonBlockAppender("+" 添加按钮),有子块时隐藏(edit.jsx); - 无障碍标签:通过
getBlockOrder计算列在父块中的位置,生成形如"Block: Column (1 of 3)"的aria-label,便于屏幕阅读器辨识当前列(edit.jsx)。
块的注册入口在 index.js:通过initBlock将metadata、edit、save、deprecated注册为core/column的设置对象,init.js 负责在运行时完成初始化。
响应式样式:flex 布局与移动端堆叠
列块的布局样式定义在父块样式文件 columns/style.scss(wp-block-columns与wp-block-column共用):
- 桌面端(≥
break-medium,即 ≥782px):无显式宽度的列使用flex-basis: 0; flex-grow: 1均分剩余空间;带flex-basis行内样式的列则flex-grow: 0保持固定宽度(style.scss),这正是width属性驱动列宽分配的原理; - 移动端:默认(
isStackedOnMobile为 true)下列的flex-basis: 100% !important强制单列堆叠(style.scss);父块设置"不在移动端堆叠"时则flex-wrap: nowrap保持并排; - 垂直对齐:父块通过
are-vertically-aligned-top/center/bottom类切换align-items,列自身则通过is-vertically-aligned-*类(由 save.jsx 输出)控制内部内容的对齐。
在模板与主题中使用 core/column
由于块标记直接写入内容,开发者可在主题模板(如block.html)中直接书写列结构。一个带宽度与模板锁定的示例:
<!-- wp:columns --> <div class="wp-block-columns"> <!-- wp:column {"width":"33.33%","templateLock":"all"} --> <div class="wp-block-column" style="flex-basis:33.33%"> <!-- wp:paragraph --> <p>侧栏内容</p> <!-- /wp:paragraph --> </div> <!-- /wp:column --> <!-- wp:column {"width":"66.66%"} --> <div class="wp-block-column" style="flex-basis:66.66%"> <!-- wp:paragraph --> <p>主内容区</p> <!-- /wp:paragraph --> </div> <!-- /wp:column --> </div> <!-- /wp:columns -->其中<!-- wp:column {"width":"33.33%","templateLock":"all"} -->的 JSON 参数对应attributes中的属性名,编辑器在加载时会按此解析属性并应用相应的行内样式与锁定策略。
源码导航
以下文件可供继续深入阅读:
- column/README.md:本块自动生成的 API 参考文档
- column/block.json:属性与支持能力的唯一事实来源
- column/edit.jsx:编辑器端渲染与交互逻辑
- column/save.jsx:保存端的静态标记输出
- column/deprecated.jsx:历史版本标记的向后兼容迁移
- column/index.js 与 column/init.js:块的注册与初始化
- columns/block.json:父块
core/columns的元数据(含isStackedOnMobile与布局默认值) - columns/style.scss:列组的 flex 布局与移动端堆叠样式
【免费下载链接】gutenbergThe Block Editor project for WordPress and beyond. Plugin is available from the official repository.项目地址: https://gitcode.com/GitHub_Trending/gu/gutenberg
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考