html5中必须不写/且不能有结束标签的标签共14个:area、base、br、col、embed、hr、img、input、link、meta、param、source、track、wbr;它们是void elements,语法上禁止闭合,写成自闭合或带结束标签均违反规范。

哪些标签必须不写 / 且不能有结束标签
HTML5 明确规定了 14 个 void elements(空元素),它们语法上禁止写 / 或结束标签,写了就是违反规范。浏览器虽会容错,但工具链可能出问题。
-
<img>、<input>、<meta>、<link>、<br>、<hr>、<source></source>、<track></track>、<wbr></wbr>、<col>、<area>、<base>、<embed></embed>、<param> - 这些标签写成
<img src="a.jpg">是唯一推荐写法;<img src="a.jpg">虽被容忍,但属于 XHTML 遗留风格,在现代 HTML5 中无必要 - 写成
<img src="a.jpg">是非法的:浏览器忽略,后续内容可能被误包进<img>节点内(DOM 结构错乱)
<textarea></textarea> 和 <select></select> 为什么不能自闭合
它们不是 void elements,而是 normal elements,依赖开始与结束标签之间的文本或子节点工作。看似“空”,实则内容即语义。
-
<textarea>默认值</textarea>的 DOM.value初始为"默认值";写成<textarea></textarea>后,.value永远是空字符串,placeholder也不生效 -
<select><option value="a">A</option></select>才能渲染选项;<select></select>会让所有<option></option>被丢弃或解析失败 - 同理,
<script></script>和<style></style>若写成自闭合形式,内部代码完全不执行或不生效
模板引擎和构建工具里 / 容易踩的坑
浏览器宽容,但工具链未必。很多错误不是运行时可见,而是构建时报错、属性截断、或生成 HTML 错位。
- 旧版 Django 模板或 Jinja2 的 strict mode 会把
type="text"/>解析成type属性值为"text/",导致表单控件失效 - eslint-plugin-html、html-validate 等 linter 在 XML 模式下会报
<img>为警告或错误 - Vue 单文件组件(SFC)在某些版本中对
/>解析不稳定,尤其混用内联 SVG 时,<input>可能被误判为 XML 元素而破坏上下文 - VS Code Emmet 默认展开
img为<img src="" alt="">—— 这是正确行为;若插件输出<img src="" alt="">,建议关掉或调整配置
<div>、<code><p></p> 这类标签省略闭合会怎样
它们必须显式闭合。省略不是“少打几个字符”的事,而是直接改写 DOM 结构,JS 和 CSS 都会连锁失效。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
-
<p>第一段</p> <p>第二段</p>被浏览器自动补成<p>第一段</p> <p>第二段</p>,但 JS 查document.querySelector('p').children会返回空 NodeList -
<div class="container"> <div class="card">内容</div>(漏掉 <code>










