前端原生构建交互式进度步骤组件(Progress Steps)
在现代网页设计中,进度步骤(Progress Steps) 是一种常见的 UI 模式,常用于引导用户完成注册流程、多步表单、教程或任何需要分步骤操作的场景。本文将带你从零开始构建一个美观且功能完整的 “进度步骤”组件,并详细讲解每一部分代码的作用和实现原理。
🧩 项目结构概览
我们使用以下三种技术来构建这个组件:
- HTML:定义页面结构
- CSS:控制样式与动画效果
- JavaScript:处理用户交互逻辑
最终效果是一个带有动态进度条、可点击切换步骤、按钮状态自动更新的交互式组件。
📄 HTML 结构
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8" /><!-- 确保页面在移动设备上正确缩放 --><meta name="viewport" content="width=device-width, initial-scale=1.0" /><!-- 引入自定义样式表 --><link rel="stylesheet" href="style.css" /><!-- 页面标题 --><title>Progress Steps</title>
</head>
<body><!-- 主容器:包含整个进度组件 --><div class="container"><!-- 进度条区域 --><div class="progress-container"><!-- 实际进度条,宽度由 JS 控制 --><div class="progress" id="progress"></div><!-- 步骤点:每个 circle 表示一个步骤 --><div class="circle active">1</div><div class="circle">2</div><div class="circle">3</div><div class="circle">4</div></div><!-- 操作按钮 --><button class="btn" id="prev" disabled>Prev</button><button class="btn" id="next">Next</button></div><!-- 引入脚本文件 --><script src="script.js"></script>
</body>
</html>
🔍 HTML 解释:
.progress-container
包含了所有步骤点和进度条。.circle
表示每一个步骤,.active
类表示当前激活的步骤。#progress
是动态变化的进度条。- 两个按钮分别控制“上一步”和“下一步”,初始时“上一步”被禁用。
🎨 CSS 样式
/* 引入 Google Fonts 中的 Muli 字体 */
@import url('https://fonts.googleapis.com/css?family=Muli&display=swap');/* 定义全局变量,用于控制进度条和圆圈的颜色 */
:root {--line-border-fill: #3498db; /* 已完成进度的颜色 */--line-border-empty: #383838; /* 未完成进度的颜色 */
}/* 设置所有元素的 box-sizing 属性为 border-box,确保 padding 和 border 不会影响元素宽度 */
* {box-sizing: border-box;
}/* 页面主体样式设置 */
body {background-color: #f1f1f1; /* 背景颜色 */font-family: 'Muli', sans-serif; /* 使用引入的 Muli 字体 */display: flex; /* 使用 Flex 布局 */align-items: center; /* 子元素垂直居中 */justify-content: center; /* 子元素水平居中 */height: 100vh; /* 占满整个视口高度 */overflow: hidden; /* 隐藏溢出内容 */margin: 0; /* 移除默认的 body 外边距 */
}/* 主容器样式 */
.container {text-align: center; /* 文本和内联元素居中 */
}/* 进度条容器样式 */
.progress-container {display: flex; /* 使用 Flex 布局排列子元素 */justify-content: space-between; /* 子元素之间均匀分布 */position: relative; /* 相对定位,用于绝对定位伪元素和进度条 */margin-bottom: 30px; /* 底部外边距 */max-width: 100%; /* 最大宽度为父元素的宽度 */width: 350px; /* 固定宽度 */
}/* 绘制灰色背景线 */
.progress-container::before {content: ''; /* 必须定义 content 属性 */background-color: var(--line-border-empty); /* 使用定义的未完成颜色 */position: absolute; /* 绝对定位 */top: 50%; /* 顶部中心位置 */left: 0; /* 左边起始位置 */transform: translateY(-50%); /* 上下居中 */height: 4px; /* 线的高度 */width: 100%; /* 线的长度 */z-index: -1; /* 放在底层 */
}/* 当前已完成进度条 */
.progress {background-color: var(--line-border-fill); /* 使用定义的已完成颜色 */position: absolute; /* 绝对定位 */top: 50%; /* 顶部中心位置 */left: 0; /* 左边起始位置 */transform: translateY(-50%); /* 上下居中 */height: 4px; /* 进度条的高度 */width: 0%; /* 初始宽度为0%,通过 JavaScript 动态改变 */z-index: -1; /* 放在底层 */transition: 0.4s ease; /* 平滑过渡效果 */
}/* 步骤圆圈样式 */
.circle {background-color: #f1f1f1; /* 默认背景色 */color: #e2e2e2; /* 默认文本颜色 */border-radius: 50%; /* 圆形 */height: 30px; /* 高度 */width: 30px; /* 宽度 */display: flex; /* 使用 Flex 布局 */align-items: center; /* 子元素垂直居中 */justify-content: center; /* 子元素水平居中 */border: 3px solid var(--line-border-empty); /* 边框样式 */transition: 0.4s ease; /* 平滑过渡效果 */
}/* 激活状态下的步骤圆圈样式 */
.circle.active {border-color: var(--line-border-fill); /* 改变边框颜色为已完成颜色 */
}/* 按钮样式 */
.btn {background-color: var(--line-border-fill); /* 背景颜色 */color: #fff; /* 文字颜色 */border: 0; /* 移除默认边框 */border-radius: 6px; /* 圆角半径 */cursor: pointer; /* 鼠标指针变为手型 */font-family: inherit; /* 继承父级字体 */padding: 8px 30px; /* 内边距 */margin: 5px; /* 外边距 */font-size: 14px; /* 字体大小 */
}/* 按钮按下时的效果 */
.btn:active {transform: scale(0.98); /* 缩放效果 */
}/* 移除按钮聚焦时的默认轮廓 */
.btn:focus {outline: 0;
}/* 按钮禁用状态 */
.btn:disabled {background-color: var(--line-border-empty); /* 更改背景颜色 */cursor: not-allowed; /* 鼠标指针样式 */
}
✨ 样式亮点:
- 使用 CSS 变量
--line-border-fill
和--line-border-empty
实现主题色统一管理。 - 使用伪元素
::before
绘制背景线,代表未完成步骤。 - 进度条通过
transform
或width
动态变化,视觉过渡平滑。 - 按钮添加了点击反馈和禁用状态样式,提升用户体验。
⚙️ JavaScript 交互逻辑
// 获取页面上的进度条、上一步和下一步按钮以及所有的步骤圆圈元素
const progress = document.getElementById('progress'); // 进度条元素
const prev = document.getElementById('prev'); // 上一步按钮
const next = document.getElementById('next'); // 下一步按钮
const circles = document.querySelectorAll('.circle'); // 步骤圆圈元素集合let currentActive = 1; // 当前激活的步骤,默认为第一个步骤// 给下一步按钮添加点击事件监听器
next.addEventListener('click', () => {currentActive++; // 增加当前激活的步骤索引if(currentActive > circles.length) { // 如果超出最大步骤数,则设置为最大值currentActive = circles.length;}update(); // 更新界面显示
});// 给上一步按钮添加点击事件监听器
prev.addEventListener('click', () => {currentActive--; // 减少当前激活的步骤索引if(currentActive < 1) { // 如果小于最小步骤数,则设置为最小值currentActive = 1;}update(); // 更新界面显示
});/*** 更新界面函数,根据当前激活的步骤更新各个UI组件的状态*/
function update() {// 遍历所有步骤圆圈,根据当前激活的步骤更新它们的样式circles.forEach((circle, idx) => {if(idx < currentActive) {circle.classList.add('active'); // 激活状态} else {circle.classList.remove('active'); // 非激活状态}});const actives = document.querySelectorAll('.active'); // 获取所有激活状态的步骤圆圈// 根据激活状态的步骤圆圈数量计算进度条宽度百分比progress.style.width = ((actives.length - 1) / (circles.length - 1)) * 100 + '%';// 控制上一步和下一步按钮是否可用if(currentActive === 1) {prev.disabled = true; // 第一步时禁用上一步按钮} else if(currentActive === circles.length) {next.disabled = true; // 最后一步时禁用下一步按钮} else {prev.disabled = false; // 启用上一步按钮next.disabled = false; // 启用下一步按钮}
}
💡 JavaScript 解析:
currentActive
控制当前处于哪个步骤。- 点击“下一步”或“上一步”后,修改该值并调用
update()
函数刷新界面。 update()
函数负责:- 更新每个步骤点的
active
类状态; - 动态设置进度条宽度;
- 控制“上一步”和“下一步”按钮的启用/禁用状态。
- 更新每个步骤点的
🧪 效果演示
运行以上代码后,你会看到一个漂亮的进度步骤组件,支持:
- 点击“下一步”逐步推进;
- 点击“上一步”回退到前面的步骤;
- 进度条随着步骤变化动态扩展;
- 当前步骤高亮显示;
- 到达第一步或最后一步时对应按钮自动禁用。
📦 扩展建议
你可以进一步优化这个组件,例如:
- 将其封装成 Vue / React 组件;
- 添加动画效果(如淡入淡出);
- 支持键盘方向键导航;
- 配合本地存储保存当前步骤状态;
- 增加步骤内容区域,展示更多信息。
📝 总结
通过本文,你已经掌握了一个完整的 “进度步骤”组件 的开发流程。这个组件不仅外观美观,而且功能完整,适用于各种需要分步骤引导用户的场景。希望你能将它应用到自己的项目中,并在此基础上进行更多个性化扩展!
如果你喜欢这篇文章,欢迎分享给你的朋友或同事,也欢迎继续关注我的博客获取更多前端实战技巧!
相关文章:

前端原生构建交互式进度步骤组件(Progress Steps)
在现代网页设计中,进度步骤(Progress Steps) 是一种常见的 UI 模式,常用于引导用户完成注册流程、多步表单、教程或任何需要分步骤操作的场景。本文将带你从零开始构建一个美观且功能完整的 “进度步骤”组件,并详细讲…...
如何给windos11 扩大C盘容量
动不动C盘就慢了,苹果逼着用户换手机,三天两头更新系统,微软也是毫不手软。c盘 从10个G就够用,到100G 也不够,看来通货膨胀是部分行业的。 在 Windows 11 中扩大 C 盘容量,主要取决于磁盘分区布局和可用空…...

【基于阿里云搭建数据仓库(离线)】Data Studio创建资源与函数
Data Studio支持在您的数据分析代码中引用自定义的资源和函数(支持MaxCompute、EMR、CDH、Flink),您需要先创建或上传资源、函数至目标工作空间,上传后才可在该工作空间的任务中使用。您可参考本文了解如何使用DataWorks可视化方式…...
Linux_T(Sticky Bit)粘滞位详解
Linux 粘滞位(Sticky Bit)详解 一、什么是粘滞位(Sticky Bit) 粘滞位(Sticky Bit)是 Linux 和 Unix 系统中一种特殊的权限设置,主要应用于目录,其作用是在多人共享访问的目录中&am…...

web3-以太坊智能合约基础(理解智能合约Solidity)
以太坊智能合约基础(理解智能合约/Solidity) 无需编程经验,也可以帮助你了解Solidity独特的部分;如果本身就有相应的编程经验如java,python等那么学起来也会非常的轻松 一、Solidity和EVM字节码 实际上以太坊链上储存…...
高敏感应用如何保护自身不被逆向?iOS 安全加固策略与工具组合实战(含 Ipa Guard 等)
如果你正在开发一款涉及支付、隐私数据或企业内部使用的 App,那么你可能比多数开发者更早意识到一件事——App 一旦被破解,损失的不只是代码,还有信任与业务逻辑。 在我们为金融类工具、HR 系统 App、数据同步组件等高敏感项目提供支持的过程…...

【C++项目】负载均衡在线OJ系统-2
文章目录 oj_server模块编写oj_server框架的搭建-oj_server/oj_server.cpp 路由框架 oj_model模块编写题目信息设置v1.文件版本-common/util.hpp boost库spilt函数的使用-oj_server/oj_model_file.hpp 文件版本model编写v2.mysql数据库版本1.mysql创建授权用户、建库建表录入操…...

GC1809:高性能24bit/192kHz音频接收芯片解析
1. 芯片概述 GC1809 是数字音频接收芯片,支持IEC60958、S/PDIF、AES3等协议,集成8选1输入切换、低抖动时钟恢复和24bit DAC,适用于家庭影院、汽车音响等高保真场景。 核心特性 高精度:24bit分辨率,动态范围105dB&…...

2025年06月05日Github流行趋势
项目名称:onlook 项目地址url:https://github.com/onlook-dev/onlook项目语言:TypeScript历史star数:16165今日star数:1757项目维护者:Kitenite, drfarrell, spartan-vutrannguyen, apps/devin-ai-integrat…...
flask功能使用总结和完整示例
Flask 功能使用总结与完整示例 一、Flask 核心功能总结 Flask 是轻量级 Web 框架,核心功能包括: 路由系统:通过 app.route 装饰器定义 URL 与函数的映射。模板引擎:默认使用 Jinja2,支持动态渲染 HTML。请求处理&…...
AWS 亚马逊 S3存储桶直传 前端demo 复制即可使用
自己踩过坑不想别人也踩坑了 亚马逊S3存储桶直传前端demo复制即可使用 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0…...
DAY 15 复习日
浙大疏锦行 数据使用爬虫爬取weibo数据,下面是代码 import datetime import os import csv import timeimport numpy as np import random import re import urllib.parse import requests from fake_useragent import UserAgentdef init():if not os.path.exists…...
Vue Router 导航方法完全指南
📖 前言 在 Vue 项目中,我们经常需要在不同页面之间跳转,或者更新当前页面的 URL 参数。Vue Router 提供了几种不同的导航方法,每种方法都有其特定的使用场景。本文将详细讲解这些方法的区别和最佳实践。 🎯 核心概念…...
MidJourney入门学习
1. 引言 MidJourney 是一款由美国科技公司开发的先进文本到图像生成 AI 工具,自 2022 年推出以来迅速在创意产业和社交媒体领域引发轰动。与 Stable Diffusion 不同,MidJourney 以其独特的美学风格、高度细节化的图像生成能力和强大的创意引导功能著称,成为设计师、艺术家和…...
2025最新Java日志框架深度解析:Log4j 2 vs Logback性能实测+企业级实战案例
一、为什么printStackTrace是"代码坟场"? 你写的日志可能正在拖垮系统! 在Java开发中,直接调用printStackTrace()打印异常堆栈是最常见的"自杀式操作"。这种方式会导致三大致命问题: 无法分级控制ÿ…...
如何安全高效的文件管理?文件管理方法
文件的管理早已不只是办公场景中的需求。日常生活、在线学习以及个人收藏中,文件管理正逐渐成为我们数字生活中的基础。但与此同时,文件管理的混乱、低效以及安全性问题也频繁困扰着许多人。 文件管理的挑战与解决思路 挑战一:文件存储无序…...

基于BI PaaS架构的衡石HENGSHI SENSE平台技术解析:重塑企业级数据分析基座
在数据驱动决策的时代,传统BI工具日益显露出扩展性弱、灵活性差、资源利用率低等痛点。衡石科技推出的HENGSHI SENSE平台,创新性地采用BI PaaS(平台即服务)架构,为企业构建了一个强大、开放、可扩展的数据分析基础设施…...
Hive中ORC存储格式的优化方法
优化Hive中的ORC(Optimized Row Columnar)存储格式可显著提升查询性能、降低存储成本。以下是详细的优化方法,涵盖参数配置、数据组织、写入优化及监控调优等维度: 一、ORC核心参数优化 1. 存储与压缩参数 SET orc.block.size=268435456; -- 块大小(默认256MB)…...
代码训练LeetCode(23)随机访问元素
代码训练(23)LeetCode之随机访问元素 Author: Once Day Date: 2025年6月5日 漫漫长路,才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 380. O(1) 时间插入、删除和获取随机元素 - 力扣(LeetCode)力…...

【R语言编程绘图-plotly】
安装与加载 在R中使用plotly库前需要安装并加载。安装可以通过CRAN进行,使用install.packages()函数。加载库使用library()函数。 install.packages("plotly") library(plotly)测试库文件安装情况 # 安装并加载必要的包 if (!requireNamespace("p…...
float、double 这类 浮点数 相比,DECIMAL 是另一种完全不同的数值类型
和 float、double 这类**“浮点数”**相比,DECIMAL 是另一种完全不同的数值类型,叫做: ✅ DECIMAL 是什么? DECIMAL 是“定点数”类型(fixed-point),用于存储精确的小数值,比如&…...

通信刚需,AI联手ethernet/ip转profinet网关打通工业技术难关
工业人工智能:食品和饮料制造商的实际用例通信刚需 了解食品饮料制造商如何利用人工智能克服业务挑战 食品和饮料制造商正面临劳动力短缺、需求快速变化、运营复杂性加剧以及通胀压力等挑战。如今,生产商比以往任何时候都更需要以更少的投入实现更高的…...

JavaEE->多线程:定时器
定时器 约定一个时间,时间到了,执行某个代码逻辑(进行网络通信时常见) 客户端给服务器发送请求 之后就需要等待 服务器的响应,客户端不可能无限的等,需要一个最大的期限。这里“等待的最大时间”可以用定时…...
6个月Python学习计划 Day 15 - 函数式编程、高阶函数、生成器/迭代器
第三周 Day 1 🎯 今日目标 掌握 Python 中函数式编程的核心概念熟悉 map()、filter()、reduce() 等高阶函数结合 lambda 和 列表/字典 进行数据处理练习了解生成器与迭代器基础,初步掌握惰性计算概念 🧠 函数式编程基础 函数式编程是一种…...

<el-table>构建树形结构
最佳实践 el-table实现树形结构主要依靠row-key和tree-props来实现的。 💫 无论是el-table实现的树形结构还是el-tree组件都是绑定的树形结构的数据,因此如果数据是扁平的话,需要进行树化。 代码 <template><div><el-table:d…...

linux——磁盘和文件系统管理
1、磁盘基础简述 1.1 硬盘基础知识 硬盘(Hard Disk Drive,简称 HDD)是计算机常用的存储设备之一. p如果从存储数据的介质上来区分,硬盘可分为机械硬盘(Hard Disk Drive, HDD)和固态硬盘(Soli…...

云原生 DevOps 实践路线:构建敏捷、高效、可观测的交付体系
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:DevOps 与云原生的深度融合 在传统软件工程范式下,开发与运维之间存在天然的壁垒。开发希望尽快…...

gateway 网关 路由新增 (已亲测)
问题: 前端通过gateway调用后端接口,路由转发失败,提示404 not found 排查: 使用 { "href":"/actuator/gateway/routes", "methods":[ "POST", "GET" ] } 命令查看路由列表&a…...
ArcGIS Pro 3.4 二次开发 - 共享
环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 共享1 共享1.1 获取当前活动的门户1.2 获取所有门户的列表1.3 将门户添加到门户列表1.4 获取门户并登录,将其设置为活动状态1.5 监听门户事件1.6 从活动门户获取当前登录用户1.7 获取当前用户的“在线”门户视图1.8 获取当前用户的…...
Python html 库用法详解
html 是 Python 的标准库之一,主要用于处理 HTML 相关的编码和解码操作。它提供了两个核心函数:escape() 和 unescape()。 基本功能 1、html.escape() - HTML 编码 将特殊字符转换为 HTML 实体,防止 XSS 攻击或确保 HTML 正确显示 import…...