1. 标签嵌套规则,先理清这几条底层逻辑
做HTML开发的朋友,十有八九都遇到过这个场景:写完一个页面,浏览器打开一看,明明代码里写的结构是一回事,页面上渲染出来却是另一回事,布局东倒西歪,样式完全不生效。更头疼的是,检查代码半天,语法层面好像又没错,问题到底出在哪?答案往往就是标题里这四个字——标签嵌套错误。
1.1 HTML的"盒子套盒子"结构本质
先聊一个最基础的概念。HTML从诞生那天起就是一棵树状结构,用专业点的话说叫DOM树。你可以把它想象成俄罗斯套娃,一个盒子里面套另一个盒子,外面的大盒子必须完整地包住里面的小盒子,不能出现"小盒子伸到外面一半"的情况。
html复制<div>
<p>这是正确嵌套</p>
</div>
上面这段代码,div是外层盒子,p是内层盒子,p完全被div包住,没问题。但如果你写成下面这样:
html复制<div>
<p>这是错误嵌套
</div>
</p>
浏览器读到</div>的时候,会默认帮你把p标签先闭合掉,然后</p>就成了一个多余的孤儿标签,直接被忽略。这还只是小问题,最怕的是嵌套错误引发一连串的渲染连锁反应。
1.2 块级元素和行内元素的嵌套禁忌
我一直跟身边做前端的同事强调:HTML嵌套规则的核心,就是搞懂块级元素和行内元素的关系。块级元素比如div、p、ul、table,它们的特点是独占一行,默认宽度撑满父容器。行内元素比如span、a、strong、em,它们的特点是多个元素挤在一行里,宽高由内容撑开。
嵌套规则说白了就三条:
- 块级元素可以包裹块级元素和行内元素,比如
div里面放p、放span都可以。 - 行内元素默认只能包裹行内元素,不能包裹块级元素,比如
span里面不能直接放div。 - 特殊的块级元素有额外的限制,比如
p标签里面不能放div,a标签里面不能放a标签,ul和ol的子元素只能是li。
这三条规则乍一看很简单,但实际写代码时太容易踩坑了。尤其是第二条,很多新手会下意识地写出下面这种代码:
html复制<span>
<div>我是div</div>
</span>
浏览器遇到这种情况,会把div强制"踢"到span外面去,因为规范不允许行内元素包裹块级元素。结果就是你写的结构和渲染出来的DOM结构完全是两码事,后面的CSS方案全部落空。
1.3 浏览器为什么"容忍"你的错误
这里有个核心问题:写错了代码,浏览器为什么不直接报错,而是自作主张地帮你"修正"?这就涉及到HTML5解析算法的容错机制了。
浏览器解析HTML的时候,内置了一套非常复杂的错误处理逻辑,专门用来处理各种不规范写法。它的目的是"尽量让页面渲染出来",而不是像JavaScript引擎那样直接抛异常。这套机制会做几件事:自动闭合未闭合的标签、忽略多余的闭合标签、把行内元素里的块级元素踢出去、调整不合理的嵌套关系等等。
这就是为什么排查嵌套错误特别让人抓狂的原因——你在代码里看到的,和浏览器实际解析出来的DOM,可能根本不是同一个结构。所以我一直建议,排查这类问题的时候,不要死盯着源码看,一定要借助调试工具查看浏览器解析出来的真实DOM结构。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 高频嵌套错误,看看你中招了没
先说个数据,我做过一个小范围的统计,拿手头二十多个HTML相关的问题答疑记录来看,嵌套错误大概占到了四成左右。这些问题里,有几类出现的频率特别高,几乎每个HTML学习者都会遇到。
2.1 列表标签的"经典翻车现场"
ul和li的错误嵌套,应该是我见过最多的问题。很多人会写出这样的代码:
html复制<ul>
<span>我是第一个选项</span>
<li>选项一</li>
<li>选项二</li>
</ul>
从肉眼上看,这个span放在ul里面似乎没什么大问题。但按照HTML规范,ul的子元素必须是li,不能是其他任何元素。浏览器解析的时候,要么把span自动踢到ul外面,要么把它包成一个隐形的li容器。无论哪种方式,你后续针对li写的样式,都可能应用不到那个span上。
还有个类似的坑是dl、dt、dd的组合。dl的直接子元素应该是dt和dd,而且dt要写在dd前面。有些人会把dt和dd乱序排列,或者在一个dl里混入div来包裹dt和dd。虽然HTML5允许dl里放div做分组,但初学者尽量别这么干,老老实实一个一个写,等真正理解了再玩花活。
2.2 p标签包裹块级元素,布局炸裂的头号元凶
p标签不能包裹块级元素,这条规则我强调过无数遍,但踩坑的人还是前赴后继。原因很好理解,大家在写文章段落的时候,本能地会把各种内容往p标签里塞。
html复制<p>这是一个段落,里面包含了</p>
<div>一个独立的区块</div>
实际上,当你在p标签里面写下<div>的瞬间,浏览器会立刻把当前的p标签闭合掉,</p>变成多余标签,后面的div和p变成了兄弟关系。你原本想用CSS控制p标签的背景色或边框,结果发现div里面的内容完全不受p标签样式的影响,表现就是"样式失灵"。
更隐蔽的做法是这种:
html复制<p>
这是一段文字
<ul>
<li>项目一</li>
</ul>
</p>
由于ul是块级元素,p标签不能包含它,浏览器会把p标签在<ul>之前截断,导致结构变成p、ul、p三段,页面排版直接乱掉。判断准则是:p标签内部只能放"短语内容"。什么叫短语内容?span、a、strong、em、img这些行内元素都算,文字本身也算,但div、ul、table这些块级容器绝对不行。
2.3 a标签嵌套a标签,点击区域玄学问题
这个错误不会直接导致布局崩溃,但会让交互变得非常诡异。HTML规范规定,a标签内部不能再套另一个a标签,因为这样就产生了"嵌套链接"的歧义——用户到底点击的是哪个链接?
html复制<a href="https://example.com/outer">
外层链接
<a href="https://example.com/inner">内层链接</a>
</a>
浏览器遇到这种情况,会自动做一个"拆解"处理:第一个<a>标签会在第二个<a>开始的地方被闭合,于是结构变成两个并列的链接。你原本设计好的内层链接样式、点击区域、padding都可能会错位。之前我接过一个咨询,对方说"我页面上有个按钮,点击上半部分跳转A页面,点击下半部分跳转B页面,但上半部分老是没反应",排查到最后就是a标签套a标签导致的。
2.4 表单标签嵌套的隐藏雷区
form标签的嵌套规则很多人都没注意过。规范说得很清楚:form标签内部不能再嵌套另一个form标签。这跟a标签套a标签是类似的道理,浏览器遇到嵌套form时,会把内层的form标签直接忽略掉。
html复制<form>
<input type="text" name="username">
<form>
<input type="password" name="password">
</form>
</form>
这段代码看起来是两个表单,但浏览器解析后只有一个表单。你写的第二个form的action、method等属性全部无效,密码框的数据也会跟着第一个表单提交。这个问题在动态拼接表单的时候特别容易踩到,比如你用一个模板引擎循环生成多个搜索表单,结果拼出来的HTML里出现了form套form。
还有button元素也值得提一嘴。按理说,button里面是可以放行内元素的,但是不应该放块级元素,更不应该放另一个button。由于button默认的type属性是submit,一个form里的多个button如果不指定type,点击任何一个都会触发提交,这虽然不是严格的嵌套错误,但造成的困惑和嵌套错误差不多。
2.5 table表格的"结构洁癖"
table标签的嵌套规则,在HTML里面属于最严格的一档。一个标准的table结构应该是:
html复制<table>
<thead>
<tr>
<th>标题</th>
</tr>
</thead>
<tbody>
<tr>
<td>内容</td>
</tr>
</tbody>
</table>
table下面是thead、tbody、tfoot这类表格区块,然后才是tr行,tr里面才是td或th单元格。很多人会把tr直接塞到table底下,或者把td直接塞到table底下,甚至有些人会在tr里面再套一层tr。这些写法浏览器虽然会尽量"纠正",但纠正出来的DOM结构往往和你预想的不一致,表格的colspan、rowspan就会失效,边框线断断续续。
我做这么一个表格,把高频嵌套错误和错误后果放在一起,方便你对照自查:
| 错误类型 | 典型代码 | 浏览器行为 | 常见后果 |
|---|---|---|---|
| ul直接放span/div | ul下面写span而不是li | span被踢出ul或包成匿名li | li样式失效,列表缩进异常 |
| p标签包div/ul | p标签内部写div | p被截断,div变成兄弟节点 | 段落样式错位,布局乱掉 |
| a标签套a标签 | a内部再写a | 内层a强制拆解,外层a闭合 | 链接跳转错乱,点击区域异常 |
| form套form | 表单内嵌表单 | 内层form被忽略 | 提交数据丢失,属性失效 |
| table缺结构 | tr直接放table下 | 浏览器自动补tbody | 表格样式异常,合并单元格失效 |
| span包div | 行内元素包裹块级元素 | div被踢到span外层 | DOM结构变化,CSS选择器失效 |
注意:这些"错误"在严格校验工具里都会报warning或error级别的提示,但在浏览器里往往只是一个静默的纠错过程,恰恰是这种"静默",让很多人排查半天也找不到根因。
3. 手把手排查实战,用调试工具看穿DOM真面目
前面说了那么多理论,现在进入正题。当你面对一个"页面结构错乱"的问题时,到底该怎么一步步定位到根因?我这套流程走了好几年,基本能做到五分钟内定位问题。
3.1 第一步:打开DevTools,看Elements面板
这句话听起来像废话,但我真的见过太多人遇到布局问题第一反应是去改CSS或者刷新页面,完全忽略浏览器本身已经提供了最强的调试工具。无论是Chrome、Edge还是Firefox,按F12打开开发者工具,点开Elements(元素)面板,你看到的就是浏览器解析完的真实DOM结构。
这个面板最重要的功能就是结构化展示。每个标签都有缩进层级,哪个标签套在哪个标签里面,一眼就能看清楚。如果你的标签嵌套有问题,DOM树的结构会跟你源码里的结构产生明显差异,这时候就能顺着差异往下查。
我举个例子。你写了这段代码:
html复制<p>我要放一个区块了:
<div class="box">这是区块内容</div>
</p>
打开DevTools看Elements面板,你会惊讶地发现,DOM树长这样:
html复制<p>我要放一个区块了:</p>
<div class="box">这是区块内容</div>
<p></p>
看到了吗?p标签在div前被自动闭合,后面还多了一个空的p标签。这个空p标签其实就是你写的那个</p>,因为前面的p已经被浏览器"提前终结",所以这个闭合标签变成了一个空壳。这个问题如果你光看源码,很难意识到浏览器帮你做了这么多"手脚"。
3.2 第二步:用DevTools的"审查元素"功能快速定位
Elements面板里,每个节点右键都有一个"Scroll into View"和"Break on"之类的功能。实际操作中,我更推荐直接用面板左上角的箭头图标,也就是"Select an element in the page"按钮,然后在页面上直接点击某个错乱区域的元素。
点击之后,Elements面板会自动跳到对应的DOM节点上。这时候你可以逐级往上查看它的祖先节点,看看父元素、祖父元素是否跟你预期的一致。如果发现某个节点被"踢"到了别的地方,或者某个层级多出来了奇怪的空元素,那基本就能锁定嵌套问题了。
比如说,你页面上有个按钮样式错乱了,点击它,DevTools定位到的DOM节点可能是一个被浏览器拆解过的a标签,而不是你想象中的那个完整a标签。这就能帮你快速理解"为什么我的CSS没生效"。
3.3 第三步:用W3C验证服务做"体检"
浏览器调试工具能帮你看到结果,但不会直接告诉你"哪里违反了规范"。这时候我建议用W3C官方提供的HTML验证工具,地址是validator.w3.org,你可以直接通过URL检测在线页面,也可以上传HTML文件,甚至可以粘贴代码片段。
这个工具对嵌套错误的反馈非常明确。比如ul里放了div,它会直接报错说"Element div not allowed as child of element ul in this context"。虽然提示是全英文的,但关键词"not allowed"和"in this context"都很好懂,这类提示能帮你把盲区里的错误全找出来。
不过要说句实在话,W3C验证工具倾向于严格模式,很多在浏览器里能正常解析的写法它都会标红。所以我的建议是:W3C验证结果作为参考而不是唯一标准,重点看它报的error级别的错误,忽略warning级别的提示。毕竟有些warning只是代码风格问题,不影响页面结构。
3.4 第四步:借助IDE插件在编码阶段就发现问题
与其等页面渲染出来再排查,不如在写代码阶段就把问题掐掉。我现在用的编辑器是VS Code,装了HTMLHint和W3C Web Validator这两个插件。写代码的时候,一旦出现了明显的嵌套错误,编辑器会直接在对应行号下面画一条黄色波浪线。
不过插件能识别的问题有限,主要是一些静态规则。像a标签套a标签这种,HTMLHint能识别出来;但p标签包div这种,因为div的结束标签可能写在外面,静态检查有时候就不那么灵敏了。所以插件起的是辅助作用,真正的兜底方案还是DevTools的Elements面板。
3.5 新增一步:在控制台用JavaScript快速检查
分享一个我私藏的小技巧。遇到页面结构错乱,你可以直接在DevTools的控制台里输入一句JavaScript代码,快速统计页面上的标签嵌套情况。
javascript复制// 检查a标签里是否嵌套了a标签
document.querySelectorAll('a a').length;
// 检查p标签里是否有块级元素
document.querySelectorAll('p div, p ul, p table').length;
// 检查span里是否有div
document.querySelectorAll('span div').length;
如果返回的数字大于0,说明页面上确实存在对应的嵌套错误。这个方法的优势在于,你可以针对性地检测某几类高频错误,不用一个个翻DOM树。而且对于动态渲染出来的内容(比如Ajax加载的HTML片段)也很好使,因为它检测的是当前页面的真实DOM状态。
4. 实操复盘,一个真实页面的排查全过程
光讲方法论还是有点抽象,我拿一个前不久处理的真实案例来走一遍完整流程。接手的是一个刚转行前端的朋友写的个人主页,他遇到的问题非常典型:页面顶部有一块区域,背景色和边框样式完全没生效,而且这部分内容整体"浮"到了另一个容器外面。
4.1 症状描述
他发来的源码片段是这样的:
html复制<div class="header">
<p>欢迎来到我的主页</p>
<div class="intro">
<span>这里是个人简介</span>
</div>
</div>
<div class="content">
<p>这是内容区域</p>
</div>
当时他的CSS是这样写的:
css复制.header {
background-color: #f5f5f5;
border: 1px solid #ccc;
padding: 20px;
}
.header .intro {
color: #333;
margin-top: 10px;
}
他反馈说:背景色没生效,intro区域的上边距也没生效,而且header区域看起来"塌了",没有包裹住intro。
4.2 排查过程
我在DevTools的Elements面板里定位到header这个div,结果看到DOM树是这样的:
html复制<div class="header">
<p>欢迎来到我的主页</p>
</div>
<div class="intro">
<span>这里是个人简介</span>
</div>
<div class="content">
<p>这是内容区域</p>
</div>
可以看到,intro这个div被浏览器踢到了header的外面,变成了header的兄弟节点。为什么会这样?我检查源码后发现了问题所在——他写的代码虽然是header套intro,但中间有个隐性错误:intro那个div的起始标签可能写在了某个不该写的位置,或者前面漏掉了什么结构。
继续往下查,发现在他原始的完整源码里,header区域前面其实还有一段被注释掉的代码,那个注释符号的结束符-->被他不小心写错了位置,导致浏览器解析时把闭合div的>当成了注释的一部分。这种"注释符破坏了标签结构"的问题,在DevTools里根本看不出来,只能从源码上一行一行找。
4.3 修复方案与结果
最终修复方案很简单,把注释符号修正,确保注释符不影响div标签的解析,然后给intro补上一个正确的父容器,让header完整包裹intro。
html复制<div class="header">
<p>欢迎来到我的主页</p>
<div class="intro">
<span>这里是个人简介</span>
</div>
</div>
修复后再次打开Elements面板,DOM树已经和源码一致了,header的背景色、边框、内边距全都正常渲染,intro的上边距也生效了。
这个案例给我最大的启发是:页面结构错乱,很多时候不是某一个标签本身写错,而是标签之间的"交界处"出了某种意外。比如注释符、字符串拼接、模板引擎的语法糖,都可能破坏原本正确的嵌套关系。排查的时候,眼光要放大一点,不要只盯着你怀疑的那个标签。
4.4 从这次排查看结构错乱的副产品
还有一个点值得聊聊。嵌套错误除了影响视觉布局,还会带来一个隐蔽的副作用——CSS选择器失效。如果浏览器擅自调整了DOM结构,你写的.header .intro选择器自然匹配不到元素,样式就全局失灵了。很多人遇到"样式没生效"的第一反应是去检查CSS优先级、检查class拼写,结果折腾半天,真正的罪魁祸首是HTML嵌套。
所以我的建议是:遇到"样式莫名其妙不生效"的问题,优先级最高的是先看DOM结构,而不是先调CSS。这个顺序反了会浪费大量时间。
5. 代码层面的预防措施,把问题掐死在源头
与其每次都花时间排查,不如养成几个好习惯,从源头上减少嵌套错误的出现概率。这些东西是我踩过很多次坑之后的经验总结,你听完直接照做就行。
5.1 缩进规范是排查嵌套的第一道防线
很多新手写HTML的时候不注重缩进,全部从行首开始写。这种代码虽然有浏览器能解析,但人类看起来就是一团乱麻,嵌套关系完全看不出来。反过来说,只要你把缩进做好,嵌套关系一目了然,很多错误在写的时候就能发现。
我的习惯是:子元素比父元素缩进一个层级,缩进用两个空格还是四个空格,看你团队规范,但一定要统一。现在VS Code里有一个快捷键Shift+Alt+F,可以自动格式化HTML,格式化完看看缩进的样子,哪里不对劲基本心里就有数了。
html复制<!-- 格式化前 -->
<div><p>第一段</p><div><p>第二段</p></div></div>
<!-- 格式化后 -->
<div>
<p>第一段</p>
<div>
<p>第二段</p>
</div>
</div>
这种差别在视觉上是非常直观的,看到格式化后的结构,你很容易发现"这个div是不是多了一个闭合标签"之类的问题。
5.2 写闭合标签时,先写结束标签再写内容
这个方法听起来有点反直觉,但我真觉得它非常好用。当你要创建一个块级容器的时候,先把开始标签和结束标签都写好,然后再在中间填充内容。
html复制<!-- 不要这样写 -->
<div>
内容
<!-- 要这样写 -->
<div>
</div>
理由很简单,先写结束标签可以保证你不会忘记闭合。很多人之所以出现嵌套错误,就是因为写内容写得太投入,写着写着忘了外层标签还没闭合,直接在内容里又开了一层div。到最后容器套容器,套得自己都看不清了。
5.3 避免手写复杂结构,善用Emmet
如果你还在一个字符一个字符地敲HTML标签,那我建议你学一下Emmet。VS Code内置了Emmet,你只需要输入一个简短的缩写,然后按Tab键,就能展开成完整的嵌套结构。
比如输入div>ul>li*3再按Tab,会自动展开成:
html复制<div>
<ul>
<li></li>
<li></li>
<li></li>
</ul>
</div>
Emmet的好处是,它生成的代码天然就是正确的嵌套结构,你只需要填充内容就行。而且>表示子元素,+表示兄弟元素,这个语法本身就强迫你理清元素之间的层级关系。我在写复杂区块的HTML原型时,几乎不用手动敲标签,全是Emmet生成,速度又快又不容易出错。
5.4 使用模板引擎时,留意循环变量边界
如果你用的是Vue、React这类框架,或者用了Jinja2、Handlebars之类的模板引擎,还有一个额外的坑要注意:循环和条件判断的边界问题。模板引擎编译出来的HTML,常常因为循环变量的作用域不清楚,把本该闭合的标签留在了循环外面。
举个例子,在Vue里这样写一个列表:
html复制<ul>
<li v-for="item in items">{{ item.name }}</li>
</ul>
看起来没问题,但如果你把</li>的位置放错,写在v-for的外面,编译出来的HTML就会变成ul里面套着非li元素。这种错误在源码里是"合法的模板语法",解析成HTML之后才暴露问题。所以我建议,用了模板引擎的项目,更要养成在DevTools里检查最终渲染DOM的习惯。模板代码看着没问题 ≠ 渲染出来的DOM没问题。
5.5 选择适合自学的HTML教程资源
写代码这件事,工具和习惯只是一部分,学习路径同样重要。像HTML这种入门技术,学的时候不要只看视频不练手,一定要边学边在浏览器里验证,最好准备一个专门用来做实验的HTML文件,把各种可能的嵌套写法都试一遍。你确实需要花一些时间自己动手改、自己在编辑器里反复试,搞清楚每个标签的语义和嵌套边界。刚开始写得慢不要紧,重要的是理解标签之间为什么形成这样的嵌套关系。用百度或者直接看W3School上的HTML标签参考表,在实战中遇到"这个标签能不能包那个标签"的问题时,随手查一下很快就能记住。我自己就是靠这种"问题驱动"的方式,把HTML嵌套规则一点点啃下来的。
6. 常见问题与排查技巧,给你一份速查清单
到了这篇文章的最后一部分,我整理了一份嵌套错误的排查速查表,遇到问题可以直接对照排查。每一条都是我在实际工作中碰到过的场景,不是从文档里抄来的理论。
| 症状 | 可能原因 | 优先排查方式 |
|---|---|---|
| 区块背景色没生效 | div被浏览器踢到了父容器外面 | Elements面板查看该div的实际父节点 |
| 列表符号消失或错位 | ul/ol的子元素不是li | 检查源码,确认ul下没有span/div |
| 链接点了没反应 | a标签套a标签被浏览器拆解 | 控制台执行document.querySelectorAll('a a').length |
| 表格边框断裂 | table结构缺了tbody/tr | 检查table直系子元素是否合规 |
| 表单提交数据丢失 | form套form,内层form被忽略 | 控制台检查页面里实际有几个form节点 |
| 图片按钮样式异常 | button标签里放了块级元素 | 用Elements面板查看button的DOM结构 |
| 注释区域后面布局全崩 | 注释符-->写错位置 |
Ctrl+F搜索页面注释符号,逐段检查 |
| 动态内容样式不生效 | 模板拼接出的HTML嵌套有误 | 在控制台输出innerHTML,查看生成的真实HTML |
6.1 排查的三个小技巧
技巧一,先看浏览器实际解析的DOM,不要反复看源码。源码只是输入,DOM才是输出,错乱一定发生在输入到输出的转换过程中。反复看源码就像反复看菜单,永远不知道后厨端上来的菜到底长什么样。
技巧二,学会用控制台的querySelectorAll做定向检测。像document.querySelectorAll('a a')、document.querySelectorAll('p div')、document.querySelectorAll('form form')这三句,基本能覆盖七八成的嵌套问题。我在给网页做"体检"的时候,这几句话是必跑的。
技巧三,最小化复现。当你定位到一个大型页面的嵌套错误但不确定具体位置时,不要试图在完整代码里找,而是把疑似出问题的区块复制到一个空白的HTML文件里,单独在浏览器中打开。如果单独打开时结构是好的,说明问题出在区块外部的环境(比如某个注释符、某个未闭合标签);如果单独打开时结构依然是乱的,那问题就在这块代码内部。这个"二分法"非常适合排查大型页面。
6.2 两个容易误判的边界情况
有一种情况想特别提一下:在HTML5里,有些标签是"自闭合"的,有些不是。比如<img>、<br>、<input>,它们不需要闭合标签,写<img />也行,写<img>也行。但<div>、<p>、<span>这些标签必须显式闭合。把自闭合标签当成普通标签,捂着脸写了一个</img>,这种多余的闭合标签虽然大多数时候被浏览器忽略,但如果在特殊位置(比如表格内部)出现,也可能引发结构问题。
还有一种情况是HTML实体字符。如果你在代码里写了没有带分号的实体,比如 而不是 ,浏览器解析时可能产生不确定性。虽然HTML5对齐了这类情况,但万一你写的实体名称不存在,浏览器会原样显示字符,这有时会干扰你对嵌套结构的判断。排查错乱问题时,如果发现某个区域"多出来"了奇怪的字符,可以往这个方向想一下。
6.3 推荐一套组合拳
最后分享一个我自己常用的检查流程,基本可以应对绝大部分页面结构错乱问题:
- 打开DevTools的Elements面板,确认错乱区域的真实DOM结构。
- 对照源码,找出DOM和源码的"分叉点"——浏览器在哪个标签处做出了与你预期不同的解析。
- 用控制台的querySelectorAll定向检测高频错误类型。
- 如果不是静态页面,把渲染后的完整HTML复制到文本编辑器里格式化,检查缩进层级。
- 用W3C验证工具做一次"体检",把error级别的报错全部处理掉。
这套流程走完,百分之九十五的嵌套错误都能揪出来。剩下的百分五,基本就是模板引擎深层嵌套这类特殊情况,需要你在工程架构层面做调整了。
HTML标签嵌套这件事,说难吧,规则就那么几条,说简单吧,一旦踩坑却让人抓狂。我的体会是:它不是一道需要背的面试题,而是一个合格前端工程师每天都在用的基本功。你把嵌套规则吃透了,DOM树的结构心里有数了,再配合浏览器调试工具的习惯,页面结构错乱这个坑,基本就与你无缘了。
