Gutenberg 核心块深度解析:core/column 列块的多属性架构、静态标记与源码实现
2026/9/17 11:56:11 网站建设 项目流程

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

该约束定义在两个层面:

  1. 子块侧:block.json 声明"parent": [ "core/columns" ],即该块只允许作为core/columns的直接子块存在;
  2. 父块侧: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类型枚举/说明默认值
verticalAlignmentstring列内内容的垂直对齐方式:topcenterbottomstretch
widthstring列宽,作为 CSSflex-basis使用,支持%pxemremvw等长度单位
templateLockstring \| boolean内部块的模板锁定级别:allinsertcontentOnlyfalse

三个属性的语义细节如下:

verticalAlignment:垂直对齐

控制列内内容在列高度方向上的对齐方式。在编辑器端(edit.jsx)通过BlockVerticalAlignmentToolbar提供['top', 'center', 'bottom', 'stretch']四个选项。值得注意的是,设置列自身的对齐会同时重置父块core/columns的对齐属性——edit.jsx 中的updateAlignmentsetAttributes更新自身,再调用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 完全一致:

能力说明
anchortrue支持 HTML 锚点(id),可用于页内跳转
reusablefalse禁用"转为可复用块"(现为同步模式)
htmlfalse禁止自定义 HTML 编辑,保证标记由块统一输出
color.gradientstrue支持背景渐变
color.headingtrue支持标题颜色
color.buttontrue支持按钮颜色
color.linktrue支持链接颜色
shadowtrue支持阴影
spacing.blockGaptrue支持列内块间距
spacing.paddingtrue支持内边距
typography.fontSizetrue支持字号
typography.lineHeighttrue支持行高
layouttrue支持布局控制
interactivity.clientNavigationtrue支持客户端导航(查看视图交互)
allowedBlockstrue支持限制内部允许的块类型

在 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 记录了旧版块的标记形态:早期widthnumber类型(min: 0, max: 100),直接输出style={ { flexBasis: width + '%' } }。迁移逻辑(migrate)将数字转换为百分数字符串(如50"50%"),isEligible通过isFinite( width )识别旧标记并触发自动迁移。这解释了为何当前源码需要反复兼容"数字宽度"这一历史形态。

编辑器端实现:宽度、对齐与 InnerBlocks 的协作

编辑组件 edit.jsx 完整呈现了列块在编辑器中的交互逻辑:

  1. 宽度面板:ColumnInspectorControls使用__experimentalToolsPanel__experimentalToolsPanelItem提供可折叠的"Settings"面板,其中UnitControl绑定width属性,输入框宽度为calc(50% - 8px),支持选择器切换单位(edit.jsx);
  2. 对齐工具栏:BlockControls中的BlockVerticalAlignmentToolbar提供四个对齐按钮,修改时同步清空父块core/columns的统一对齐(edit.jsx);
  3. 行内样式:通过useBlockPropsflexBasis注入编辑态 DOM,确保编辑预览与前端输出一致(edit.jsx);
  4. 嵌套容器:useInnerBlocksProps接收templateLockallowedBlocks,并在无子块时渲染ButtonBlockAppender("+" 添加按钮),有子块时隐藏(edit.jsx);
  5. 无障碍标签:通过getBlockOrder计算列在父块中的位置,生成形如"Block: Column (1 of 3)"的aria-label,便于屏幕阅读器辨识当前列(edit.jsx)。

块的注册入口在 index.js:通过initBlockmetadataeditsavedeprecated注册为core/column的设置对象,init.js 负责在运行时完成初始化。

响应式样式:flex 布局与移动端堆叠

列块的布局样式定义在父块样式文件 columns/style.scss(wp-block-columnswp-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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询