HTML语义:div和span不是够用了吗?

语义类标签

常见到的section、nav、p。
语义是我们说话表达的意思,多数情况下语义都是由文字承载的。语义类标签则是纯文字的补充。
为什么要用语义?
很多前端工程师写起代码,通常是div和span走天下。按正确的套路,应该说是不好的,但是在很多情况下,答案肯定是好。
因为在实际业务场景,“软件界面”多于“富文本”,而软件界面里的东西,实际上几乎没有没有语义的。比如购物车中的加入购物车这个按钮,一定要用button吗?
实际是没必要,因为在这个场景里,跟表单里的button,其实已经相差很远了。所以在“软件界面”的场景里,直接使用div和span。
不过,在很多工作场景里,语义类标签也有它们自己无可替代的优点。正确地使用语义标签可以带来很多好处。

语义类标签对开发者更为友好,使用语义类标签增强了可读性,即便是在没有CSS的时候,开发者也能够清晰地看出网页的结构,也更为便于团队的开发和维护。
除了对人类友好之外,语义类标签也十分适宜机器阅读。它的文字表现力丰富,更适合搜索引擎检索(SEO),也可以让搜索引擎爬虫更好地获取到更多有效信息,有效提升网页的搜索量,并且语义类还可以支持读屏软件,根据文章可以自动生成目录等等。

不过,不恰当的使用语义标签,反而会造成负面作用。举个错误的例子:
比如ul无序列表,ol有序列表,但是实际是像这样使用的(来自HTML标准):

I have lived in the following countries:
  Switzerland
  Norway
  United Kingdom
  United States

ul多数出现在行文中间,它的上下文多数在提示:要列举某些项。如果所有并列关系都用ul,会造成大量冗余的标签。
所以,对于语义标签,我的态度是:“用对”比“不用”好,“不用”比“用错”好。当然了,我觉得有理想的前端工程师还是应该去追求“用对”它们。

几种重要的语义化场景:

作为自然语言延伸的语义类标签

作为自然语言和纯文本的补充,用来表达一定的结构或者消除歧义。
ruby:类似于注音或是意思的注释。在HTML5中,就引入了这个表示ruby的标签,它由ruby、rt、rp三个标签来实现。
还有一种情况是,HTML的有些标签实际上就是必要的,甚至必要的程度可以达到:如果没有这个标签,文字会产生歧义的程度。
em:表示重音。在没有上下文的情况下,通过em标签,我们可以消除这样的歧义:

昨天我吃了一个香蕉。
今天我吃了一个<em>苹果</em>。

昨天我吃了两个苹果。
今天我吃了<em>一个</em>苹果。

作为标题摘要的语义类标签

文章的结构。
语义化的HTML能够支持自动生成目录结构,HTML标准中还专门规定了生成目录结构的算法,即使我们并不打算深入实践语义,也应该尽量在大的层面上保证这些元素的语义化使用。
例如:

<h1>HTML语义</h1>
<p>balah balah balah balah</p>
<h2>弱语义</h2>
<p>balah balah</p>
<h2>结构性元素</h2>
<p>balah balah</p>
......

h1-h6是最基本的标题,它们表示了文章中不同层级的标题。有些时候,我们会有副标题,为了避免副标题产生额外的一个层级,我们使用hgroup标签。

// 无hgroup的对比:
//JavaScript对象
//  我们需要模拟类吗?
//  ...
<h1>JavaScript对象</h1>
<h2>我们需要模拟类吗?</h2>
<p>balah balah</p>
// 有hgroup的对比:
// JavaScript对象——我们需要模拟类吗?
// ...
<hgroup>
<h1>JavaScript对象</h1>
<h2>我们需要模拟类吗?</h2>
</hgroup>
<p>balah balah</p>

从HTML 5开始,我们有了section标签,这个标签可不仅仅是一个“有语义的div”,它会改变h1-h6的语义。section的嵌套会使得其中的h1-h6下降一级,因此,在HTML5以后,我们只需要section和h1就足以形成文档的树形结构:

<section>
    <h1>HTML语义</h1>
    <p>balah balah balah balah</p>
    <section>
        <h1>弱语义</h1>
        <p>balah balah</p>
    </section>
    <section>
        <h1>结构性元素</h1>
        <p>balah balah</p>
    </section>
......
</section>
HTML语义
  弱语义
  结构性元素
  ......

作为整体结构的语义类标签

随着越来越多的浏览器推出“阅读模式”,以及各种非浏览器终端的出现,语义化的HTML适合机器阅读的特性越来越重要。
应用了语义化结构的页面,可以明确提示出页面信息的主次关系,它能浏览器很好的支持“阅读视图功能”,还可以让搜索引擎命中率提升。同时对视障用户读屏软件更友好。
正确使用整体结构的语义类标签,可以让页面对机器更友好。比如:

<body>
    <header>
        <nav>
            ......
        </nav>
    </header>
    <aside>
        <nav>
            ......
        </nav>
    </aside>
    <section>......</section>
    <section>......</section>
    <section>......</section>
    <footer>
        <address>......</address>
    </footer>
</body>

还有article,article是一种特别的结构,它表示具有一定独立性质的文章。所以article和body具有相似的结构,同时,一个html页面中,可能有多个article存在。典型的多文章结构:

<body>
    <header>......</header>
    <article>
        <header>......</header>
        <section>......</section>
        <section>......</section>
        <section>......</section>
        <footer>......</footer>
    </article>
    <article>
        ......
    </article>
    <article>
        ......
    </article>
    <footer>
        <address></address>
    </footer>
</body>

header:头部的内容,导航或者是介绍性内容
footer:通常在尾部,包含一些作者信息,相关链接,版权信息
aside:表示跟文章主体不那么相关的部分,它可能包含导航、广告等工具性质的内容。
header和footer一般都是放在article或者body的直接子元素,但标准中并没有明确规定。

如何运用语义类标签来呈现Wiki网页?

通过一篇Wiki的文章用到的语义类标签,进一步理解语义的概念。
https://en.wikipedia.org/wiki/World_Wide_Web
http://static001.geekbang.org/static/time/quote/World_Wide_Web-Wikipedia.html

blockquote, q, cite
blockquote表示段落级引述内容q表述行内的引述内容cite表示引述的作品名
figure, figcaption
figure也是我们的一种标签(用于表示与主文章相关的图像、照片等流内容)。在这里,figcaption表示内容的标题,当然,也可以没有标题。dfndfn标签是用来包裹被定义的名词。
pre, samp, code
pre标签,表示这部分内容是预先排版过的,不需要浏览器进行排版。因为是一段计算机程序的示例输出,所以可以使用samp标签:

<pre><samp>
GET /home.html HTTP/1.1
Host: www.example.org
</samp></pre>

因为同时是代码,我们还需要加上code标签。最后的代码是pre标签包裹了code标签,code标签包裹了HTML代码。

<pre><code>
&lt;html&gt;
  &lt;head&gt;
      &lt;title&gt;Example.org – The World Wide Web&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
      &lt;p&gt;The World Wide Web, abbreviated as WWW and commonly known ...&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>

还有一些其他的标签补充:

此文章为7月Day16学习笔记,内容来源于极客时间《重学前端》,日拱一卒,每天进步一点点💪💪

豪猪
4 声望4 粉丝

undefined