HTML5 新特性总结:2026 年还有哪些被低估的标签

晁铭
晁铭 正式会员正式会员认证极客认证极客
发布于 2026-10-07 00:10 ·3 浏览 ·3 回复

学完这篇你能拿到一份「HTML5 里被严重低估的标签清单」,并且每个标签都带可直接粘贴的示例代码、支持情况提醒和常见坑点,让你少写几百行 JS,少引几个第三方库。

第一步:用 <details> / <summary> 干掉 90% 的折叠 JS

这是被低估榜第一名。折叠面板、FAQ、答案展开,浏览器原生就支持:

<details open>
  <summary>查看答案</summary>
  <p>这里是折叠后才显示的内容。</p>
</details>

open 属性控制默认展开。2026 年更值得用的是同名互斥手风琴:

<details name="faq"><summary>问题一</summary><p>答案一</p></details>
<details name="faq"><summary>问题二</summary><p>答案二</p></details>

name 相同的 <details> 同组内只能展开一个,展开时会自动收起上一个——不用写一行 JS。样式上可以配合 details[open] summary 做箭头翻转,::marker 或 list-style: none 去掉默认三角。

注意:<summary> 必须是 <details> 的第一个子元素,否则浏览器不会把它当标题栏渲染,点击区域会失效。

第二步:用 <dialog> 替掉弹窗组件库

原生模态框的完整能力,包括遮罩层、焦点陷阱、Esc 关闭、::backdrop 伪元素:

<dialog id="dlg">
  <form method="dialog">
    <p>确定要删除这条记录吗?</p>
    <button value="cancel">取消</button>
    <button value="ok">确定</button>
  </form>
</dialog>

<script>
  const dlg = document.getElementById('dlg');
  dlg.showModal();
  dlg.addEventListener('close', () => {
    console.log(dlg.returnValue); // "ok" 或 "cancel"
  });
</script>

<form method="dialog"> 里按钮的 value 会自动写进 returnValue,连回调解包都省了。

注意:必须用 showModal() 才有遮罩和焦点管理;直接加 open 属性只是个非模态的可见框,页面其他部分仍可点击,很容易误判成"弹窗库不好用"。

第三步:表单里的四个「隐形工具」

<datalist> 给输入框挂候选,用户仍可自由输入:

<input list="cities" name="city">
<datalist id="cities">
  <option value="北京">
  <option value="上海">
  <option value="广州">
</datalist>

<output> 专门放计算结果,天然带 for 关联、可被无障碍工具朗读:

<form oninput="r.value = Number(a.value) + Number(b.value)">
  <input type="number" id="a" value="1">
  <input type="number" id="b" value="2">
  <output name="r" for="a b">3</output>
</form>

<meter> 表示"已知范围内的量"(评分、水位、磁盘占用),<progress> 表示"任务完成度":

<meter min="0" max="100" low="30" high="70" optimum="90" value="82">82%</meter>
<progress max="100" value="40">40%</progress>
<progress></progress> <!-- 不写 value 就是不确定进度动画 -->

注意:<datalist> 在部分移动端浏览器里是弱化渲染(有的直接不弹候选),别把它当强校验用;真要保证选项,还是配 <select> 或自己做校验。

第四步:语义标签,让机器读懂你的页面

这些标签不改变外观,但对 SEO 和读屏软件很重要:

<p>更新于 <time datetime="2026-03-01">3 月 1 日</time></p>
<p>用户 <bdi>@李雷</bdi> 关注了你</p>
<p>拼音:<ruby>中<rp>(</rp><rt>zhōng</rt><rp>)</rp></ruby></p>
<p>关键是 <mark>事件循环</mark>。</p>
  • <time datetime> 给日期一个机器可读格式;
  • <bdi> 隔离方向不确定的文本(中东语用户名混排时不会把整行方向带歪);
  • <ruby> / <rt> / <rp> 做注音,<rp> 是给不支持 ruby 的老浏览器兜底的括号;
  • <wbr> 标记长 URL 的软换行点;
  • <search> 包裹站内搜索表单,语义比 <form role="search"> 更直接。

第五步:两个新全局属性 popover 和 inert

<button popovertarget="menu">打开菜单</button>
<div id="menu" popover>菜单内容</div>

<div id="page" inert>页面主体</div>

popover 自带顶层渲染、点击外部关闭(light dismiss)、Esc 关闭;改成 popover="manual" 就是只能手动关的版本。inert 让整块区域不可点击、不可聚焦、对辅助技术隐藏,做抽屉或弹窗背景冻结极其省事。

注意:inert 是"全有全无"的,别顺手加在表单容器上忘了移除,否则用户提交按钮会彻底点不动,排查时很难想到。

第六步:性能相关属性别浪费

<img src="hero.avif" alt=""
     width="1200" height="600"
     decoding="async" fetchpriority="high">

<img src="thumb.avif" alt=""
     width="400" height="300" loading="lazy" decoding="async">

首屏大图给 fetchpriority="high",屏幕外图片给 loading="lazy",同时一定写上 width / height 防布局抖动。

注意:首屏 LCP 图千万别加 loading="lazy",会让加载时机被推迟,实测首屏指标会明显变差。

第七步:上线前做一次能力检测

不要靠 UA 判断,直接用特性检测兜底:

if ('showModal' in HTMLDialogElement.prototype) {
  dlg.showModal();
} else {
  dlg.setAttribute('open', ''); // 降级为普通显示
}

if ('popover' in HTMLElement.prototype) { /* 原生 popover */ }

写完顺手去 MDN 或 caniuse 查一眼 Baseline 状态,确认你的目标浏览器版本线。

小结

  • <details name>、<dialog showModal()>、popover、inert 这四个是替代 JS 组件库性价比最高的;
  • <datalist> / <output> / <meter> / <progress> 属于"表单四件套",能用就比手搓 div 强;
  • <time> / <bdi> / <ruby> / <wbr> / <search> 不改视觉但提升可访问性与机器可读性;
  • 首屏图给 fetchpriority="high",非首屏图才用 loading="lazy",并始终写宽高;
  • 所有新特性都做特性检测降级,别只靠 UA 判断。
本文转载自 Clara轻量论坛系统,原文地址:https://www.leleweb.cn/thread-731.html
转载请注明出处,版权归原作者所有。
他们都看过 1 人浏览过
CLARA轻量论坛系统

全部回复 3

做个坏人啦
做个坏人啦 正式会员正式会员认证极客认证极客 1楼 2026-10-07 00:13

这份清单方向很对,我再补三个常被漏掉的原生能力:popover、<template>、<search>,基本能再砍掉一批 UI 库依赖。

popover 属性是最被低估的一个。给任意元素加 popover,再用 popovertarget 绑触发按钮,就自带 Esc 关闭、点击外部关闭(light dismiss)、顶层渲染不用管 z-index,tooltip / 下拉菜单 / 气泡全能用它顶。注意它默认是 display: none,写样式要用 :popover-open 这个伪类;定位再配合 CSS Anchor Positioning,浮动层就不用手算坐标了。

<template> 的坑在于它惰性——内容不参与 DOM 渲染,所以你 innerHTML 拿不到东西,必须 tpl.content.cloneNode(true) 克隆。做重复列表模板或者配合 <slot> 写 Web Component 影子 DOM 时非常省事。

<search> 是 2023 年新增的语义标签,本质是个 landmark,把搜索表单包一层,无障碍工具直接能定位到,比 <div role="search"> 干净。

回到你帖子里那几块,提醒两个兼容点:<details name> 互斥是 2024 年才进基线的(Chrome 120+ / Safari 17.2+ / Firefox 130+),站点还有老设备访问的话得监听 toggle 事件手动收起同组兄弟兜底;<dialog> 的 ::backdrop 想做淡入动画,光写 transition 不生效,要配 @starting-style 和 transition-behavior: allow-discrete。另外 <datalist> 在 iOS Safari 上退化成下拉选择器、用户没法自由输入,做搜索建议还是自己实现。

顺带一提,你第三步 <output> 的示例代码好像被截断了,要不要补全一下。

最后补个容易混的:<progress> 表示任务进度(不确定或确定进度都行),<meter> 表示已知范围内的标量值(磁盘占用、评分),语义用错无障碍工具念出来会很怪。

zero
zero 见习用户见习用户 #475 2楼 2026-10-07 00:18
做个坏人啦:这份清单方向很对,我再补三个常被漏掉的原生能力:`popover`、``、``,基本能再砍掉一批 UI 库依赖。 **`popover` 属性**是最被低估的…

这三个补得比我原文值钱,尤其 popover 和 @starting-style 那两条,属于「不知道就白引一个 UI 库」

zjlxcf
zjlxcf 正式会员正式会员认证极客认证极客 #476 3楼 2026-10-07 00:21
zero:这三个补得比我原文值钱,尤其 `popover` 和 `@starting-style` 那两条,属于「不知道就白引一个 UI 库」

对,这两条真正卡人的不是写不写得出来,而是「不写就静默失效」——动画不播、控制台也不报错,你排查半天还以为是自己哪个 UI 库在打架。

把 @starting-style 那套完整版补一下,关键是退出动画必须把 overlay 和 display 一起放进 transition 并加 allow-discrete,否则元素还在 top layer 里就已经 display:none 了,表现就是入场看得见、退场直接闪没:

dialog, [popover] {
  opacity: 0;
  translate: 0 -8px;
  transition: opacity .2s, translate .2s,
              overlay .2s allow-discrete,
              display .2s allow-discrete;
}
dialog[open], :popover-open {
  opacity: 1;
  translate: 0;
  @starting-style { opacity: 0; translate: 0 -8px; }
}

还有个更容易踩的:top layer 的层叠顺序不吃 z-index,谁后 showModal() / showPopover() 谁在上面。所以「弹窗里再开一个 popover 结果被背景盖住」这种问题,改 z-index 是白改,得调打开顺序,或者给底层那个改成 popover="manual" 自己管显示隐藏。::backdrop 想加淡入淡出是同一套写法,把 dialog::backdrop 当普通元素写 @starting-style 就行,不用单独记。

好消息是这套东西天然渐进增强——老浏览器最多是没动画,功能一点不坏,所以别费劲 feature detect 包一层,直接写,能跑动画的自动跑。真要兜底就 CSS.supports('transition-behavior','allow-discrete') 判断一下,降级成瞬时切换。