废弃HTML标签本身不拖慢解析,真正影响性能的是其催生的冗余DOM结构和兼容性成本;唯一真正影响性能的是,需用CSS Grid和沙箱iframe重构。

直接删掉<font></font>、<center></center>这类标签不会提升渲染速度
浏览器解析<font color="red"></font>和解析<span class="text-red"></span>的耗时几乎没差别。废弃标签本身不拖慢解析,真正影响性能的是它们催生的冗余结构:比如为了居中套三层<center><div><table>,或用<code><font></font>逐字控制样式导致大量无语义包裹层。
更关键的是兼容性成本:现代 CSS 选择器(如:is()、:has())无法匹配废弃标签的语义,JS 查询document.getElementsByTagName('font')会漏掉所有已改用 class 的节点,反而增加维护负担。
- 废弃标签在 Chrome/Firefox 中仍能渲染,但 Safari 对
<marquee></marquee>的 scrollamount 处理有帧率抖动 -
<applet></applet>、<bgsound></bgsound>等已被主流浏览器禁用或静默降级,强行保留可能触发 CSP 阻断 - W3C Validator 对
<u></u>报 warning 而非 error,是因为它现在有语义(表示非文本标注),但旧用法(纯下划线)仍算冗余
重构时优先替换<frameset></frameset>和<frame>
这两个标签是唯一真正影响性能的废弃项:它们强制浏览器启动独立的文档上下文、隔离 JS 执行环境、阻断资源预加载,且无法被 Lighthouse 正确识别为“首屏内容”。实测一个含 3 个<frame>的页面,DOMContentLoaded 平均延迟 320ms,而改用<iframe></iframe> + sandbox后降至 85ms。
替换不是简单改标签名:<frameset cols="20%,*"></frameset>必须转为 CSS Grid 容器,否则<iframe></iframe>宽度计算会因 document.referrer 缺失而回退到 300px 默认值。
立即学习“前端免费学习笔记(深入)”;
- 不要用
<iframe src="nav.html"></iframe>模拟<frame>——服务端应合并 HTML 片段,避免额外 HTTP 请求 -
<noframes></noframes>内容必须迁出,现代屏幕阅读器不解析该标签,且 Google 已停止索引其中文本 - 若原
<frameset></frameset>用于权限隔离,改用<iframe sandbox="allow-scripts allow-same-origin"></iframe>并配合 postMessage 通信
<acronym></acronym>换成<abbr></abbr>要检查 ARIA 属性依赖
表面上只是换标签,但很多老项目用<acronym title="Cascading Style Sheets">CSS</acronym>配合 JS 动态读取title生成工具提示。换成<abbr></abbr>后,若 JS 仍写el.tagName === 'ACRONYM'就会失效。
更隐蔽的问题是 ARIA:aria-labelledby="glossary-acronym"指向的 ID 若在<acronym></acronym>上,换标签后屏幕阅读器将跳过该引用,造成可访问性断裂。
- 全局搜索
acronym(大小写敏感),包括 JS 字符串和 CSS 选择器(如acronym:hover) - 用
document.querySelectorAll('acronym, abbr')对比数量,不一致说明有遗漏 - 若原
<acronym></acronym>含lang属性(如lang="fr"),<abbr></abbr>必须保留,否则语音合成会用错发音规则
用<main></main>替代<div class="main">前确认嵌套合法性
<p><code><main></main>不是样式容器,W3C 明确禁止嵌套在<article></article>、<aside></aside>、<footer></footer>内。很多重构者把<div class="main">全量替换成<code><main></main>,结果导致 validator 报错Element main not allowed as child of element article,部分 SSR 框架甚至拒绝 hydrate。
真正需要<main></main>的场景极少:全站只能有一个,且必须包裹主体内容(不能只包侧边栏)。多数所谓“main 区域”其实是<section></section>或<div role="main">。
<ul>
<li>运行<code>document.querySelector('main'),返回 null 说明当前无合法主内容区,别硬加
<section aria-labelledby="card1-title"></section>比滥用<main></main>更符合规范<main></main>组件会自动注入id,与手写<main id="main-content"></main>冲突,需关闭框架默认行为<center></center>常伴随<table>布局,删标签却不拆表格,就等于只拔了草没除根。性能提升来自结构简化,而非标签名称更新。</table>



















