itemtype 不支持嵌套,仅能链式声明;父子关系须通过 itemprop 显式绑定,如 author、affiliation 等官方属性;深层结构推荐使用 JSON-LD。

itemtype 不能“嵌套”使用,只能链式声明
itemtype 本身不支持嵌套语法,比如 <div itemscope itemtype="https://schema.org/Person"><div itemscope itemtype="https://schema.org/Organization"></div></div> 这种写法看似嵌套,但实际只是两个独立的 itemscope 区域——它们之间没有语义关联,itemtype 不会自动继承或组合。真正起作用的是 itemprop 指向的属性值是否被另一个 itemscope 覆盖。
- 每个
itemscope定义一个独立实体,itemtype只描述它自己 - 父子关系靠
itemprop显式绑定,例如author、publisher、location等属性值本身可以是另一个itemscope - 浏览器和搜索引擎只解析 DOM 树中“属性值节点是否带
itemscope”,不关心 HTML 缩进或标签包裹层级
多层级标记必须用 itemprop 指向另一个 itemscope
想表达 “Article → Author → Organization”,关键不是把 <div itemtype="Organization"> 塞进 Author 的标签里,而是让 Author 的某个 itemprop(如 affiliation 或 worksFor)的值节点自身带 itemscope。
- 正确写法:
<div itemscope itemtype="https://schema.org/Article"><span itemprop="author" itemscope itemtype="https://schema.org/Person"><span itemprop="name">张三</span><span itemprop="affiliation" itemscope itemtype="https://schema.org/Organization"><span itemprop="name">某公司</span></span></span></div> - 错误写法:
<div itemscope itemtype="Article"><div itemprop="author"><div itemscope itemtype="Person">...</div></div><div itemscope itemtype="Organization">...</div></div>—— 后一个Organization和Person无任何属性连接,会被当成孤立实体 - 所有跨层级关系都依赖 Schema.org 官方定义的属性名,比如
author允许值为Person或Organization,但name就不允许再指向另一个itemscope
JSON-LD 比 HTML microdata 更适合深层嵌套
当层级超过两层(如 Article → Author → Address → GeoCoordinates),用 HTML microdata 写起来极易出错:DOM 位置稍偏、itemprop 拼错、漏掉 itemscope,都会导致结构断裂。而 JSON-LD 是纯数据描述,不依赖 HTML 结构。
- 同一份数据,JSON-LD 可直接写成嵌套对象:
{"@type": "Article", "author": {"@type": "Person", "affiliation": {"@type": "Organization", "address": {"@type": "PostalAddress", "geo": {"@type": "GeoCoordinates"}}}}} - HTML microdata 中,
geo属性必须落在address的子元素上,且该子元素还得带itemscope和对应itemtype,缺一不可 - Google Rich Results 测试工具对 JSON-LD 的解析容错率明显更高;microdata 一旦某层
itemprop值为空或类型不匹配,整条链可能被截断
常见错误:用 div/p 包裹 itemscope 导致语义丢失
很多人为了排版方便,在 itemscope 外加一层 <p> 或 <div>,但这样会导致属性值脱离上下文。例如:
立即学习“前端免费学习笔记(深入)”;
- 错误:
<p><span itemscope itemtype="Person"><span itemprop="name">李四</span></span></p>——name的值是李四,但p标签本身不是itemprop的合法容器,某些解析器会忽略这层包装 - 推荐直接在语义合理标签上加:
<h2 itemscope itemtype="Person"><span itemprop="name">李四</span></h2>,或用<span>+itemprop组合 - 特别注意:不要在
<li>外再套<div>来包itemscope,li本身就是合法容器,额外包裹反而干扰列表语义
真正难的不是写几层 itemscope,而是每层 itemprop 是否严格匹配 Schema.org 定义的预期类型,以及值节点是否确实被它直接包裹——差一个标签层级,机器就认不出来。



















