Flexbox 演练场

Flexbox 演练场,是指在线可视化调节 flex 容器与项目属性、实时预览弹性布局并一键复制代码的前端工具。它免费、无需注册,容器侧可调排列方向、主轴与交叉轴对齐、换行与间距,项目侧逐个调 flex-grow、flex-shrink 与 flex-basis,还会按 CSS 规范算出每个项目最终分到多少像素。预览渲染的就是要复制的那段代码,所见即所得,参数在浏览器本地计算,内容不上传。

1
2
3
4

主轴:水平(从)· 交叉轴:垂直(从)。 所以 justify-content 现在管的是左右分布,align-items 管的是上下对齐

容器属性(写在 .flex-container 上)

align-content 现在是灰的:容器没换行就没有「多行之间的分布」可言。把 flex-wrap 改成 wrap 之后它才有效果,当前选的值会原样留着。

主轴尺寸求解表(容器主轴内尺寸 480px)
项目flex base size假设尺寸最终尺寸增减为什么停在这里
项目 180px80px80px0px因子为 0,不参与伸缩
项目 2120px120px120px0px因子为 0,不参与伸缩
项目 360px60px60px0px因子为 0,不参与伸缩
项目 4100px100px100px0px因子为 0,不参与伸缩

这张表只算主轴。交叉轴涉及基线对齐、行高与字体度量,浏览器之外拿不到这些信息,硬算只会给出一个看着精确、 实际是错的数,所以这里如实留白。表里的内容尺寸是你在项目卡片里填的数,换成你的真实内容后数字会变。

项目属性(4 个,上限 12
项目 1(.flex-item-1 · flex: initial · 最终 80px
项目 2(.flex-item-2 · flex: initial · 最终 120px
项目 3(.flex-item-3 · flex: initial · 最终 60px
项目 4(.flex-item-4 · flex: initial · 最终 100px

order 与「上移 / 下移」是两条不同的路径:order 只改视觉顺序,读屏软件与 Tab 焦点仍按 HTML 里的顺序走;上移下移改的是 DOM 顺序,朗读顺序会跟着变。要真正换顺序请用后者。

内容主轴尺寸代表你项目里那段内容的真实宽度(文字、图标或图片撑出来的那个数)。它同时充当 flex base size 与自动最小尺寸的来源,换成你的内容后数字会变。

居中flex 布局最常被搜的两种居中写法
条状布局导航栏与媒体对象
卡片排列等宽一行与换行网格
页面骨架粘底页脚、圣杯三栏与等高卡片

配方库更新于 2026-08,点一下把整套容器与项目属性载入,再继续微调。

生成的 flex 布局代码
.flex-container {
  display: flex;
}

当前容器全是默认值,代码里只有一句 display: flex。改点什么再复制,或者直接点上面的布局配方。

反解析是尽力而为:只认 flex 相关属性,认到的应用、没认到的逐条列出来,解析失败时当前编辑一个字都不会动。 calc() 与 var() 这类函数写法会被跳过并点名原因。

🔒 属性、项目文字与生成的代码全部在你的浏览器本地拼装,内容不上传、不外发。预览区渲染的就是你要复制走的那份声明, 所见即所得。当前 flex-basis 的百分比按预览容器 480px 解析,仅为估算。

如何使用Flexbox 演练场

1

在容器面板改 flex-direction、justify-content、align-items 与 gap 间距,预览、代码区与尺寸表三者实时同步变化。

2

展开项目卡片逐个调 flex-grow、flex-shrink、flex-basis 与 order,看尺寸表里每个项目最终分到多少像素、又被什么卡住了。

3

在底部切换 CSS、HTML、HTML + CSS 完整片段、Tailwind 四种格式并复制代码;也可以粘贴已有代码反解析回面板继续调。

关于Flexbox 演练场的常见问题

Flexbox 演练场会上传数据吗?安全吗?
不会上传。Flexbox 演练场的属性调节、尺寸求解、代码生成与粘贴反解析全部在你的浏览器本地完成,容器属性、项目文字与生成的代码都不会发送到服务器,预览区渲染的就是同一份声明,关闭页面即清除。(站点自身仅有匿名访问量统计,与你调的 flex 布局参数无关。)
手机上能用 Flexbox 演练场吗?
可以,且不用装任何 App 或插件。它是纯网页实现,手机、平板、电脑浏览器打开即用,下拉与滑杆都是原生控件,数值输入框保留了草稿态,逐字符重输不会被吃掉字符。窄屏下属性面板会折成上下堆叠、预览区自己横向滚动,不会把页面撑破。
flex 布局怎么让元素水平垂直居中?
给容器写 display: flex 之后,再补 justify-content: center 与 align-items: center 两句就够了。前者管主轴、后者管交叉轴,横排时正好一个管左右、一个管上下。本页「水平垂直居中」配方点一下就能载入,生成的代码是:.flex-container { display: flex; justify-content: center; align-items: center; } .flex-item-1 { height: 64px; }。注意方向换成 column 之后这两句管的方向会互换。
flex 简写里的 1 和 auto 有什么区别?
差别全在 flex-basis 上:flex: 1 展开是 1 1 0%,起点归零再按因子分,结果是严格等分;flex: auto 展开是 1 1 auto,先按内容打底再分剩余空间。同样两个内容宽 60px 与 300px 的项目放进 480px 容器,前者是 240px 与 240px,后者是 120px 与 360px。这也是最容易被记混的一条。
flex-grow 和 flex-shrink 怎么分空间?
两套规则并不对称。flex-grow 直接按因子比例分剩余空间,和项目本身多宽无关:因子 1 比 3 时,480px 容器里两项分到 120px 与 360px。flex-shrink 则按 shrink 乘以 flex-basis 加权:基准 400px 与 100px、shrink 都是 1 时,收缩量是 4 比 1,最终是 384px 与 96px,不是各让一半。
flex 项目为什么缩不下去还溢出容器?
多半是自动最小尺寸在挡着。flex 项目的 min-width 初始值是 auto,会解析成内容的最小尺寸,内容撑得住就一步都不让。两个内容宽 250px 的项目放进 300px 容器时,最终仍是 250px 各自站着、溢出约 200px;给它们补一句 min-width: 0 之后就能缩到 150px 正好放下。本页每张项目卡片上都有这个开关。
flex 布局竖排时 justify-content 为什么变垂直?
因为 justify-content 管的从来不是水平方向,而是主轴方向。flex-direction 竖排时主轴变成纵轴,它自然就改管上下分布了,而 align-items 反过来去管左右对齐。这也是很多人把 column 布局调不出效果的原因:把两个属性对调一下就对了。本页预览区上方会实时显示当前主轴与交叉轴各是哪一条。
flex 布局里 align-items 和 align-content 有什么区别?
align-items 管的是每个项目在自己所在那一行里怎么对齐,单行多行都有效;align-content 管的是多行之间怎么分布,只有真正换了行才有意义。align-content 不生效的原因只有一个:容器没换行。把 flex-wrap 改成 wrap 之后它立刻就有反应了。本页在 nowrap 时会把这个下拉置灰并写明原因。
flex-basis 和 width 同时写以哪个为准?
主轴方向上 flex-basis 优先,width 只在 flex-basis 是 auto 时才接管。所以既写了 width 又写 flex-basis: 0% 的项目,实际起点是 0 而不是那个 width。另外 flex-basis 百分比按容器主轴内尺寸解析,容器一换尺寸这个数就跟着变;要一个不随容器变的起点请直接写像素值。
flex 布局最后一行怎么左对齐不被拉开?
这是 space-between 的固有行为:它对每一行一视同仁,最后一行项目少的时候空隙自然被拉得很大。flex 最后一行左对齐的稳妥做法有三条:给项目定宽再用 gap 控间距、补几个不可见的占位元素凑满一行、或者干脆改用 Grid。本页在真的换了行且用了 space-between 时会主动提示这一条。
Flexbox 演练场能导出 Tailwind flex 类名吗?
能。切到 Tailwind 标签就会按官方类名优先输出,例如媒体对象配方的两个项目是 shrink-0 basis-12 h-12 与 flex-1 h-[72px] min-w-0。档位对不上时会退回任意值写法并在下方逐条列出是哪几条,不会硬套一个最接近的档位悄悄改掉你的数值。对照表按标注的版本,其他版本请自行核对。
flex 布局里 order 改了顺序读屏软件为什么没变?
order 属性只改视觉顺序,DOM 顺序一个字都没动,而读屏软件与键盘 Tab 焦点走的是 DOM 顺序,于是就出现了「看着在前面、读起来在后面」的错位。要真正换顺序请改 HTML 里的元素顺序,本页每张项目卡片上的上移与下移按钮改的就是它。order 更适合做纯视觉的微调。
flex 布局和 Grid 布局该怎么选?
Flex 是一维的,沿一条主轴排一串项目,适合导航栏、按钮组、媒体对象、卡片一行这类内容驱动的场景。Grid 是二维的,先画好行列再往格子里放东西,适合整页骨架与需要行列同时对齐的表格式布局。判断标准很简单:只关心一个方向就用 flex,行和列都要对齐就用 Grid,两者混用也很常见。

Flexbox 属性速查表:容器与项目分工

flex 布局怎么用,一句话概括:给容器写一句 display: flex,再用几个属性决定项目沿主轴怎么排、沿交叉轴怎么对齐。容器写 display: flex 还是 inline-flex,只影响容器自己在外面怎么排,内部规则完全一样。忘了某个属性怎么写就直接跳到下面这份 flex 布局速查表:取值、初始值和一句话说明都在同一行,不用再去翻规范原文。这件事在中文里还有好几种叫法 —— flex 布局生成器、CSS 弹性布局、弹性盒子布局,说的都是同一件事;想系统看一遍的,可以把这一页当成一份能动手调的 flex 布局教程。英文站点上的 flexbox playground、css flexbox generator、flex layout generator 指的也是它,Flexbox 在线演练这个说法同样常见。

属性一共分两组,分清楚是本工具最先要说的事:一组写在容器上,一组写在项目上。写错地方是最常见的入门错误 —— 把 align-self 写到容器上、或者把 justify-content 写到项目上,浏览器不会报错,只会什么都不发生。

写在 flex 容器上的属性(初始值取自本站的属性数据表)
属性取值初始值说明
displayflex / inline-flexblock写上它这个元素才是 flex 容器;inline-flex 让容器自己变成行内元素,但内部排布规则完全一样
flex-directionrow / row-reverse / column / column-reverserow决定主轴是横的还是竖的,改它等于把下面所有对齐属性的方向一起翻过来
flex-wrapnowrap / wrap / wrap-reversenowrap默认不换行,项目再多也挤在一行里;改成 wrap 才会有第二行
justify-contentflex-start / flex-end / center / space-between / space-around / space-evenlyflex-start管主轴方向上项目怎么分布,主轴是横是竖跟着 flex-direction 走
align-itemsstretch / flex-start / flex-end / center / baselinestretch管交叉轴方向上每个项目自己怎么对齐,默认拉伸到和行一样高
align-contentstretch / flex-start / flex-end / center / space-between / space-around / space-evenlystretch管多行之间怎么分布,只有换行之后才有意义,单行容器写了也没反应
gap<length> 或 <行间距> <列间距>0pxgap 间距同时管行与列,一条顶 row-gap 与 column-gap 两条,且不会在两端多出空白
写在 flex 项目上的属性(初始值取自本站的属性数据表)
属性取值初始值说明
flex-grow≥ 0 的数值0有剩余空间时按因子比例分,flex-grow 比例直接决定分多少,和项目本身多宽无关
flex-shrink≥ 0 的数值1空间不够时按因子收缩,但 flex-shrink 加权用的是 flex-basis,宽的项目让得更多
flex-basisauto / content / <length> / <percentage>auto伸缩之前的起点尺寸;flex-basis 百分比按容器主轴内尺寸解析,换个容器数字就变
flex<grow> <shrink> <basis> 的简写0 1 autoflex 简写会一次改掉三项,漏写的那两项按简写规则补默认值而不是保持原样
align-selfauto / stretch / flex-start / flex-end / center / baselineauto单个项目覆盖容器的 align-items,auto 就是跟随容器
order整数,可为负0只改视觉顺序,读屏软件与 Tab 焦点仍按 HTML 里的顺序走
min-width / min-heightauto / 0 / <length>autoflex 项目上的初始值是 auto,会解析成内容的最小尺寸,这就是项目缩不下去的元凶

主轴与交叉轴:flex-direction 一改全都变

flex 布局里没有「水平属性」和「垂直属性」,只有主轴属性和交叉轴属性。flex-direction 竖排时主轴变成纵轴,于是 justify-content 从管左右分布改成管上下分布,align-items 反过来去管左右对齐。 这是 column 布局调不出效果的头号原因,也是本页预览区上方一直显示当前主轴方向的理由。

四个方向下,两个对齐属性各自管什么
flex-direction主轴主轴起点justify-content 管align-items 管
row水平左右分布上下对齐
row-reverse水平左右分布(起点在右)上下对齐
column垂直上下分布左右对齐
column-reverse垂直上下分布(起点在下)左右对齐

flex 水平垂直居中只要两句声明,就是这套规则最好用的一个推论:横排时 justify-content: center 管左右、align-items: center 管上下,两句一起写就居中了。反过来在 column 下,flex 垂直居中靠 align-items 就不成立了 —— 那时候垂直方向归 justify-content 管。换个方向,同样两句话的效果正好对调。

gap 间距同时管行与列,一条 gap 顶 row-gap 与 column-gap 两条,而且不会像 margin 那样在两端多出一截空白。行列想给不同的值时写两个数,前面是行间距、后面是列间距。

flex 简写展开:1 与 auto 差在哪

flex: 1 是什么意思?它是 flex: 1 1 0% 的简写 —— 可以变长、可以收缩、起点按 0 算,三件事写在同一行里。 flex 简写会一次改掉三个属性,漏写的那两项按简写规则补默认值,而不是保持原样 —— 这是它最容易坑人的地方。最关键的一条是:flex: 1 展开之后 flex-basis 是 0%,不是 0、更不是 auto。起点归零意味着容器的全部空间都当作剩余空间来分,所以结果是严格等分;而 flex: auto 先按内容打底再分剩下的,内容长的项目最后就更宽。

常见 flex 简写的展开结果(由本站的简写数据表现算)
写法flex-growflex-shrinkflex-basis要点
flex: 1110%起点归零再按因子分,结果是严格等分
flex: 2210%和 flex: 1 的项目并排时占两份
flex: auto11auto先按内容打底,再把剩余空间分掉
flex: initial01auto默认值,不长只缩
flex: none00auto既不长也不缩,内容多宽就多宽
flex: 0 0 200px00200px锁死 200px,侧栏最常用的写法
flex: 1 1 0%110%flex: 1 的完整写法
flex: 1 30%1130%两个值里第二个是长度时,它是 basis 不是 shrink

flex-grow 与 flex-shrink 怎么分空间

长和缩是两套不对称的规则,混为一谈是中文教程里最普遍的一处错误。flex-grow 比例直接决定分多少,与项目本身多宽无关: 因子 1 比 3 的两个项目在 480px 容器里分到 120px 与 360px。flex-shrink 加权用的是 flex-basis —— 收缩量正比于 shrink 乘以基准尺寸,所以基准 400px 与 100px、shrink 都写 1 的两个项目,收缩量是 4 比 1 而不是各让一半,最终落在 384px 与 96px。

两套规则的对照(数值由本站求解器按 CSS 规范现算)
场景规则算式结果
有剩余空间grow 按因子比例分,不加权因子 1 : 3120px 与 360px
空间不够shrink 按 shrink × basis 加权基准 400 : 100384px 与 96px
因子之和小于 1只分走「初始自由空间 × 因子和」自由空间 280px × 0.6每项 184px,还剩 112px 留白

第三行那条最少见也最容易漏:两个项目各写 flex-grow: 0.3 时,因子之和只有 0.6,浏览器只会分走自由空间的 60%, 剩下的原样留白。本页的尺寸表会把每个项目的起点、假设尺寸、最终尺寸与「为什么停在这里」逐行列出来, 不用再靠肉眼猜。

min-width auto 陷阱:项目为什么缩不下去

这条是中文社区问得最多、答得最含糊的一个 flex 问题。flex 项目上的 min-width 初始值不是 0 而是 auto,它会解析成内容的最小尺寸:内容撑得住的项目根本缩不下去,于是 flex-shrink 看起来「不生效」,容器被撑破。 flex 项目溢出容器时,先怀疑这一条。

同一个模型开关一次 min-width 的对照(300px 容器,两个内容宽 250px 的项目)
min-width每个项目最终容器溢出尺寸表里的原因
auto(初始值)250px约 200px被自动最小尺寸顶住
0150px0px正常分到了空间

align-content 只有换行之后才生效

align-content 不生效的原因只有一个:容器没换行。它管的是多行之间怎么分布,单行容器根本没有「行与行之间」可言, 写了自然没反应。flex-wrap 换行之后才有多行,这时候 align-content 才开始起作用;只想调单行里每个项目的对齐, 要找的是 align-items。

三个 align 开头的属性,管的完全不是一回事
属性写在哪管什么什么时候有效
align-items容器每个项目在自己那一行里的交叉轴对齐单行多行都有效
align-content容器多行之间在交叉轴上怎么分布只有换行之后
align-self项目单个项目覆盖容器的 align-items任何时候

单个项目要跳出队形就写 align-self,它只影响自己,其余项目仍然听容器的。本页在 flex-wrap 是 nowrap 时会把 align-content 下拉置灰并写明原因,但模型里仍然保留你选的值,切回 wrap 立刻恢复。

flex 布局最后一行为什么会被拉开

换行之后每一行都各自套用同一套 justify-content 规则,最后一行项目少、空隙自然被拉得很大。这不是 bug, 而是 space-between 的定义如此。flex 最后一行左对齐的稳妥做法有三条:给项目定宽再用 gap 控间距、补几个宽度相同但不可见的占位元素凑满一行、或者换成 Grid 来做真正的二维对齐。

flex-basis 和 width 同时写谁说了算

主轴方向上 flex-basis 优先,width 只在 flex-basis 取 auto 时才接管。这就是为什么同时写了 width 和 flex: 1 的项目最后并没有按 width 那个数排 —— flex: 1 里的 basis 是 0%,width 早就被绕过去了。 交叉轴方向不受影响,那边还是 height 说了算(竖排时反过来)。

flex-basis 百分比按容器主轴内尺寸解析,横排看容器宽、竖排看容器高。换个容器尺寸,同一个百分比算出来的像素就不同, 所以本页给的等效像素一律标注为「按当前预览容器估算」,不宣称精确。想要一个完全不随容器变的起点,直接写像素值。

主轴起点到底取哪个值
写法主轴起点常见用途
flex-basis: auto项目自身的内容尺寸按内容排,最接近不写 flex 的默认行为
flex-basis: 0%0,全部空间当剩余空间分严格等分,配合 flex-grow 用
flex-basis: 200px固定 200px侧栏定宽,通常再配 flex-shrink: 0
flex-basis: 30%容器主轴内尺寸的 30%按比例分档,注意换容器就变

order 只改视觉顺序,不改朗读顺序

order 属性只改视觉顺序,读屏软件与键盘 Tab 焦点仍按 HTML 里的顺序走。用它做纯视觉的微调没问题, 但拿它来「调整内容顺序」就会让键盘用户和读屏用户拿到一个与视觉完全对不上的页面。真要换顺序, 请改 HTML 里的元素顺序 —— 本页每张项目卡片上的上移与下移按钮改的就是 DOM 顺序,与 order 是两条不同的路径。

另外 order 的排序是稳定的:order 相同的项目仍按文档顺序排,负数排到 0 之前。本页的尺寸表里会同时给出每个项目的 HTML 顺序编号与当前视觉位次,方便对照。

Tailwind flex 类名对照表

下表的类名取自 Tailwind CSS v3.4 的默认主题,由本站的数据表现算渲染。 本工具的 Tailwind 标签按官方类名优先输出,档位对不上时退回任意值写法(例如 13px 的间距会写成方括号形式), 并在下方逐条列出是哪几条走了任意值 —— 不会硬套一个最接近的档位悄悄改掉你的数值。

Tailwind CSS v3.4 的 flex 相关工具类与对应的 CSS 声明
CSS 属性CSS 值Tailwind 类名
displayflexflex
displayinline-flexinline-flex
flex-directionrowflex-row
flex-directionrow-reverseflex-row-reverse
flex-directioncolumnflex-col
flex-directioncolumn-reverseflex-col-reverse
flex-wrapnowrapflex-nowrap
flex-wrapwrapflex-wrap
flex-wrapwrap-reverseflex-wrap-reverse
justify-contentflex-startjustify-start
justify-contentflex-endjustify-end
justify-contentcenterjustify-center
justify-contentspace-betweenjustify-between
justify-contentspace-aroundjustify-around
justify-contentspace-evenlyjustify-evenly
align-itemsstretchitems-stretch
align-itemsflex-startitems-start
align-itemsflex-enditems-end
align-itemscenteritems-center
align-itemsbaselineitems-baseline
align-contentstretchcontent-stretch
align-contentflex-startcontent-start
align-contentflex-endcontent-end
align-contentcentercontent-center
align-contentspace-betweencontent-between
align-contentspace-aroundcontent-around
align-contentspace-evenlycontent-evenly
align-selfautoself-auto
align-selfstretchself-stretch
align-selfflex-startself-start
align-selfflex-endself-end
align-selfcenterself-center
align-selfbaselineself-baseline
flex1 1 0%flex-1
flex1 1 autoflex-auto
flex0 1 autoflex-initial
flex0 0 autoflex-none
flex-grow1grow
flex-grow0grow-0
flex-shrink1shrink
flex-shrink0shrink-0

间距、flex-basis 与固定尺寸走的是 Tailwind 的 spacing 档位,所以 16px 会写成一档而不是方括号。 Tailwind 各大版本之间类名与档位都调整过,这张表带着版本号看才有意义,其他版本请自行核对。

flex 布局常用配方与本工具的边界

点一下即可载入的布局配方(要点由本站的配方数据表现算)
配方要点
水平垂直居中justify-content 与 align-items 各写一句 center,flex 水平垂直居中只要两句声明
竖排整列居中换成 column 之后 justify-content 改管上下,flex 垂直居中靠 align-items 管左右
导航栏两端对齐space-between 把首尾顶到两端,中间的空隙由浏览器分
媒体对象(图标固定 + 文字自适应)图标 flex none 锁死,文字 flex 1 吃掉剩余空间,并补 min-width 0 让长文本能缩
等宽卡片行三个项目都写 flex 1,起点归零之后严格等分,和内容多长无关
卡片换行网格flex-wrap 换行之后才有多行,行距列距都交给 gap
粘底页脚整页竖排,中间主体 flex 1 把剩余高度吃满,页脚自然被顶到底部
圣杯三栏两侧定宽不伸不缩,中间 flex 1 自适应,并补 min-width 0 防止内容把它撑破
等高卡片align-items 保持默认的 stretch,三张卡片会被拉到同一高度,不用写死高度