block 包着 inline-block:为什么父级比子级高几像素

Posted by CodingWithAlice on October 1, 2026

block 包着 inline-block:为什么父级比子级高几像素

CSS 行盒 / baseline / strut 笔记。文中 24、26 为约数,不绑具体业务

一、现象

block 里包着一个 height: 24px 的 inline-block:

  • 有时父级高度 ≈ 24(和子级边框盒一致)
  • 有时父级高度 ≈ 26(比子级高约 2px)

DevTools 里点到的是父级变高;子级自己量仍是 24。

Elements 里通常也找不到一个「2px 高的兄弟节点」。


二、核心结论

父级被撑开的高度,跟的是里面的 行盒(line box),不是子元素的 边框盒。

<div class="wrap">           <!-- block -->
  <div class="box">...</div> <!-- inline-block; height: 24px -->
</div>
  • 原因1:不写 vertical-align 时,子级默认 baseline(文字基线) 对齐
  • 原因2:父级行盒由字体排版参与计算(常见:font-size、line-height,以及字体的 ascent / descent)
  • 原因3:父级行内还有一条隐形的 strut(撑杆),不是 DOM 节点,但会占高度

因此:子级 24,父级可以是 26。 多出来的约 2px 在边框盒外面的行盒里。


三、结构示意

父级内容高度 = 行盒高度 ≈ 26

行盒顶 ─────────────────
│ ┌─ .box 边框盒 24px ─┐ │
│ │                     │ │
│ │······文字基线······ │ │
│ └─────────────────────┘ │
│        ░ 约 2px ░       │  ← 行盒比边框盒多出的部分(常见在下方)
行盒底 ─────────────────

直觉:行盒高度 ≈ 基线之上最高点 → 基线之下最低点。
子级的 24px 和 strut 都是内部高度;导致对齐后行盒可以大于 24。

不要用「内部 line-height: 22」去和 24 做加减解释 26。
内部行高只影响基线落在盒子里偏上还是偏下;外面多的是 26 − 24 ≈ 2。

子级内部文字结构一变(换节点、换字族/行高),基线在 24px 盒内的位置可能变,父级就可能从 24 变成 26。肉眼有没有字,不是判据。


四、怎么修

根因:默认 baseline → 行盒 > 边框盒。任选其一,也可叠加。

方法 做法 作用
1 父级 line-height: 0 压扁 strut
2 子级有明确高度,设 vertical-align: top 按顶对齐,不再跟基线钉在一起
3 父级 display: flex 离开「匿名行盒 + baseline」(别再设 align-items: baseline)

不推荐只锁死父级 height: 24px 来掩盖——能消抖,但会限制真正需要更高的内容。

自测:父级偏高时,临时加方法 1 或 2,高度差消失,就是这类问题


五、顺带一句

若更外层还有 display: flex; align-items: center,某一侧因行盒高了约 2px,旁边标题也可能被居中拉下约 2px。看起来像整行在抖,机制仍是 一侧变高 + 垂直居中。