
Gutenberg 块编辑器中的 FontSizePicker 组件从基础用法到源码级实现解析【免费下载链接】gutenbergThe Block Editor project for WordPress and beyond. Plugin is available from the official repository.项目地址: https://gitcode.com/GitHub_Trending/gu/gutenberg关联文档packages/block-editor/src/components/font-sizes/README.md导读FontSizePicker是 GutenbergWordPress 块编辑器中负责字号选择交互的核心 React 组件它让用户在预设字号与自定义字号之间自由切换。本文将以wordpress/block-editor包内该组件的官方文档为主线完整覆盖其用法与 Props并结合仓库源码剖析其与wordpress/components基础组件的差异、编辑器设置的自动注入机制、字号工具函数与流体排版fluid typography的前后端一致性实现。读完本文你将能够在自己的块Block编辑器中正确使用FontSizePicker并理解字号属性、CSS 类名生成与clamp()流体字号背后的完整链路。FontSizePicker 是什么FontSizePicker是一个 React 组件它渲染一套允许用户选择字号的 UI。其界面由两部分构成一组预设常用字号选项例如Small、Big一个自定义字号入口在启用该功能时允许用户直接输入或通过滑块指定任意字号值。在wordpress/block-editor中存在一个与wordpress/components对等的组件。两者的关键区别在于block-editor 版本不要求调用方显式传入fontSizes和disableCustomFontSizes两个属性——这两个值由编辑器设置editor settings自动计算得出。这意味着在块编辑场景中你只需关心业务相关的value、onChange等少量 Props字号预设列表会自动从主题/编辑器配置中读取。基础用法官方文档给出了一个最小可运行示例直接使用wordpress/block-editor导出的FontSizePickerimport { FontSizePicker } from wordpress/block-editor; import { useState } from wordpress/element; import { __ } from wordpress/i18n; const MyFontSizePicker () { const [ fontSize, setFontSize ] useState( 16 ); const fontSizes [ { name: __( Small ), slug: small, size: 12, }, { name: __( Big ), slug: big, size: 26, }, ]; const fallbackFontSize 16; return ( FontSizePicker value{ fontSize } fallbackFontSize{ fallbackFontSize } onChange{ ( newFontSize ) { setFontSize( newFontSize ); } } / ); }; MyFontSizePicker /几点使用要点fontSizes数组中每个对象包含name显示标签、slug唯一标识用于 CSS 类名生成、size字号数值三个核心字段fallbackFontSize与onChange共同配合滑块交互见下文 Props 说明在本例中未传fontSizes组件的预设列表实际来自编辑器设置typography.fontSizes这正是 block-editor 版本与 components 版本行为上的核心差异。组件 Props 详解文档明确列出了 block-editor 版FontSizePicker接受的 Props完整信息如下fallbackFontSize当当前没有值时该属性定义字号选择器滑块的起始位置。仅在withSlider为true时生效。类型Number必填否onChange一个接收新字号值的回调函数。如果onChange被无参数调用则意味着重置值具体重置语义由使用方根据上下文决定——例如将字号设置为undefined或恢复为某个起始值。类型function必填是value当前字号值。类型Number必填否withSlider如果为trueUI 中将显示一个滑块取代数字文本输入框如果为false则不显示滑块。类型Boolean必填否默认值false由基础组件继承的更多 Props由于 block-editor 版本质上是对wordpress/components中FontSizePicker的薄封装因此基础组件的全部 Props 同样可用。根据 packages/components/src/font-size-picker/README.md 与 types.ts其中与编辑器场景高度相关的还包括Prop类型默认值说明fontSizesFontSize[][]预设字号对象数组。对象需包含size数字 px 值或形如13px、1em、clamp(12px, 5vw, 100px)的字符串 CSS 值、name标签、slug唯一标识用于类名生成。default与custom为保留 slug不可使用disableCustomFontSizesbooleanfalse为true时用户无法选择自定义字号只能从预设字号中挑选unitsstring[][px,em,rem,vw,vh]自定义字号可选的单位列表valueModeliteral \| slugliteral指定value的解释方式字面量字号值或所选字号的 slugwithResetbooleantrue自定义字号激活时输入框旁是否显示重置按钮disableCustomFontSizes为true时不生效__nextHasNoMarginBottombooleanfalse已废弃自 WP 6.5 起为默认行为需要特别说明的是units的使用前提要让units生效value必须是以带单位字符串形式传入如12px当value为数字时组件运行在无单位模式units不产生作用。源码级剖析block-editor 版如何自动注入设置block-editor 版FontSizePicker的实现非常精简完整代码位于 font-size-picker.jsximport { FontSizePicker as BaseFontSizePicker } from wordpress/components; import { useSettings } from ../use-settings; function FontSizePicker( props ) { const [ fontSizes, customFontSize ] useSettings( typography.fontSizes, typography.customFontSize ); return ( BaseFontSizePicker { ...props } fontSizes{ fontSizes } disableCustomFontSizes{ ! customFontSize } / ); }它通过useSettings钩子一次性读取两个编辑器设置路径并自动映射为底层组件的两个 Propstypography.fontSizes→fontSizes预设字号列表typography.customFontSize→disableCustomFontSizes的取反即当自定义字号被禁用时直接透传disableCustomFontSizes{ true }。useSettings的实现见 use-settings/index.js它基于当前块实例useBlockEditContext提供的clientId调用getBlockSettings查找设置——先在块实例层级Block Instance的设置中查找找不到再回退到块编辑器设置Block Editor Settings。这保证了主题定义的settings.typography.fontSizes能正确到达组件。字号工具函数属性解析与 CSS 类名packages/block-editor/src/components/font-sizes/目录下除了组件本身还提供了一组与字号处理相关的纯函数见 utils.js这些函数在块属性与最终渲染结果之间起到桥梁作用getFontSize( fontSizes, fontSizeAttribute, customFontSizeAttribute )根据命名字号属性slug与自定义字号属性数值解析出最终字号对象若fontSizeAttribute存在且在fontSizes中命中相同 slug返回该字号对象否则返回{ size: customFontSizeAttribute }即回退到自定义字号值。getFontSizeObjectByValue( fontSizes, value )根据数值查找对应的字号对象未命中时返回{ size: value }。getFontSizeClass( fontSizeSlug )根据字号 slug 生成 CSS 类名规则是has-前缀 kebab-case 化的 slug -font-size后缀。例如14px→has-14-px-font-size16→has-16-font-size#abcdef→has-abcdef-font-size这些行为在 test/utils.js 中都有对应的 Vitest 用例验证例如Should return the correct font size class when given a string断言getFontSizeClass( 14px )等于has-14-px-font-size。withFontSizes 高阶组件目录中还包含一个高阶组件 with-font-sizes.jsx用于把字号逻辑注入块组件它会自动读取typography.fontSizes设置为被包裹组件提供fontSizes属性并根据传入的字号属性名如fontSize自动生成对应的自定义字号属性名约定为custom 首字母大写的属性名如customFontSizesetFontSize之类的 setter 方法——调用时若新值能命中预设字号则写入 slug否则写入自定义字号值通过getDerivedStateFromProps同步解析出包含size与class的当前字号对象。这在类似段落块这类同时具备预设与自定义字号语义的块中非常常见。流体排版Fluid Typography的前后端一致性FontSizePicker的选择结果最终会被渲染为 CSSfont-size。当主题启用了流体排版settings.typography.fluid时字号会被转换为clamp()表达式。这一逻辑在前端与后端各有一套实现且必须保持一致前端packages/block-editor/src/components/font-sizes/fluid-utils.js中的getComputedFluidTypographyValue()后端lib/block-supports/typography.php中的gutenberg_get_typography_font_size_value()。fluid-utils.js文件头部有明确注释说明这一对应关系并定义了整套默认参数const DEFAULT_MAXIMUM_VIEWPORT_WIDTH 1600px; const DEFAULT_MINIMUM_VIEWPORT_WIDTH 320px; const DEFAULT_SCALE_FACTOR 1; const DEFAULT_MINIMUM_FONT_SIZE_FACTOR_MIN 0.25; const DEFAULT_MINIMUM_FONT_SIZE_FACTOR_MAX 0.75; const DEFAULT_MINIMUM_FONT_SIZE_LIMIT 14px;getComputedFluidTypographyValue的核心用法见 fluid-utils.js// 给定最小与最大字号计算流体字号。 const fontSize getComputedFluidTypographyValue( { minimumFontSize: 20px, maximumFontSize: 45px, } ); // 只给单个字号按对数比例尺自动推导上下限。 const fontSize getComputedFluidTypographyValue( { fontSize: 30px, } );其输出形如clamp(14px, 3.3px 2.1vw, 36px)即 CSS 原生clamp()表达式。函数内部还借助getTypographyValueAndUnit完成单位归一化默认支持rem、px、em纯数值按px处理rem/em与px之间按rootSizeValue 16换算并对非法单位、无效视口区间等边界情况返回null以保护性降级。后端的gutenberg_get_typography_font_size_value()见 lib/block-supports/typography.php 附近实现了几乎一致的算法同样归一化单位、计算线性因子并输出clamp()表达式。这种前后端双实现 注释互相对齐的设计保证了编辑器预览与前端渲染结果完全一致。在实际块中使用综合以上内容一个典型的块编辑器中字号控制器的组合方式如下import { FontSizePicker, getFontSizeClass } from wordpress/block-editor; // 在块 edit 中 FontSizePicker value{ attributes.fontSize } fallbackFontSize{ 16 } withSlider onChange{ ( nextValue ) { // 无参数调用表示重置 if ( nextValue undefined ) { setAttributes( { fontSize: undefined } ); return; } setAttributes( { fontSize: nextValue } ); } } /同时在save端或服务端渲染端通过getFontSizeClass( attributes.fontSize )生成如has-small-font-size的类名配合主题 CSS 完成最终样式输出若启用了流体排版字号值还会被前后端一致的clamp()计算逻辑处理确保响应式缩放。总结wordpress/block-editor的FontSizePicker是对wordpress/components基础组件的封装自动从编辑器设置注入fontSizes与disableCustomFontSizes降低了块开发者的使用门槛其核心 PropsfallbackFontSize、onChange、value、withSlider与基础组件继承的 PropsfontSizes、units、valueMode、withReset等共同覆盖了预设选择、自定义输入、滑块调节与重置的完整交互配套的 utils.js、with-font-sizes.jsx 与 fluid-utils.js 分别负责字号解析、类名生成、高阶注入与流体字号计算构成了一套完整的字号控制体系流体排版的算法在 lib/block-supports/typography.php 中有对等的 PHP 实现前后端保持一致是 Gutenberg 架构中编辑器与渲染结果一致原则的典型体现。相关源码文件索引font-size-picker.jsxblock-editor 版组件封装utils.js字号解析与类名工具函数with-font-sizes.jsx字号高阶组件fluid-utils.js前端流体字号计算test/utils.js工具函数测试packages/components/src/font-size-picker/types.ts基础组件 Props 类型定义packages/block-editor/src/components/use-settings/index.jsuseSettings设置读取钩子lib/block-supports/typography.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),仅供参考