J2.09.3presentational impersonation of structure设计研究

用样式模拟结构会丢失语义

别名: 样式冒充结构 · fake semantics · presentational markup

概念解释

加粗加大当作章节、前头加个圆点当作一项、画几条线当作表、空行当作分段——画面上有结构,树上是平的。用样式模拟结构会把辅助技术需要的角色丢掉:阅读器看见的是一串无角色的文本节点,跳转、按项移动、按格移动都没有落点。

标题跳、列表表语义,是两种最常见的丢失现场。这一张讲的是共同机制:视觉结构若只活在 CSS 里,语义通道就是空的。

机制

人的视觉系统从对比、对齐、编号、缩进读出层级。辅助技术不走这条通路,只问节点的角色。font-size、左边距、伪元素圆点、border 网格都能骗过眼睛,问角色时答案仍是「通用容器」或「一段文字」。结果是两种界面:给眼睛的有章节、有组、有表;给耳朵的是没有标点的平原。

丢失是静默的。页面不报错,自动检测往往也过(对比度还在、焦点还在),直到有人召唤标题列表或试着按格走表,才发现结构从未存在。补救若再叠一层错误角色(把整页包成一个表、把按钮标成标题),会比没有更糟,因为假角色会启动错误的操作预期。

怎么研究

同一内容做「只靠样式」和「真正语义」两版,请读屏用户完成依赖结构的任务:跳到某节、说出列表有几项、读出某格相对表头的值。因变量:成功率、是否误以为页面没有章节、元素列表里角色计数。

把 CSS 去掉是最狠的对照:真结构还在,假结构消失。无障碍树快照可以定量:视觉分组数 vs 带结构角色的节点数。差距就是被样式冒充掉的那一层。

边界

纯装饰(分割线、背景纹理、卡片圆角)本来就不是结构,不该也不需要角色;把它们标成标题或表才是错。设计稿阶段用样式探索层级是合法的,交付时必须把已确定的层级写成语义。有些组件库用无语义容器再在运行时注入角色,以注入后的树为准,不以源标签为准——但注入失败时,失败模式与「只有样式」相同。

怎么落地

  • 凡是你准备在评审时称之为「章节 / 一组项 / 一张表 / 一句引用」的东西,交付时就要有对应角色,而不是只留下看起来像的样式。
  • 先写语义再写样式。若去掉样式后层级塌成一片,说明结构还没写进树。
  • 不要用错误角色去「补」假结构;没有角色比假角色容易修。
  • 验证:无样式读一遍,有样式读一遍,结构操作(标题跳、列表项、表头)应当同样可用。再看无障碍树:每个视觉分组应能指到一个结构角色。指空的分组,就是样式在演戏。

延伸

  • 同组J2.09.1 标题层级用于快速跳转 · J2.09.2 列表、表格需使用对应语义
  • 相邻J2.14 语义结构与标题层级 · J5.02 无障碍树与角色 · J5.03 语义补充属性
  • 站内检索presentational markup · fake semantics · CSS impersonation

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/J2.09.3