青训营前端实践:HTML语义化的案例分析 | 豆包MarsCode AI刷题

113 阅读8分钟

一、HTML语义化与非语义化标签对比

1. HTML语义化的定义

HTML语义化指的是使用具有明确含义的HTML标签来组织和描述页面内容,从而提高页面的可读性、可维护性和搜索引擎优化(SEO)。HTML5通过引入诸如<header><footer><article><section><nav>等标签,赋予页面结构更加明确的含义。

HTML5语义化标签总结:

  • <article>:定义独立的自包含内容(如博客文章、新闻报道等)。
  • <aside>:定义与主要内容相关,但可以独立于主要内容的部分(如侧边栏、广告等)。
  • <footer>:定义文档或节的页脚部分,通常包含版权、联系信息等。
  • <header>:定义文档或节的页头部分,通常包含导航栏、标题等。
  • <nav>:定义页面的导航链接。
  • <section>:定义文档中的一个节,表示内容的某个主题区块。
  • <main>:定义文档的主体内容部分。
  • <figure>:定义独立的内容元素,通常包括图像、视频等。
  • <mark>:标记突出显示的文本。
  • <time>:表示具体的日期或时间。

通过使用这些语义化标签,我们能清晰地表达页面的逻辑结构和内容。接下来我们对比一下传统HTML与语义化HTML标签的结构差异。

2. 传统非语义化标签与语义化标签的对比

非语义化标签示例

如果我们没有使用HTML5的语义化标签,可能会用<div><span>等非语义化标签来组织页面内容。以下是一个常见的非语义化网页结构:

<div class="header">页头</div>
<div class="nav">导航栏</div>
<div class="main">主要内容</div>
<div class="footer">页脚</div>

这种方式虽然可以实现布局,但缺乏明确的语义信息,不容易理解页面结构。而且,机器和搜索引擎在解析时也很难准确识别各个部分的功能。

语义化标签示例

使用HTML5语义化标签,代码将变得更加简洁和具有结构性:

<header>页头</header>
<nav>导航栏</nav>
<main>主要内容</main>
<footer>页脚</footer>

通过这些标签,页面的各个部分变得更加清晰,机器和开发者可以更容易理解网页的结构和功能。

3. 复杂网页结构的语义化与非语义化对比

我们可以进一步对比一个稍微复杂的网页结构。假设这是一个包含多个内容区块的页面,非语义化标签和语义化标签的代码差异如下:

非语义化结构

<body>
  <div class="header">
    <div class="logo">Logo</div>
    <div class="search">搜索框</div>
  </div>
  <div class="nav">
    <div><a href="#">首页</a></div>
    <div><a href="#">发现</a></div>
  </div>
  <div class="main">
    <div class="left-sidebar">左侧边栏</div>
    <div class="content">内容区域</div>
    <div class="right-sidebar">右侧边栏</div>
  </div>
  <div class="footer">
    <p>版权信息</p>
  </div>
</body>

语义化结构

<body>
  <header>
    <div class="logo">Logo</div>
    <div class="search">搜索框</div>
  </header>
  <nav>
    <ul>
      <li><a href="#">首页</a></li>
      <li><a href="#">发现</a></li>
    </ul>
  </nav>
  <main>
    <aside class="left-sidebar">左侧边栏</aside>
    <section class="content">内容区域</section>
    <aside class="right-sidebar">右侧边栏</aside>
  </main>
  <footer>
    <p>版权信息</p>
  </footer>
</body>

在这个例子中,语义化标签让页面结构更清晰,且便于后续维护和SEO优化。<main><header><nav><footer>等标签为不同内容区域赋予了明确的意义,使得搜索引擎能够更好地识别和索引页面内容。

二、 语义化结构案例分析

1. 掘金:juejin.cn/

掘金的代码中已经包含了一些基础的语义化标签,如 <header><nav><footer>,但是更多的部分使用了 <div> 来实现布局。这些标签有助于提升页面的可读性和可访问性,尤其对于屏幕阅读器和搜索引擎来说,能够更好地理解页面的结构。

以下是对代码的部分分析:

<body data-theme="light">
  <div id="__nuxt">
    <div id="__layout">
      <div id="juejin">
        <div class="view-container container index-container">
          <div class="main-header-box">
            <header class="main-header main-header visible">
              <div class="container">
                <a href="/" class="logo">
                  <img src="..." alt="稀土掘金" class="logo-img">
                  <img src="..." alt="稀土掘金" class="mobile">
                </a>
                <nav role="navigation" class="main-nav">
                  <ul class="nav-list">
                    <li class="main-nav-list">
                      <div class="phone-show-menu">
                        <span>首页</span>
                      </div>
                      <ul class="phone-hide">
                        <li class="nav-item link-item active">
                          <a href="/">首页</a>
                        </li>
                        <li class="nav-item link-item bots">
                          <a href="/bots">BOT</a>
                        </li>
                        <li class="nav-item link-item activities">
                          <a href="/pins">沸点</a>
                        </li>
                        <li class="nav-item link-item book">
                          <a href="/course">课程</a>
                        </li>
                        <li class="nav-item link-item">
                          <a href="/live">直播</a>
                        </li>
                        <li class="nav-item link-item">
                          <a href="/events/all">活动</a>
                        </li>
                        <li class="nav-item link-item">
                          <a href="/problemset">AI刷题</a>
                        </li>
                        <li class="nav-item link-item">
                          <a href="https://detail.youzan.com/show/goods/newest?kdt_id=104340304" target="_blank" rel="nofollow noopener noreferrer">商城</a>
                        </li>
                        <li class="nav-item link-item">
                          <a href="/app?utm_source=jj_nav" target="_blank">APP</a>
<!-- 省略部分不必要展示的代码 -->
</body>

语义化结构分析:

  • <header>:定义了页面头部,包含了导航栏和 logo 图片。使用 <header> 标签为页面的顶部区域提供语义化结构。
  • <nav>:用于导航菜单的部分,标识了页面的导航结构。<nav> 标签专门用于包含链接导航部分。
  • <ul><li>:在导航条中使用了无序列表来展示不同的链接,这是一种推荐的做法,能够保持内容结构的清晰。

2. 哔哩哔哩:www.bilibili.com/

在分析了哔哩哔哩网站的HTML结构后,我们可以看到该网站的代码中存在一些非语义化的元素,如<div><span>标签的过度使用,缺少适当的语义标签来增强网页内容的可读性和可访问性。因此,改进哔哩哔哩网站的HTML结构,应用更多的语义化标签,不仅可以提升搜索引擎优化(SEO)效果,还能提高页面的可维护性和用户体验。

原始代码示例

以下是哔哩哔哩网站中部分非语义化的HTML结构:

<div class="header">
    <div class="logo">哔哩哔哩</div>
    <div class="search-bar">
        <input type="text" placeholder="搜索视频">
        <button>搜索</button>
    </div>
    <div class="user-info">
        <span>用户名</span>
        <span>消息</span>
    </div>
</div>

<div class="main-content">
    <div class="video-list">
        <div class="video-item">
            <img src="video-thumbnail.jpg" alt="视频缩略图">
            <div class="video-title">视频标题</div>
        </div>
    </div>
</div>

在这段代码中,<div>标签被广泛使用,用于包装不同的页面区域,尽管这些区域包含的是具体的信息和功能,但没有使用语义化标签来表示它们的功能。例如,<div class="header"><div class="logo"><div class="search-bar"> 都是普通的容器元素,没有提供任何具体的含义。

改进后的代码示例

通过引入适当的语义化标签,能够更清晰地传达每个部分的作用,增加网页内容的语义层次,改进后的代码如下:

<header class="header">
    <div class="logo">
        <a href="/" aria-label="返回首页">哔哩哔哩</a>
    </div>
    <form class="search-bar" action="/search" method="get" role="search">
        <input type="text" name="query" placeholder="搜索视频" aria-label="搜索视频">
        <button type="submit">搜索</button>
    </form>
    <nav class="user-info">
        <ul>
            <li><a href="/user/profile" aria-label="查看用户资料">用户名</a></li>
            <li><a href="/user/messages" aria-label="查看消息">消息</a></li>
        </ul>
    </nav>
</header>

<main class="main-content">
    <section class="video-list" aria-labelledby="video-list-title">
        <h2 id="video-list-title">视频推荐</h2>
        <article class="video-item">
            <figure>
                <img src="video-thumbnail.jpg" alt="视频缩略图">
                <figcaption><a href="/video/12345">视频标题</a></figcaption>
            </figure>
        </article>
    </section>
</main>

语义化改进分析

  1. <header> 标签的使用
    原始代码中的<div class="header">被替换为<header>标签,明确指出这一部分是网页的头部内容。<header>标签本身没有视觉效果,但它帮助搜索引擎和屏幕阅读器理解该部分内容的结构,并提供关于该部分的语义信息。

  2. <a> 标签增强可访问性
    在原始代码中,<div class="logo"><span>标签用于包装文字内容。我们改用了<a>标签,并为链接添加了aria-label属性,增强了链接的可访问性,使得用户可以通过屏幕阅读器更清楚地理解链接的作用(如“返回首页”)。

  3. <form> 标签的使用
    将搜索框包装在一个<form>标签内,并为其指定了role="search",这不仅语义化了搜索功能,还提供了更好的可访问性和SEO支持。同时,表单内的input标签也添加了aria-label属性,以便屏幕阅读器用户理解其功能。

  4. <nav> 标签用于导航区域
    将原本使用<div class="user-info">的导航部分,改为使用<nav>标签。这种做法告诉搜索引擎和用户代理(如屏幕阅读器),这一部分内容是导航链接。并且将每个链接都包装在<ul><li>中,使其符合常规的HTML导航结构。

  5. <main> 标签用于主内容区域
    原始代码的主要内容区域用<div class="main-content">表示,改为使用<main>标签来明确指出这是页面的主要内容部分。<main>标签帮助搜索引擎和用户代理识别页面的核心内容区域,并提升SEO效果。

  6. <section><article> 标签的使用
    对于视频列表区域,原始代码使用了<div class="video-list">,我们改用了<section>标签,并为其添加了aria-labelledby属性,指向一个具有标题的<h2>元素,进一步增强了内容的组织结构。每个视频项则用<article>标签表示,表明每个视频条目是页面的独立内容单元。

  7. <figure><figcaption> 标签
    视频缩略图和标题的部分使用了<figure>标签进行包装,缩略图通过<img>标签显示,标题通过<figcaption>标签描述,进一步增强了页面内容的语义层次,使得图片和文字描述形成语义上的关联。

改进效果

通过引入语义化标签,哔哩哔哩网站的HTML结构不仅更加符合现代网页设计的标准,而且增强了页面的可访问性,使得搜索引擎能够更好地解析和索引网页内容。此外,页面的可维护性也得到了提升,开发者可以更容易理解和修改页面结构。

同时,通过合理使用ARIA(可访问性富互联网应用)属性,如aria-labelrole,进一步提高了屏幕阅读器用户的使用体验,使得视力障碍用户能够更加便捷地访问网页内容。

三、总结与思考

使用HTML5的语义化标签,能够显著提高网页的可读性、可维护性以及SEO表现。通过结构清晰的标签,搜索引擎可以更好地识别页面内容,而开发者也能更轻松地理解和更新页面。对比非语义化标签,语义化标签不仅能让页面逻辑更加明晰,还能增强页面在不同设备和浏览器上的兼容性。