wxml不支持html5语义化标签,如、等,必须用替代并配合class、aria属性模拟结构,富文本需通过wxparse等工具转换。

不能用。微信小程序的 WXML 不解析 <header></header>、<footer></footer>、<section></section>、<article></article>、<nav></nav> 等 HTML5 语义化标签,直接写进去会报错或被忽略。
WXML 根本不识别 HTML5 语义标签
小程序运行在非浏览器环境,WXML 解析器只认有限的内置组件。遇到 <header></header> 这类标签,不是“渲染效果不好”,而是根本不会进入 DOM 树——开发者工具控制台会直接报 Component is not found in path 或静默跳过。WXML 的设计目标不是兼容 HTML,而是精简、可控、可预测。
<div> → 必须换成 <code><view></view>(无语义,纯容器)-
<p></p>→ 必须换成<text></text>(仅支持文本,不能嵌套<view></view>) -
<header></header>/<footer></footer>/<section></section>→ 没有对应组件,只能用<view></view>+ class 模拟结构 -
<button></button>虽然名字一样,但行为受限:不支持type="submit"在 form 内自动提交,也不触发原生表单验证 - 屏幕阅读器无法识别
class="header"的语义,仍会读作“普通容器” -
微信小程序没有
document.querySelector('header')这类 API,JS 层无法按语义查询 - SEO 和可访问性(a11y)完全失效:小程序本身不走搜索引擎索引,但内部无障碍功能(如 voiceover)依赖组件类型而非 class 名
- WXSS 中无法用
header { ... }做样式作用域,必须显式写.header { ... }
为什么不能靠 class 或 style “假装”语义化
有人试图写 <view class="header"></view> 并在 WXSS 里加样式,以为这就等价于 <header></header>。但问题不在视觉——而在能力缺失:
替代方案:用 view + 语义化 class + ARIA 属性补足
如果真需要表达结构意图(比如给审核或协作留痕),可在 <view></view> 上加 aria-label 或 aria-role:
<view aria-role="banner" class="app-header"><text>我的小程序</text></view><view aria-role="main" class="page-content"><text>正文内容</text></view>
注意:aria-role 不是万能的,iOS 微信对部分 role 支持不稳定;更可靠的做法是把语义逻辑下沉到 JS 层,比如在页面 data 中标记 sectionType: 'navigation',再由业务逻辑决定渲染行为。
富文本里出现语义标签怎么办
后端返回的 HTML 富文本(如文章正文)含 <h2></h2>、<ul></ul> 等,不能直接插进 WXML。必须走转换流程:
- 用
wxparse这类库解析并映射:它会把<h2></h2>转成<view class="wxparse-h2"></view>,再靠 WXSS 控制样式 - 别自己正则替换——
<h2><span>标题</span></h2>这种嵌套结构正则极易漏掉或错配 - 转换后检查是否丢失内联样式:WXML 不支持
style属性里的margin-top等,需提前归一为 class
真正容易被忽略的点是:语义化在小程序里不是“要不要做”的问题,而是“做不到”的事实。所有结构意图都得靠 <view></view> + class + JS 数据 + 少量 ARIA 组合实现,没有捷径,也不能指望 HTML 习惯自动迁移。











