DOM树深度超6层或节点总数超2000即卡顿;空壳div(无class/id/data-*、无样式绑定、无事件监听)应优先删除,因其徒增解析负担与重排代价。

直接看 DOM 树深度和节点总数,别靠肉眼数嵌套——document.querySelectorAll('*').length 超过 2000 或任意节点 node.depth > 6,就是卡顿的明确信号。
怎么一眼揪出“纯摆设”div
这类 DOM 节点每增 100 个,解析耗时平均增加 20–40ms;5 层以上嵌套在低端安卓机上会让 FCP 延迟 20–50ms。这不是“看着臃肿”,而是浏览器真正在单线程里多干了活。 盲目替换语义标签或删除包裹层,可能引发样式断裂、JS 报错或可访问性警告。操作前先确认: 最易被忽略的是:DOM 结构优化不是“删得越多越好”,而是“删掉浏览器不得不多做的那部分”。一个错位的 node.depth:超过 6 就该动手删
document.querySelectorAll('div:not([class]):not([id]):not([data-*])').length,结果大于 0 就说明存在空壳 div[class],逐个点开规则,没对应样式、也没 JS 用 querySelector 或 getElementById 访问的,整行 HTML 删掉addEventListener 绑定,一律清
为什么删 div 比加优化更有效
div div div .btn 这类选择器匹配成本非线性增长,浏览器要逐层向上找父节点,而实际只需 —— 多出来的 4 层全是解析负担 替 div[role="banner"] 少一次 ARIA 推导
删之前必须验证的三件事
document.querySelector('.main-header') 显式访问?如果是,保留 class,只改标签: 内是否直接子级含 ?如果不是(比如中间隔了个 上来,否则大纲算法失效,屏幕阅读器会跳序
display: none 的 insertAdjacentHTML 按需插入
比十个冗余
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











