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,用来设置可膨胀基准
相关推荐
快乐肚皮3 小时前
一文了解XSS攻击:分类、原理与全方位防御方案
java·前端·xss
保护我方头发丶3 小时前
ESP-wifi-蓝牙
前端·javascript·数据库
想学后端的前端工程师4 小时前
【Flutter跨平台开发实战指南:从零到上线-web技术栈】
前端·flutter
老王Bingo4 小时前
Qwen Code + Chrome DevTools MCP,让爬虫、数据采集、自动化测试效率提升 100 倍
前端·爬虫·chrome devtools
董世昌414 小时前
什么是扩展运算符?有什么使用场景?
开发语言·前端·javascript
来杯三花豆奶4 小时前
Vue 3.0 Mixins 详解:从基础到迁移的全面指南
前端·javascript·vue.js
想学后端的前端工程师5 小时前
【React性能优化实战指南:从入门到精通-web技术栈】
前端·react.js·性能优化
白兰地空瓶5 小时前
React Hooks 深度理解:useState / useEffect 如何管理副作用与内存
前端·react.js
cike_y5 小时前
JSP内置对象及作用域&双亲委派机制
java·前端·网络安全·jsp·安全开发
巴拉巴拉~~6 小时前
KMP 算法通用进度条组件:KmpProgressWidget 多维度 + 匹配进度联动 + 平滑动画
java·服务器·前端