鸿蒙 NEXT 自定义富文本解析组件(HtmlRichText)
不依赖 WebView 和系统 RichText 的自研 HTML 富文本组件,专为资讯/文章详情页设计。 手写 HTML 解析器 + ArkUI 原生渲染(Text / Span / Image / Flex / Grid),样式完全可控。
标题
正文内容加粗
' private config: RichTextConfig = new RichTextConfig() build() { Scroll() { Column() { HtmlRichText({ html: this.html, // HTML 字符串(变化会自动重新解析) config: this.config, // 样式配置(可空,用默认值) baseUrl: 'https://cdn.example.com', // 图片/链接相对路径前缀(可选) onLinkClick: (url: string) => { this.openUrl(url) }, // 链接点击 onImageClick: (index: number, url: string) => {}, // 图片点击(index 为全文图片序号) onImageLoadError: (url: string) => {} // 图片加载失败 }) } .width('100%') .padding(16) } } } ``` > 想先看效果?把 `demo/RichTextDemoPage.ets` 复制到 `entry/src/main/ets/pages/`, > 在 `main_pages.json` 注册 `{ "src": "pages/RichTextDemoPage" }` 编译即可。 > 组件放在 `Scroll` 内使用即可,高度自适应内容。 --- ## 五、API ### HtmlRichText 参数 | 参数 | 类型 | 必填 | 说明 | | ---- | ---- | ---- | ---- | | `html` | `string` | 是 | 富文本 HTML 字符串;变化时自动重新解析渲染 | | `config` | `RichTextConfig` | 否 | 样式配置,默认内置一套 | | `baseUrl` | `string` | 否 | 相对图片/链接地址的前缀,`/` 开头或绝对地址不拼接 | | `onLinkClick` | `(url: string) => void` | 否 | `` 链接点击回调;**提供后全权处理链接点击,组件不跳转** | | `onImageClick` | `(index, url) => void` | 否 | 图片点击回调(全组件图片按出现顺序编号) | | `onImageLoadError` | `(url: string) => void` | 否 | 图片加载失败回调 | 链接点击优先级:**传了 `onLinkClick` 以回调为准**(组件不跳转,可在回调里做自定义 行为,如弹窗/复制/站内跳转);未传回调时,组件**默认用系统浏览器打开**链接 (`config.linkOpenBrowser = false` 可关闭该默认行为,点击无反应)。 内置能力:点击图片默认打开全屏预览(Swiper 左右滑动 + 双击缩放),可通过 `config.enableImagePreview = false` 关闭。 ### RichTextConfig 常用配置 ```ts const config = new RichTextConfig(); config.bodyFontSize = 17; // 正文字号 config.bodyLineHeight = 1.8; // 行高(倍数) config.paragraphSpacing = 14; // 段间距 config.headingSizes = [22, 20, 18, 17, 16, 15]; // h1~h6 字号 config.linkColor = '#1E6FFF'; // 链接颜色 config.linkUnderline = true; // 链接下划线 config.linkOpenBrowser = false; // 未传 onLinkClick 时点击链接默认打开系统浏览器(默认 true,置 false 关闭) config.codeBlockBackground = '#F6F8FA'; // 代码块背景 config.enableCodeHighlight = true; // 代码高亮开关 config.imageRadius = 8; // 图片圆角 // ... 完整字段见 RichTextConfig.ets ``` --- ## 六、支持的标签 | 类别 | 标签 | | ---- | ---- | | 标题 | `h1` ~ `h6` | | 文本 | `p` `span` `div` `strong/b` `em/i` `u/ins` `del/s/strike` `mark` `small` `big` `sub` `sup` | | 链接 | `a`(点击回调 + 下划线 + 链接色) | | 图片 | `img` `figure` `figcaption`(占位背景、加载失败回调、点击全屏预览、width/height 属性) | | 列表 | `ul` `ol` `li`(支持嵌套,圆点/空心圆/方块/数字序号) | | 代码 | `pre` `code` `kbd` `samp` `tt`(代码块横向滚动 + 轻量语法高亮) | | 引用 | `blockquote`(左边框 + 背景色) | | 表格 | `table` `tr` `td` `th`(支持 colspan/rowspan、表头背景、边框) | | 其他 | `hr` `br` `center` `section` `article` 等 | 另支持: - 内联 CSS:`color` `font-size` `font-weight` `font-style` `text-decoration` `line-height` `letter-spacing` `text-align` `margin` `padding` `border-radius` `background-color` `vertical-align` `width` `height` - HTML 实体:`&` `<` `>` ` ` `'` `'` 等 - 容错:标签未闭合自动补全、多余闭合标签忽略、`script/style` 内容跳过 --- ## 七、常见问题 **Q:代码高亮效果不满意?** A:`config.enableCodeHighlight = false` 关闭;或修改 `SimpleCodeHighlighter.ets` 中的配色。 **Q:图片宽度想限制为百分比?** A:`img` 未指定 `width/height` 时默认占满容器宽度并等比缩放;指定了属性则按指定尺寸 (超出容器宽度会自动约束在 100% 内)。 **Q:链接点击行为怎么控制?** A:组件**默认用系统浏览器打开** `原创文章,作者:ECHO陈文,如若转载,请注明出处:https://www.luweipai.cn/notes/1789549135/