HTML 语义化标签完整指南:这些标签你可能没用过

XiaoC
XiaoC 正式会员正式会员认证极客认证极客
发布于 2026-10-06 17:04 ·3 浏览 ·2 回复

看完这篇,你能把 HTML 里那些"存在感极低但真能用"的语义化标签认全,并且知道在什么场景下把无意义的 <div> 换成它们。下面按使用场景拆成六步,跟着走一遍就够了。

第一步:先把骨架标签摆对

最常用的是这七个:<header>、<nav>、<main>、<article>、<section>、<aside>、<footer>。

判断标准很简单:

  • <main>:每页只能有一个,装正文主体
  • <article>:能独立成篇的内容(一篇帖子、一条评论、一张卡片)
  • <section>:需要分组并且有标题的内容块
  • <aside>:与正文相关但可剥离的补充(侧栏、相关推荐)
  • <nav>:主要导航链接组,不必是整站导航

注意:<section> 不是"高级 div"。里面没有标题就别用,老老实实写 <div> 更准确,语义标签用错比不用更糟。

第二步:文本级语义标签,用得最多也最容易被忽略

<p>截止 <time datetime="2025-06-01T10:00">6月1日</time>,
搜索关键词 <mark>语义化</mark> 命中此段。</p>

<p><abbr title="Cascading Style Sheets">CSS</abbr> 层叠样式表</p>

<p>按 <kbd>Ctrl</kbd> + <kbd>S</kbd> 保存,程序输出 <samp>OK</samp>,
变量名写作 <var>count</var>。</p>

<p>原价 <del>99</del> 元,现价 <ins>59</ins> 元。</p>

<figure>
  <img src="chart.png" alt="季度增长曲线">
  <figcaption>图 1:2025 年各季度增长</figcaption>
</figure>

还有几个偏冷门的:<dfn> 标记术语首次定义,<blockquote cite="URL"> 引文并注明出处,<bdi> 处理阿拉伯语与中文混排的方向隔离,<wbr> 给长 URL 一个断行机会,<small> 表示旁注与版权声明。

注意:<i> 和 <b> 现在不是"斜体""加粗"的意思,而是"不同语气""引起注意"。用图标字体时拿它做容器没问题,但别用 <b> 去顶替标题的粗体。

第三步:表单里的几个"没见过的"

  • <fieldset> + <legend>:把一组相关输入框框起来并给个组名
  • <datalist>:输入框的候选建议,<input list="city"> 关联
  • <meter>:静态刻度(评分、磁盘占用);<progress>:进度条
  • <optgroup>:<select> 里给选项分组
  • <output>:放计算结果
  • <search>:较新的标签,包住站点搜索区

注意:<datalist> 的联动靠 list 属性指向 id,不是 name,写错了没任何提示只是不生效。另外它的下拉样式各浏览器差异很大,别指望完全可控。

第四步:图片与媒体

<picture>
  <source media="(min-width:900px)" srcset="big.avif" type="image/avif">
  <source media="(max-width:899px)" srcset="small.webp" type="image/webp">
  <img src="fallback.jpg" alt="描述文字">
</picture>

<video controls poster="cover.jpg"> 里面可以放多个 <source> 让浏览器挑格式,配 <track kind="captions" src="zh.vtt" srclang="zh"> 加字幕。

注意:<picture> 里最后那个 <img> 必须有,它既是最老浏览器的兜底,也是 alt 和渲染尺寸的来源。省了它整块都不显示。

第五步:两个不用写 JS 就能跑的标签

<details open>
  <summary>点击展开常见问题</summary>
  <p>这里是答案正文。</p>
</details>

<dialog> 配合 showModal() 可以做出带遮罩的原生弹窗,ESC 自动关闭。

注意:<dialog> 直接写 open 属性只是"显示",没有遮罩也没有 ESC 关闭,必须是 JS 调 showModal()。<details> 的默认三角标在 Safari 里要 summary::-webkit-details-marker{display:none} 才能去掉。

第六步:验证有没有用对

改完打开 DevTools 的 Elements 面板看结构树,再跑一次 Lighthouse 的无障碍项;想更严格就用 axe 插件或 W3C Validator。最后把 CSS 全部禁用,如果页面读下来还是一篇条理清楚的文章,说明语义层是合格的。

小结

  • 骨架标签重在"判断标准",<section> 没标题就别用
  • 文本级标签优先记住 <time>、<mark>、<figure>/<figcaption> 这三个,性价比最高
  • 表单里 <fieldset> + <legend> 是无障碍的硬要求,<datalist> 注意是 list→id
  • <picture> 里的 <img> 不能省,<video> 用 <source> 做多格式兜底
  • <details> 和 <dialog> 能省掉一批手写 JS
  • 关掉 CSS 读一遍,是最省事的验收方式
本文转载自 Clara轻量论坛系统,原文地址:https://www.leleweb.cn/thread-726.html
转载请注明出处,版权归原作者所有。

全部回复 2

pantao
pantao 正式会员正式会员认证极客认证极客 1楼 2026-10-06 17:07

写得扎实,补几个同样冷门但真香的:<details>/<summary>、<dialog>、<data>,顺带把 <article> 和 <section> 的边界再抠一下。

  • <details>/<summary>:原生折叠,零 JS。做 FAQ、剧透遮罩、长文摘要都合适,<details open> 还能默认展开,::marker 改箭头。注意 <summary> 必须是第一个子元素,否则不生效。
  • <dialog>:原生模态框,showModal() 自带焦点陷阱和 ESC 关闭,::backdrop 改遮罩层,比手搓 div 遮罩省一半代码。低版本 Safari 兼容性要留意。
  • <data value="9527">管理员</data>:界面显示人话、机器读码值,展示 ID/状态码时比塞 <span> 干净。

关于 <article> vs <section>:判断标准是"能不能单独拿出来发布还成立"。帖子、评论、卡片是 <article>;把一堆卡片包起来的那个容器才是 <section>(通常带个"最新回复"标题)。别把 <section> 当高级 div 用——这点你正文已经点到了,很对。

两个小坑:<abbr title> 只在 hover 显示,手机上等于没有,关键解释还是写正文里;<time> 的 datetime 格式写错浏览器不报错,但机器直接读不到,等于白写。另外你第四步的 <picture> 代码块好像被截断了,<source> 只写了一半,建议补全再发。

陈先生
陈先生 正式会员正式会员认证极客认证极客 #459 2楼 2026-10-06 17:12
pantao:写得扎实,补几个同样冷门但真香的:`/`、``、``,顺带把 `` 和 `` 的边界再抠一下。 - `/`:原生折叠,零 JS。做 FAQ、剧透遮罩、长文摘要…

补得准,<details> 和 <dialog> 确实是这几个里投入产出比最高的,我再叠几条踩过的坑。

<details> 还有个少人用的玩法:同级多个 details 挂相同的 name 属性就是互斥手风琴,无需一行 JS,Safari 17.2+ 起也跟上了。但要注意收起状态下内容不渲染,站内搜索和自建索引容易漏,做 FAQ 时最好保证答案在聚合页也有一份纯文本,别只藏在折叠里。

<dialog> 配 <form method="dialog"> 能提交即关闭并带回返回值,省掉手动 close();showModal() 的焦点陷阱只在 modal 状态下有效,用 open 属性直接展开是不带这层保护的,容易误用。兼容底线是 Safari 15.4,再往下就得老老实实降级。

<time> 那个坑我再钉一下:datetime 只认 YYYY-MM-DD 或带 T 的 ISO 8601,写成「2025年6月1日」浏览器不报错、机器也读不到,等于白写,这个确实值得单独标红。

<article> / <section> 我再给个更快的自检法:把它单独扔进 RSS 或聚合列表,读得通就是 article,读不通只能当 section 或 div。

楼主第四步那个 <picture> 确实截断了,建议补全时把 srcset 的 avif → webp → jpg 兜底顺序和最后的 <img> 兜底一起写完,这块漏了兼容就白搭。