学习《重学前端》—— 03-HTML语义: div 和 span 不是够用了吗?
HTML: 典型的“入门容易,精通困难”的一部分知识。
语义类标签
语义类标签特点: 视觉标签上互相差不多,区别:表示了不同的语义,比如 section、nav、p 等标签。
多数语义由文字来承载的,语义类标签则是纯文本的补充,比如标题、自然段、章节、列表,这些内容都是纯文本无法表达的,需要依靠语义类标签代为表达。
一般情况下只靠 div 和 span 就完全足够。但是语义类标签有自己无可替代的优点
- 对开发者友好,使用语义标签增强了可读性,脱离 CSS 也可清晰地看出网页结构,同时便于开发和维护。
- 对人类友好,语义类标签适宜机器阅读、文字表现力丰富,适合搜索引擎检索(SEO)、让搜索引擎爬虫更好地获取更多有效信息,提升网页搜索量、支持读屏软件、根据文章自动生成目录…
但是错误使用语义标签,会给机器阅读造成混淆、增加嵌套,给 CSS 编写加重负担。
对语义标签,“用对”比“不用”好,“不用”比“用错”好,应该追求“用对”它们。
几种重要场景
1、表达一定的结构
作为自然语言和纯文本的补充,用来表达一定的结构或者消除歧义。
在日语中,有一个语法现象叫做:ルビ,它的读音是 ruby(著名的 ruby 语言就是据此命名的),它中文的意思大约类似于注音或者意思的注解
在中国, ruby 的形式被玩出了新花样:表情包
这个图片很形象的表达了语义
在 HTML5 中,就引入了 ruby 标签,它由 ruby、rt、rp 三个标签来实现。
这些情况存在的语义,其实原本就存在了,只是我们用纯文本无法表达, HTML 作为一种“超文本”语言,支持这些文字表达就是必要的了。
2、没有语义标签会产生歧义
例子:
1、今天我吃了一个苹果。
上边这句话在不同的上下文中重点强调的词语不同
1、昨天我吃了一个香蕉。
2、今天我吃了一个苹果。
// 强调的是苹果
1、昨天我吃了两个苹果。
2、今天我吃了一个苹果。
// 强调的是个数(一个)
下边使用语义标签来消除歧义
1、今天我吃了一个 <em> 苹果 </em>。
2、今天我吃了 <em> 一个 </em> 苹果。
延伸:em 和 strong
两者都是表达强调, 表示 HTML 页面上的强调。 表示句子中的强调。
3、作为标题摘要的语义类标签(文章结构)
例如:古代小说中的“章 - 回”的概念,西方戏剧“幕”的区分
HTML 语义标签中,有不少是用于支持这样的结构的标签。
语义化的 HTML 能够支持自动生成目录结构,HTML 标准中还专门规定了生成目录结构的算法。
一篇文档会有一个树形的目录结构,由各级的标题组成,这个树形结构可能不会和 HTML 元素的嵌套关系一致。例如:
<h1>HTML 语义</h1>
<p>bala bala bala bala</p>
<h2>弱语义</h2>
<p>bala bala bala bala</p>
<h2>结构性元素义</h2>
<p>bala bala bala bala</p>
上面这段 HTML 几乎是平铺的元素,但是它的标题结构是:
- HTML 语义
- 弱语义
- 结构性元素
- …
h1 - h6 是最基本的标题,分别表示了文章中不同层级的标题,但是有些场景需要有副标题,为了避免产生额外的层级,可以使用 hgroup 标签。
接下来是使用和不使用 hgroup 标签的对比
1、不用 hgroup 标签
<h1>JavaScript 对象</h1>
<h2> 我们需要模拟类吗? </h2>
<p>bala bala bala</p>
表现形式
- JavaScrpit 对象
- 我们需要模拟类吗?
- …
2、使用 hgroup 标签
<hgroup>
<h1>JavaScript 对象</h1>
<h2>我们需要模拟类吗?</h2>
</hgroup>
<p>bala bala bala</p>
表现形式
- JavaScript 对象——我们需要模拟类吗?
- …
hgroup 中的 h1 - h6 标签被视为同一标题的不同组成部分。
HTML5 中,开始有 section 标签,这个标签会改变 h1 - h6 标签 的语义。 section 的嵌套会使其中的 h1 - h6 下降一级,所以在 HTML5 中,我们只需要 section 和 h1 标签就可以形成树形结构
<section>
<h1>HTML 语义</h1>
<p>bala bala bala</p>
<section>
<h1>弱语义</h1>
<p>bala bala bala</p>
</section>
<section>
<h1>结构性元素</h1>
<p>bala bala bala</p>
</section>
</section>
表现标题结构
- HTML 语义
- 弱语义
- 结构性元素
- …
4、作为整体结构的语义类标签
应用了语义化结构的页面,可以明确地提示出页面信息的主次关系,能够让浏览器很好地支持“阅读视图功能”,还可以让搜索引擎的命中率提升,同时对视障用户的读屏软件更友好
<body>
<header>
<nav>
</nav>
</header>
<aside>
<nav>
</nav>
</aside>
<section></section>
<section></section>
<section></section>
<footer>
<address></address>
</footer>
</body>
除此之外,还有 article ,这个标签是一种特别的结构,表示具有一定独立性质的文章。一个典型的场景是多篇新闻展示在同一个新闻专题页面中,类似报纸的多文章结构,适合用 article 来组织。
<body>
<header>...</header>
<article>
<header>...</header>
<section>...</section>
<section>...</section>
<footer></footer>
</article>
<article>
<header>...</header>
<section>...</section>
<section>...</section>
<footer></footer>
</article>
<article>
<header>...</header>
<section>...</section>
<section>...</section>
<footer></footer>
</article>
<footer>
<address></address>
</footer>
</body>
这是一个典型的多文章结构
其他一些新的标签
- header: 通常出现在前部,表示导航或者介绍性内容。
- footer: 通常出现在尾部,包含一些作者信息、相关连接、版权信息等。
- aside: 表示和文章主题不太相关的部分,可能包含导航、广告等工具性内容。
- aside: 容易被理解为侧边栏,实际上二者是包含关系,侧边栏是 aside , aside 不一定是侧边栏。
header 和 aside 都可能出现导航(nav),二者区别是:header 中的导航是文章的目录; aside 的导航是关联页面,或者是整站地图。
footer 中包含 address , 很容易被误用:address 表示“文章(作者)的联系方式”,明确地只关联到 article 和 body, 并不是表示一个给机器阅读的地址
总结
整体上了解 HTML 语义。
- 三个明确的场景
- 自然语言表达能力的补充。
- 文章标题摘要。
- 适合机器阅读的整体结构。
最后,推荐 winter 老师的《重学前端》课程