CSS自己实现一个步骤条

前言

步骤条是一种用于引导用户按照特定流程完成任务的导航条,在各种分步表单交互场景中广泛应用。例如:在HIS系统-门诊医生站中的接诊场景中,我们就可以使用步骤条来实现。她的执行步骤分别是:门诊病历=>遗嘱录入=>完成接诊。

我们发现,步骤条通常由编号、名称和引导线三个基本要素组成。接下来,我们来根据这三个基本要素来进行实现

确定结构

对于步骤条这种呈现顺序的列表结构,在HTML标签选择上,使用ul或ol标签可以让语义更加清晰。

html 复制代码
<ol class="steps">
   <li>注册</li>
    <li>域认证</li>
    <li>身份校验</li>
    <li class="active">风险等级评估</li>
    <li>开通账号</li>
</ol>

样式

css 复制代码
.steps {
   display: flex;
   /* 按水平均匀分布,行首行尾两端靠齐 */
   justify-content: space-between;
   margin: 0;
   padding: 0;
   /* 定义CSS计数器 */
   counter-reset: order;
   list-style: none;
   --normal-color: #666;
   --active-color: #5082f5;
}

.steps>li {
   counter-increment: order;
   /* 弹性宽度(根据其内容来调整) */
   flex: auto;
   /* 内联块级弹性伸缩盒子 */
   display: inline-flex;
   align-items: center;
   color: var(--active-color)
}

.steps>li::before {
   content: counter(order);
   width: 1.4em;
   line-height: 1.4em;
   margin-right: 0.5em;
   vertical-align: middle;
   text-align: center;
   border-radius: 50%;
   border: 1px solid;
   /* 布局宽度不够时禁止收缩 */
   flex-shrink: 0;
}

.steps>li:not(:last-child)::after {
   content: '';
   /* width: 60px; */
   /* 让引导线和文本垂直居中 */
   /* vertical-align: middle; */
   /* 占满 li 中的剩余宽度 */
   flex: 1;
   margin: 0 1em;
   /* 不指定颜色,则自动继承自身color或父级color */
   border-bottom: 1px solid;
   opacity: .6;
}

.steps>li:last-child {
   flex: none;
}
/* "已完成"和"进行中"的样式定义 */

.steps>.active {
   color: var(--active-color)
}

.steps>.active::before {
   color: #fff;
   background: var(--active-color);
   border-color: var(--active-color);
}

.steps>.active::after,
.steps>.active~li {
   /* "进行中"后面的引导线按普通色显示 */
   color: var(--normal-color);
}

交互

js 复制代码
const listItems = document.querySelectorAll(".steps li")
listItems.forEach(li => {
    li.addEventListener("click", () => {
        listItems.forEach(smalLi => {
            smalLi.classList.remove('active')
        })
        li.classList.toggle("active")
    })
})

最终效果

知识点总结

  • flex容器的 justify-content: space-between; 可令子元素按显示方向均匀分布,两端分散对齐;
  • inline-flex: 盒子既能像flex容器那样轻松拿捏其子元素的布局,又能像行内块元素一样平易近人;
  • flex: number; 对于宽度(或高度)能占尽占;
  • flex: auto; 从自身实际情况出发应占尽占,共同富裕;
  • flex-shrink: 用来设置flex元素的可压榨基准,与它对应的是flex-basis,用来设置可膨胀基准
相关推荐
颜进强4 分钟前
01 · NestJS 是什么:用途、解决什么问题、与热门框架对比
前端·后端·ai编程
wendZzoo8 分钟前
前端工程师的 3D 第一课:一个模型如何进入网页
前端
颜进强19 分钟前
04 · NestJS 依赖注入:你在 `@Module` 写的 providers,和构造参数里那个类型,是怎么"对上"的?
前端·后端·ai编程
肆仲冬34 分钟前
不用框架,用 TypeScript 从零搭一个 Agent 框架
前端
林语琛42 分钟前
我写的 switch…break 被 Babel 偷偷吞了
前端·javascript·babel
烈风逍遥1 小时前
第六篇:RAG 知识库构建与检索全链路
前端·人工智能·后端
爱丶不疚1 小时前
什么是 Jev 决策模型?它适合干什么?
前端·agent
江畔柳前堤1 小时前
字节跳动·大模型应用知识手册
前端·人工智能·深度学习·opencv·目标检测·重构·transformer
LEE2 小时前
前端转型全栈 03:接口失败也返回 200,OpenAPI 契约与错误码怎么定
前端·后端·全栈
扶苏10022 小时前
CSS 图标换色指南:用 brightness / invert / mask 把任意图片改成想要的颜色
css