为什么要做 HTML5 语义化
HTML5的主要进步之一是引入了一组标准化的语义元素。 ”语义元素“是用于以更有意义的方式标记文档结构的元素,这种方式可以清楚地表明它们的用途和目的是什么。而且重要的是,由于它们是标准化的,定义文档的这些元素可以被每个人使用并理解,包括机器人。 在web无障碍开发领域,给视障用户使用的屏幕阅读器是视障群体访问网络的必备工具,合理的 HTML5 语义化元素,会让屏幕阅读器正确的理解网页的内容,从而以最为合适的方式朗读。 站在开发者的角度,写出符合 HTML5 语义化的结构,也是显示我们职业素养的一种方式,最为重要的是这样的代码自带翻译,比如下面的div结构,为了让开发者明白div的含义,我们必须在class命名上下功夫。
Super duper best blog ever
...Why you should buy more cheeses than you currently do
...而如果采用语义化元素,结构一目了然,不管是日后维护还是交接给他人,都是件轻松的事情。
Super duper best blog ever
...Why you should buy more cheeses than you currently do
...先来回顾一下 HTML5 有哪些元素(根据 MDN 资料整理)
HTML5 元素大全
文档元素
元素
HTML 文档中最外层的元素,也可称为根元素。
文档元数据
元素
元素
表示文档的头部
用来定义文档的标题
为页面上的所有的相对链接规定默认 URL 或默认目标
定义文档与外部资源的关系
提供了 HTML 文档的元数据
用于表示文档所使用的样式
区块
元素
元素
表示文档的内容
表示文档、页面、应用或网站中的独立结构
表示文档中的一个区域(或节)
描绘一个含有多个超链接的导航栏区域
表示一个和其余页面内容几乎无关的部分
标题(Heading)元素呈现了六个不同的级别的标题,<h1>
级别最高,而 <h6>
级别最低
表示最近一个章节内容或者根节点(sectioning root )元素的页脚
用于展示介绍性内容
内容分组
元素
元素
表示文本的一个段落
表示其中的内容提供了某个人或某个组织(等等)的联系信息
表示段落级元素之间的主题转换
表示预定义格式文本
表示其中的文字是引用内容
表示多个元素的有序列表
表示多个元素的无序列表
表示列表里的条目
表示一个包含术语定义以及描述的列表
用于在一个定义列表中声明一个术语
用来指明一个描述列表元素中一个术语的描述
代表一段独立的内容
与其相关联的图片的说明/标题
呈现了文档的 <body>
或应用的主体部分
通用型的流内容容器,它应该在没有任何其它语义元素可用时才使用
文本级语义
元素
元素
定义超链接,用于从一个页面链接到另一个页面
标记出需要用户着重阅读的内容
表示文本十分重要
表示边注释和附属细则,包括版权和法律文本
表示不再相关,或者不再准确的事情
表示一个作品的引用
表示一个封闭的并且是短的行内引用的文本
表示术语的一个定义
用于展示缩写
用来展示东亚文字注音或字符注释
用于分隔<ruby>
注释的基本文本组件
包含字符的发音
包含 <ruby>
元素中文字的语义注解
用于为那些不能使用 <ruby>
元素展示 ruby 注解的浏览器
将一个指定内容和机器可读的翻译联系在一起
用来表示24小时制时间或者公历日期
呈现一段计算机代码
表示变量的名称,或者由用户提供的值
用于标识计算机程序输出
表示用户输入
定义了一个下标文本区域
定义了一个上标文本区域
用于表现因某些原因需要区分普通文本的一系列文本
用于吸引读者的注意到该元素的内容上
表示具有未标注的文本跨度,显示渲染,非文本注释
用来表示上下文的关联性的而突出显示的文字
隔离可能以不同方向进行格式化的外部文本
用于覆盖当前文本的朝向
短语内容的通用行内容器,并没有任何特殊语义
在文本中生成一个换行(回车)符号
一个文本中的位置,其中浏览器可以选择来换行
修改记录
元素
元素
定义已经被插入文档中的文本
表示一些被从文档中删除的文字内容
嵌入内容
元素
元素
通过包含零或多个 <source>
元素和一个 <img>
元素来为不同的显示/设备场景提供图像版本
为 <picture>
, <audio>
或者 <video>
元素指定多个媒体资源
代表文档中的一个图像
表示嵌套的浏览上下文,有效地将另一个HTML页面嵌入到当前页面中
将外部内容嵌入文档中的指定位置。此内容由外部应用程序或其他交互式内容源(如浏览器插件)提供
表示引入一个外部资源,这个资源可能是一张图片,一个嵌入的浏览上下文,亦或是一个插件所使用的资源
为<object>
元素定义参数
用于支持文档内的视频播放
用于在文档中表示音频内容
指定计时字幕(或者基于时间的数据)
与 <area>
属性一起使用来定义一个图像映射(一个可点击的链接区域)
在图片上定义一个热点区域,可以关联一个超链接
表格数据
元素
元素
表示表格数据
展示一个表格的标题
用来定义表中的一组列表
定义表格中的列,并用于定义所有公共单元格上的公共语义
表示它们包含表的主体
定义了一组定义表格的列头的行
定义了一组表格中各列的汇总行
定义表格中的行
定义包含数据的表格的单元格
定义表格内的表头单元格
表单
元素
元素
示了文档中的一个区域,这个区域包含有交互控制元件
表示用户界面中某个元素的说明
用于为基于Web的表单创建交互式控件,以便接受来自用户的数据
表示一个可点击的按钮
表示一个控件,提供一个选项菜单
包含了一组<option>
元素,这些元素表示其它表单控件可选值
创建包含在一个 <select>
元素中的一组选项
用于定义在<select>
, <optgroup>
或<datalist>
元素中包含的项
表示一个多行纯文本编辑控件
表示计算或用户操作的结果
用来显示一项任务的完成进度
用来显示已知范围的标量值或者分数值
用来对表单中的控制元素进行分组
用于表示它的父元素<fieldset>
的内容的标题
交互元素
元素
元素
可创建一个挂件,仅在被切换成展开状态时,它才会显示内含的信息
用作 一个<details>
元素的一个内容的摘要,标题或图例
表示一个对话框或其他交互式组件
脚本元素
元素
元素
用于嵌入或引用可执行脚本
定义脚本未被执行时的替代内容
用于保存客户端内容机制,该内容在加载页面时不会呈现
用来通过脚本(通常是JavaScript)绘制图形
是 Web Components 技术套件的一部分,是Web组件内的一个占位符
基本布局
header 、footer 不止表示页头页尾
通常的用法都是把一个页面的页头用header,页尾用footer来表示,但这并不是它们的唯一用法,根据元素的定义,它们表示的是章节或区块的头和尾,严格来说一个<article>
元素的头部需要用 header 来表示,如:
我们是相亲相爱的一家人
.....
但以上这种 header 中只有一个 h2 的场景中 header 是可以忽略的。 MacOs VoiceOver 读屏软件对 div 中的 header 会说“横幅”,而对 article 、section 中的 header 会忽略,直接读内部的内容。查看示例
section 、 figure 的用法区别
section 和 figure 有相似的地方,都可以表示一个区域,结构上也相似,都可以有标题和内容,但两个元素的用法是完全不一样的。
- section 的内容跟上下文结构存在关联关系,figure 的内容是独立存在的一部分,把 figure 移除不影响主体内容的表达;
- section 中存在标题只能在开始的位置,figure 中的标题可以在开头也可以在结尾;
MacOs VoiceOver 读屏软件会把 section 的标题说成“标题”,但对 figure 的标题会说成“文本”。查看示例
article 、 section 、 div 的用法区别
- 如果元素内容可以分为几个部分的话,应该使用
<article>
而不是<section>
。 - 如果内容中的几个部分是互相独立的,应该使用
<article>
嵌套,几个部分的内容之间是关联的应该使用<section>
。 - 不要把
<section>
元素作为一个普通的容器来使用,这是本应该是<div>
的用法(特别是当片段仅仅是为了美化样式的时候)。
MacOs VoiceOver 读屏软件对3个元素的朗读方式没有区别,都是直接读取内部的内容。查看示例
不是所有的导航链接都需要 nav
只用来将一些热门的链接放入 <nav>
导航栏,建议这些链接应该是跟当前页面或站点有较强的关联性。例如 <footer>
元素就常用来在页面底部包含一个不常用到,没必要加入 <nav>
的链接列表。 MacOs VoiceOver 读屏软件遇到 nav 时会先说“导航“,下一步读取内部的内容,最后会说”导航的结尾“。查看示例
address 的内容不只是地址
HTML <address>
元素 表示其中的内容提供了某个人或某个组织的联系信息,包括真实地址、URL、电子邮箱、电话号码、社交媒体账号、地理坐标等等,通过它会被放到 footer 里,但这并不是唯一的用法,在页头 header 中,article 或其它区块中需要显示联系信息的地方都可以使用 address。 MacOs VoiceOver 读屏软件遇到 address 只是当作普通文本朗读。查看示例
em 、 strong 、 b 、 i 、 mark 的用法区别
这几个元素表示的都是对文本内容的强调,但强调的含义是不一样的
- em 强调的是语句的重心,如“我
<em>
今天</em>
吃薯条了”、“我今天吃<em>
薯条</em>
了”; - strong 强调的是一句话中重要的一定要看的部分,如”每天早上9点打卡,
<strong
迟到者罚款1000元</strong>
“; - b 强调的是视觉上需要吸引用户来看的内容,类似广告语,对用户来说并不一定很重要;
- i 强调的是一段文本中,某些部分需要跟周边的文本做一些视觉上区别,但不一定是吸引人的;
- mark 强调的是上下文的关联性,如搜索关键字;
MacOs VoiceOver 读屏软件遇到这5个元素时只是当作普通文本朗读。查看示例
small 、 s 、 u 还能用吗
这三个元素在 HTML5 之前,都是为了表示明显的排版视觉效果,HTML5 中保留下来并添加了新的语义
- small 用来描述对内容的注释,如版权和法律文本等;
- s 用来表示不再相关或不再准确的事,如之前对某句话的解释,很多年之后已经不适用,但要保留在内容中的时候;
- u 用来标记中文文本中的专有名称,或将文本标记为拼写错误;
建议在除了上面提到的几个特殊用途之外,不再使用这三个元素; MacOs VoiceOver 读屏软件遇到这3个元素时只是当作普通文本朗读。查看示例
blockquote 、 q 、 cite 都表示引用,如何区分
- blockquote 引用的是长文本;
- q 引用的是短文本;
- cite 引用的是一个作品的名称或链接;
MacOs VoiceOver 读屏软件遇到这3个元素时只是当作普通文本朗读。查看示例
什么时候使用 div
根据元素的定义,只有在所有 html5 标签都不适用于你想表达的语义时,这时候才使用终极大法 div,从这个角度来说,目前对 div 元素的滥用其实是程序员偷懒的一种表现,反正有 div 兜底,也就懒得去思考那些语义元素的区别。 在追求开发效率和做不完的需求面前,使用 div 兜底也是很多人无奈的选择,我觉得这个是可以理解,某种程度上也可以接受的,但进一步去想一想,你的产品面向的用户也有可能会是存在各种行为障碍的视障、残障人群,他们无法像正常人那样使用你开发的功能,而需要借助类似于屏幕阅读器这样的辅助工具,这时候才是真正考验你的产品是否合格的时候。 我们做语义化开发,很大程度上就是在帮助更多人的人正常的使用我们的产品,同时也会让你离专业的程序员更进一步。