前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库vertical-align line-height 基线对齐
CSS盒模型与排版

图片放进 div 里,底下为什么总多出几像素空白?

img 默认是行内元素,vertical-align 默认值是 baseline,图片底边对齐的是文字基线,不是行的底部。基线下面还要给 g、y 这类字母的下伸部分留空间,这段空间就是多出来的空白。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#盒模型与排版
先看核心答案读代码示例
理解线索

行内对齐的三个参照物

  1. 基线小写字母 x 底部那条线,g、y 的尾巴会伸到它下面
  2. 行盒一行里所有行内盒子撑起的高度,由 line-height 和对齐方式共同决定
  3. vertical-align决定行内元素在行盒里上下放在哪,默认是 baseline

容器里就算一个字都没有,每行也有一个看不见的「支柱」,带着父元素的字体和 line-height。空白就是这个支柱的基线下方部分。

核心回答

先记住这个答案

img 是行内替换元素,它参与文字排版,和文字排在同一行里。vertical-align 的默认值是 baseline,所以图片的底边对齐的是文字基线。基线下面还要给 g、j、y 这类字母的下伸部分留空间,即使容器里一个字都没有,这段空间也在,于是图片底下就多出了几像素空白。把图片改成 display: block,或者把 vertical-align 改成 middle、top、bottom,空白就没了。

  • 行内图片底边默认坐在文字基线上
  • 基线下方留给字母下伸部分,所以有空白
  • line-height 越大,行盒越高,空白可能越明显
  • 可改块级元素或调整垂直对齐

先看现象:一张图片和一个边框

给容器加个边框,里面只放一张图片,底部会露出一条缝。

只有一张图的容器HTML
<style>
  .box { border: 1px solid red; font-size: 16px; line-height: 1.5; }
  .box img { width: 100px; height: 100px; }
</style>

<div class="box">
  <!-- 红框高度不是 100px,而是 100px 再多几像素 -->
  <img src="avatar.png" alt="" />
</div>

多出来的高度和字体、font-size、line-height 都有关,所以不同页面上缝的宽度不一样,常见是三四像素到七八像素。把 .box 的 font-size 调大,缝会跟着变宽,这说明空白来自文字排版,和图片本身无关。

基线、行盒和支柱

行内元素排版时,每一行会生成一个行盒,里面的文字、图片、inline-block 都按 vertical-align 摆放。默认的 baseline 就是让大家的基线对齐:文字的基线是字母 x 的底部,图片没有文字,它的基线就是自己的下边缘。

那容器里没有文字,基线从哪来?规范规定,每个行盒开头都有一个看不见、零宽度的「支柱」,它带着父元素的字体和 line-height。可以把它想成一个隐形的字母,它的基线决定了图片放在哪,它基线以下的部分,也就是下伸空间加上 line-height 分到下方的半行距,就成了图片下面的空白。

line-height 怎么影响这条缝
line-height 比字体本身高时,多出来的部分会平分到文字上下,叫半行距。line-height 越大,支柱基线以下占的高度越多,缝越宽。所以同一张图,在 line-height: 1 和 line-height: 2 的容器里空白不一样大。给父元素设 line-height: 0 能消掉空白,原理就是把支柱压扁了,不过这会影响容器里其他文字,一般不推荐。

几种修法怎么选

最常用的是给图片加 display: block。图片变成块级元素,不再参与行内排版,也就没有基线和支柱的问题。适合图片独占一行的场景,比如 Banner、商品主图。

如果图片要和文字排在同一行,比如头像旁边跟着用户名,就不能改成块,这时改 vertical-align。middle 会把图片的中点对齐到父元素基线往上半个 x 高度的位置,看起来和文字居中;top、bottom 分别对齐行盒的顶部和底部,都能消掉底部空白。

font-size: 0 也能让支柱消失,但容器里的文字要重新设字号,属于绕路的写法,只在 inline-block 横排的老布局里偶尔用到。

回答前,多想一步

容易答错的地方

以为空白是 margin 或 padding
在开发者工具里看图片的盒模型,margin 和 padding 都是 0。空白属于父元素的行盒,不属于图片,所以在图片上怎么调边距都没用。
以为 vertical-align 能让块里的内容垂直居中
vertical-align 只对行内元素和表格单元格生效,而且调的是元素在行盒里的位置,不是在父容器里的位置。想让一个块在容器里上下居中,要用 Flex、Grid 或定位。
以为 vertical-align: middle 是精确居中
middle 对齐的是基线往上半个 x 高度,不是行盒的正中间。字体不同,x 高度不同,图片和文字看起来可能差一两像素。要严格居中,还是用 Flex 的 align-items: center。
试着用自己的话回答

面试官还会怎么问?

inline-block 元素底部为什么也会不对齐?

inline-block 的基线是它最后一行文字的基线。里面有文字的和没文字的两个 inline-block 排在一起,基线位置不同,就会一高一低。给它们统一加 vertical-align: top 就能对齐。

表格单元格里的 vertical-align 有什么不同?

在 td 上,vertical-align 控制的是单元格内容在单元格里的上下位置,top、middle、bottom 就是字面意思的靠上、居中、靠底,和行内元素的规则不是一套。

用 Flex 排图片和文字,还会有这条缝吗?

不会。Flex 容器的子元素会变成 Flex 项目,不再是行内元素,行盒和支柱都不存在了,对齐改由 align-items 控制。这也是很多人觉得「用了 Flex 空白就没了」的原因。

从一道题,走向一组知识

把知识连起来

盒模型与排版

上下两个 div 各设 20px 外边距,为什么间距只有 20px?

图片下的空白常被误当成外边距,两者成因完全不同,一个是行内对齐,一个是块之间的外边距合并。

盒模型与排版

display: none 和 visibility: hidden 都能隐藏元素,区别到底在哪?

把 img 改成 display: block 会让它退出行内格式化,可以顺着看 display 的取值怎么影响布局。

参考资料

  • vertical-align - MDN
  • line-height - MDN

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 先看现象:一张图片和一个边框
  3. 基线、行盒和支柱
  4. 几种修法怎么选
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑