div是块级元素(display:block),强制换行、可设宽高;span是行内元素(display:inline),不换行、宽高无效,仅适合文本局部样式。
别用 div 包文字,也别用 span 做布局容器——这是最常踩的语义和渲染双坑。
div 会强制换行而 span 不会根本原因是浏览器默认的 display 值不同:div 是 display: block,span 是 display: inline。块级元素天然独占一行、可设宽高、垂直方向外边距生效;行内元素则“贴着走”,宽度由内容撑开,margin-top/bottom 和 height 默认不产生布局效果。
常见错误现象:
span 设置 width: 200px 却没反应 → 必须先加 display: inline-block 或 block
span 之间加了 margin-bottom: 20px,但垂直间距没变 → 行内元素的上下外边距被忽略div 塞进 p 标签里导致 HTML 验证失败 → p 只允许内联子元素,div 是块级,违反嵌套规则div 和 span 的合法嵌套关系HTML 规范对嵌套有硬性限制,不是“能显示就行”。
立即学习“前端免费学习笔记(深入)”;
div 可以包含:任意块级元素(如 h1、p、div)、任意内联元素(如 span、a、strong)span 只能包含:文本、其他内联元素(a、em、img 等),不能直接放 div、p、h2 这类块级标签span 变成 display: block,它在 DOM 结构上仍是内联语义,不影响 HTML 合法性校验div 或 span
现代 HTML5 提供了明确语义的标签,优先级永远高于通用容器。
header,不是 <div class="header">
nav,而不是 <div class="nav">
article 或 main,而非 <div id="content">
time 标签包裹,比 <span class="date"> 更利于 SEO 和屏幕阅读器div(布局分组)或 span(文本局部标记)div 和 span 在 Flex/Grid 布局中的实际影响它们本身不决定布局能力,但作为父容器时,行为差异会暴露得更明显。
div 设为 display: flex → 子元素按 Flex 规则排列,完全可控span 设为 display: flex → 虽然技术上可行,但它仍是行内级盒子,若没设 width 或父容器约束,容易撑破行流或引发意外换行span 做 Grid 容器极少见,因为 grid-template-columns 等属性在行内盒上表现不稳定,且可访问性差display 值,不是标签名;但用错标签会增加样式调试成本和语义损耗最容易被忽略的是嵌套合法性与 display 变更的边界——改了样式不等于改了语义,DOM 结构和 HTML 标准仍按原始标签类型校验。比如把 span 变成 block 后塞进 p,页面看着正常,但 W3C 验证器依然报错。