前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 热点
旧版
首页程序员面试题库align-items stretch flex
CSSFlex 布局

align-items 默认值 stretch 在什么条件下才会拉伸子项?

align-items 的默认值是 stretch,它让子项在交叉轴方向拉伸到和 flex line 一样高。但前提是子项自身没有设显式的 height(row 方向)或 width(column 方向),一旦设了,stretch 就不生效,子项保持自身设定的尺寸。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#Flex 布局#Flexbox
先看核心答案读代码示例
理解线索

`stretch` 拉伸的条件

  1. 无显式尺寸子项没设 height(或 column 下没设 width),会被拉伸填满行高
  2. 有显式尺寸子项设了 height: 100px,stretch 被忽略,用设定的值
  3. 行高由谁决定flex line 的高度取决于行内最高的子项或容器的 align-content 分配

align-self: stretch 可以让单个子项恢复拉伸行为,即使容器改成了其他 align-items 值。

核心回答

先记住这个答案

align-items: stretch 是 flex 容器的默认行为,它让子项在交叉轴方向拉伸,填满整条 flex line 的高度。这就是为什么 flex 子项默认都「等高」。但有一个前提:子项自身不能有显式的交叉轴尺寸。在 flex-direction: row 下,只要子项设了 height,stretch 就失效了。

  • stretch 是 align-items 的默认值
  • 子项没有显式交叉轴尺寸才拉伸
  • 设了 height 后 stretch 不再生效
  • 最小或最大高度会限制拉伸

为什么 flex 子项默认会「等高」

写一个 flex 容器,里面放几个内容量不同的子项,你会发现它们全变成一样高了。这不是什么 CSS 魔法,而是 align-items: stretch 在起作用。

每条 flex line 的高度由行内最高的子项决定。stretch 让其余子项拉伸到这个高度,所以看起来所有子项等高。

stretch 和 flex-start 的差异CSS
.container {
  display: flex;
  /* align-items: stretch 是默认值,可以省略 */
}
.item-a { /* 内容高 40px */ }
.item-b { /* 内容高 100px */ }
.item-c { /* 内容高 60px */ }
/* stretch 下:三个子项都变成 100px 高 */

.container-start {
  display: flex;
  align-items: flex-start;
}
/* flex-start 下:各自保持内容高度 40/100/60px */

从 stretch 切换到 flex-start,等高效果就消失了,每个子项回到自己的内容高度。

什么时候 stretch 不生效

stretch 生效的前提是子项在交叉轴方向上没有明确的尺寸。在 row 方向下,只要子项写了 height,stretch 就不拉伸了,子项用自己设的高度。

min-height 和 max-height 也会限制拉伸范围。子项最多拉到 max-height,最少保持 min-height。

另外 align-self 的优先级高于 align-items。如果某个子项设了 align-self: flex-start,即使容器是 stretch,这个子项也不会被拉伸。

回答前,多想一步

容易答错的地方

以为 stretch 会拉伸主轴方向
stretch 只作用在交叉轴上。row 模式下只拉高度,不拉宽度。想让子项在主轴方向填满空间,用 flex-grow: 1。
给子项设了 height: auto 以为能阻止拉伸
height: auto 不算显式高度,stretch 仍然生效。要阻止拉伸,需要设一个具体的值比如 height: 100px,或者用 align-self: flex-start。
试着用自己的话回答

面试官还会怎么问?

align-items: stretch 和 height: 100% 有什么区别?

stretch 是 flex 布局的行为,子项自动拉伸到行高,不需要知道父元素的高度。height: 100% 是百分比计算,如果父元素没有明确高度,百分比可能计算为 auto。在 flex 容器里两者视觉效果类似,但 stretch 更省心。

column 方向下 stretch 拉伸的是什么?

拉伸宽度。因为 column 下交叉轴是水平方向,stretch 让子项宽度填满容器。同样,子项设了 width 就不再拉伸。

怎么让等高卡片里的内容也撑满?

flex 的 stretch 只拉伸子项本身的高度,子项里面的内容不会自动填满。解决办法是让子项也变成 flex 容器(嵌套 flex),然后让内容区域 flex-grow: 1 来撑满剩余空间。

从一道题,走向一组知识

把知识连起来

Flex 布局

align-self 怎么覆盖 align-items 的效果?

某个项目用 align-self 可覆盖整行的 align-items: stretch。

Flex 布局

flex 子项在交叉轴上用 margin auto 会怎样?

交叉轴自动外边距有剩余空间时会吸收余量,影响 stretch 的效果。

参考资料

  • CSS:Flex 布局参考资料

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

本题目录
  1. 先记住这个答案
  2. 为什么 flex 子项默认会「等高」
  3. 什么时候 stretch 不生效
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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