纯css步骤条优雅的关键在于切断flex干扰链:统一flex属性、禁用宽高约束、强制单行文本、容器级绘制连线、data-status驱动状态、响应式重置对齐锚点。

纯 CSS 步骤条在 flex 架构下能完全脱离 JS 渲染,但“优雅”的关键不在炫技,而在状态可控、响应可靠、缩放不崩——所有这些都取决于你是否切断了 flex 的干扰链。
为什么 flex: 1 总是等分失败
不是 flex: 1 不工作,而是它被内容反向劫持了:只要任一 .step 里存在 min-width、长文本未设 white-space: nowrap、图标尺寸不一致、或 padding 差异,浏览器就会优先满足内容最小尺寸,再分配剩余空间,结果就是“看着写了 flex: 1,实际还是按字数撑开”。
- 统一所有
.step的flex: 1,且显式禁用宽高约束:width: auto; min-width: 0; max-width: none; - 文字强制单行:
white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - 统一
box-sizing: border-box,避免padding影响 flex 基准计算 - 放弃
margin控制步骤间距——它会挤占 flex 分配空间;改用容器级padding留白
连线不能靠 margin 或 border-bottom 拉出来
用 margin-right 模拟连线,或给每个 .step 加 border-bottom 再拉长,都会导致首尾多线、断点错位、响应式下连接偏移。真正可控的方式是把连线逻辑从子项抽离到容器级。
- 在步骤容器(如
.steps)上用::before绘制贯穿横线:position: absolute; top: 50%; transform: translateY(-50%); width: 100%; height: 2px; background: #ddd; - 每个
.step设为position: relative,只为圆点/数字提供定位上下文 - 圆点用
::before实现,固定width/height/border-radius: 50%,别依赖字体图标默认大小 - 首项左侧、末项右侧不画线?不用
:first-child和:last-child控制伪元素显隐,直接让容器横线覆盖全部,再用.step的背景色遮盖掉不需要的部分(更稳)
状态必须用 data-status 驱动,而不是一堆 class
写 class="step step-active step-done step-error" 是维护灾难:JS 更新时容易漏掉某一项,CSS 选择器权重打架,状态样式散落在各处。属性驱动才是可扩展的底线。
- 只用三个值:
data-status="todo"、data-status="active"、data-status="done" - 所有视觉反馈基于属性选择器:
[data-status="done"]::before { background: #06e; }、[data-status="done"]::after { content: "✓"; } - 连线颜色随状态推进?不要用兄弟选择器(如
.step[data-status="done"] ~ .step::before),它无法跨过 DOM 变更间隙;改用 JS 动态更新容器上的 CSS 变量,再由calc()驱动进度条宽度 - 图标用
<img>而非background-image,便于通过src切换状态,也规避构建路径解析问题
响应式切换时最易忽略的对齐陷阱
小屏下改成垂直布局,很多人只加 flex-direction: column 就完事,结果圆点偏上、文字基线不齐、连线错位——根本原因是没重置对齐锚点。
- 移动端媒体查询中,
.step改为display: flex; flex-direction: column; align-items: flex-start;(不是center,否则多行文字会左悬垂) - 圆点
::before改用align-self: center;居中,而非top: 50%; transform: translateY(-50%)(后者受line-height波动影响) - 隐藏水平连线:
.steps::before { display: none; },改用.step:not(:last-child)::after画竖线:content: ""; position: absolute; top: 100%; left: 50%; transform: translateX(-50%); height: 1em; background: #ddd; - 所有文字统一
text-align: left,避免居中后多行文本视觉失衡
真正难的不是写出第一版步骤条,而是当产品要求“第3步加宽一倍”“移动端步骤文字换两行”“完成态要带 SVG 动画”时,你的 CSS 还能不能只改一两个值就跑通——那才是 flex 架构下优雅的终点。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











