是html文档唯一且必需的主体容器,所有用户可见内容必须严格置于其内,仅能作为的直接子元素出现,不可嵌套,不预设布局或样式。

标签本身不“构造”内容,它只是容器——所有可见内容必须放在这里,但它的内部结构完全由你放进去的元素决定。没有预设布局、没有默认样式、也没有隐含嵌套规则。
为什么 里直接写文字会“乱成一团”?
浏览器对 的默认行为是:把连续空白符(空格、换行、制表符)压缩成单个空格,且忽略换行;所有纯文本默认以 <p></p> 的方式流式排版,但不自动分段。
- 错误写法:
第一行<br>第二行——<br>是内联换行,不是语义化分段 - 推荐写法:
<p>第一行</p> <p>第二行</p>—— 用<p></p>表达段落语义,CSS 更易接管 - 注意:
不允许直接子元素为<div> + 文本混合(如 <code><div>hello</div>world),会导致解析歧义,应包裹在块级容器中能不能嵌套另一个?不能。HTML 规范明确要求文档中只能有一个
,且必须是的直接子元素。嵌套会导致:- 浏览器静默忽略内层
,将其子内容提升到外层中 - DOM 树结构异常,
document.body始终指向第一个 - JavaScript 操作如
document.querySelector('body')只返回一个节点,无法区分“嵌套体”
哪些元素能直接放在
里?HTML5 允许绝大多数“flow content”元素作为
的直接子元素,但有关键限制:- ✅ 允许:
<header></header>、<main></main>、<section></section>、<article></article>、<aside></aside>、<footer></footer>、<nav></nav>、<p></p>、<div>、<code><script></script>(位置影响执行时机) - ❌ 禁止:
、<title></title>、<meta>、<style></style>(这些必须在内) - ⚠️ 特殊:
<noscript></noscript>可以,但仅当 JS 被禁用时才渲染;<template></template>可以,但内容不会被解析或渲染 - 现代替代方案:
DOMContentLoaded事件更早、更可靠 —— 在 DOM 构建完成即触发,无需等资源加载 - 写法示例:
<script>document.addEventListener('DOMContentLoaded', init);</script> - 注意:
的onload会被window.onload覆盖,多个onload属性只会执行最后一个
上加onload还靠谱吗?不推荐。虽然
仍能运行,但它依赖于整个页面(包括图片、iframe)加载完毕才触发,延迟高、不可控。真正容易被忽略的是:哪怕你只写了一个
<h1>Hi</h1>,浏览器也会自动补全缺失的和,但补全逻辑因引擎而异——别依赖这种修复,骨架必须手写完整。 - 浏览器静默忽略内层











