HTML文档结构直接影响DOM构建速度与首屏渲染,嵌套超6层会致低端安卓机FCP延迟20–50ms;应通过DevTools查node.depth值,用语义标签和Flex/Grid压平结构、控节点数≤800。
HTML文档结构不是“写完就扔”的草稿,它直接决定浏览器构建DOM树的速度、重排频率和首屏渲染起点——多数布局卡顿,根源不在CSS动画或JS逻辑,而在你写的第4个 <div> 里。
浏览器解析的是最终输出的HTML,不是你写的JSX或Vue模板。SSR/SSG生成的HTML可能悄悄加了多层包裹,比如 data-reactroot 或 _next 容器。
depth 值;超过6层就要警惕header__inner__wrapper)背后就是三层 <div>
<header>、<main>、<section> 本身不加快解析,但它们天然减少冗余容器,压低DOM节点总数(移动端稳定底线是800以内),同时让CSS选择器更精准。
<main><section><article> 替代 <div class="wrapper"><div class="content"><div class="post">,DOM节点数常能降30%+<main> 必须全局唯一,嵌套在 <section> 内会失效,导致语义丢失和可访问性问题<table><tr><td><div> 这类组合:表格单元格内样式计算本就重,再套div极易触发同步Layout用现代布局替代浮动/inline-block确实能扁平化结构,但混用反而放大性能代价——比如在flex容器里再套grid微调,通常说明模块切分出了问题。
立即学习“前端免费学习笔记(深入)”;
<nav>、表单控件组、按钮工具栏<main> 整体网格、仪表盘卡片流;必须显式声明 grid-template-rows,否则隐式auto轨道可能触发多次重排<main style="display: grid; grid-template-columns: 1fr 1fr 1fr;"><section>A</section><section>B</section><section>C</section></main>
loading="lazy" 是浏览器对非首屏资源的加载策略,加在首屏图片上等于主动降级其优先级,直接拖垮LCP。
<img> 必须去掉 loading 属性,或显式设为 loading="eager"
loading="lazy" 的图片,必须同时声明 width 和 height,否则会引发CLS(累积布局偏移)<iframe> 也支持 loading="lazy",但仅当其内容不在首屏关键路径时才启用真正难处理的不是“怎么写”,而是“怎么验证”——每次改完结构,得进DevTools看真实DOM depth、节点数、Layout触发次数,而不是只盯着源码缩进是否美观。