十年前我刚入行前端的时候,几乎所有布局都是用<div>和<span>堆砌出来的。那时候为了给一个导航栏添加样式,代码可能是这样的:
html复制<div class="nav">
<div class="nav-item">首页</div>
<div class="nav-item">产品</div>
<div class="nav-item">关于我们</div>
</div>
这种写法在今天看来简直是个灾难。HTML5引入的语义化标签不仅让代码更清晰,还带来了诸多实际好处:
重要提示:根据WebAIM的调查,使用语义化标签的网站在可访问性测试中的通过率比传统div布局高出47%
<header>不只是用于页面顶部!任何内容区块的标题部分都可以使用:
html复制<article>
<header>
<h1>文章标题</h1>
<p>发布时间:2023-08-20</p>
</header>
<!-- 文章内容 -->
</article>
<nav>专门用于导航区域,但不必把所有链接都塞进去。经验法则:
<nav><nav><main>每个页面应该有且仅有一个<main>,包含页面的核心内容。常见错误:
html复制<!-- 错误示范 -->
<main>
<header>...</header>
<main>...</main> <!-- 重复了! -->
</main>
<article>独立可分发的内容单元,典型用例:
关键特征:即使脱离上下文,内容仍然完整有意义。
<section>内容主题分组,必须包含标题(h1-h6)。我常用的判断方法:
html复制<section>
<h2>用户评价</h2>
<article>...</article>
<article>...</article>
</section>
<aside>与主要内容间接相关的补充内容,比如:
<time>不只是显示时间!datetime属性才是精髓:
html复制<time datetime="2023-08-20T14:30:00+08:00">今天下午2:30</time>
<figure>与<figcaption>媒体内容+说明文字的黄金组合:
html复制<figure>
<img src="chart.jpg" alt="季度销售趋势">
<figcaption>图1:2023年Q2销售同比增长30%</figcaption>
</figure>
html复制<body>
<header>
<h1>网站标题</h1>
<nav>...</nav>
</header>
<main>
<article>
<header>...</header>
<section>...</section>
<section>...</section>
</article>
<aside>...</aside>
</main>
<footer>...</footer>
</body>
html复制<section class="products">
<h2>热门产品</h2>
<article class="card">
<header>
<h3>产品名称</h3>
</header>
<p>产品描述...</p>
<footer>
<span class="price">¥99</span>
<button>购买</button>
</footer>
</article>
</section>
html复制<section class="comments">
<h2>用户评论</h2>
<article class="comment">
<header>
<h3><span class="username">张三</span> 评论:</h3>
<time datetime="2023-08-19">昨天</time>
</header>
<p>这个产品很好用...</p>
</article>
</section>
错误示范:
html复制<section>
<section>
<section> <!-- 三层嵌套毫无意义 -->
<h2>...</h2>
</section>
</section>
</section>
正确做法:只有当内容确实需要分组时才使用<section>,通常不超过两层嵌套。
<article>和<section>判断标准:
<article><section>虽然语义化标签会自动赋予默认ARIA角色,但某些情况下需要显式声明:
html复制<nav role="navigation"> <!-- 冗余,因为<nav>已有此角色 -->
<div role="navigation"> <!-- 正确,因为div没有默认角色 -->
对于不支持HTML5的IE8等浏览器,只需在<head>中添加:
html复制<!--[if lt IE 9]>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
<![endif]-->
所有HTML5新标签默认都是display: inline,需要重置:
css复制article, aside, footer, header, nav, section {
display: block;
}
结合ARIA属性提升可访问性:
html复制<nav aria-label="主导航">
<ul>
<li><a href="/" aria-current="page">首页</a></li>
</ul>
</nav>
使用HTML5 Outliner检查页面结构是否合理。
<section>和<article>都有标题吗?<main>内容是否唯一且完整?<nav>标记了吗?<time>了吗?<figure>和<figcaption>吗?在实际项目中,我通常会先使用div搭建基本布局,然后再逐步替换为语义化标签。这种方法既能保证开发效率,又能确保最终代码质量。记住:语义化不是一蹴而就的,而是需要不断实践和优化的过程。