前端原生构建交互式进度步骤组件(Progress Steps)

news2025/6/7 2:58:16

在现代网页设计中,进度步骤(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 组件;
  • 添加动画效果(如淡入淡出);
  • 支持键盘方向键导航;
  • 配合本地存储保存当前步骤状态;
  • 增加步骤内容区域,展示更多信息。

📝 总结

通过本文,你已经掌握了一个完整的 “进度步骤”组件 的开发流程。这个组件不仅外观美观,而且功能完整,适用于各种需要分步骤引导用户的场景。希望你能将它应用到自己的项目中,并在此基础上进行更多个性化扩展!

如果你喜欢这篇文章,欢迎分享给你的朋友或同事,也欢迎继续关注我的博客获取更多前端实战技巧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【基于阿里云搭建数据仓库(离线)】Data Studio创建资源与函数

Data Studio支持在您的数据分析代码中引用自定义的资源和函数&#xff08;支持MaxCompute、EMR、CDH、Flink&#xff09;&#xff0c;您需要先创建或上传资源、函数至目标工作空间&#xff0c;上传后才可在该工作空间的任务中使用。您可参考本文了解如何使用DataWorks可视化方式…

web3-以太坊智能合约基础(理解智能合约Solidity)

以太坊智能合约基础&#xff08;理解智能合约/Solidity&#xff09; 无需编程经验&#xff0c;也可以帮助你了解Solidity独特的部分&#xff1b;如果本身就有相应的编程经验如java&#xff0c;python等那么学起来也会非常的轻松 一、Solidity和EVM字节码 实际上以太坊链上储存…

【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 是数字音频接收芯片&#xff0c;支持IEC60958、S/PDIF、AES3等协议&#xff0c;集成8选1输入切换、低抖动时钟恢复和24bit DAC&#xff0c;适用于家庭影院、汽车音响等高保真场景。 核心特性 高精度&#xff1a;24bit分辨率&#xff0c;动态范围105dB&…

2025年06月05日Github流行趋势

项目名称&#xff1a;onlook 项目地址url&#xff1a;https://github.com/onlook-dev/onlook项目语言&#xff1a;TypeScript历史star数&#xff1a;16165今日star数&#xff1a;1757项目维护者&#xff1a;Kitenite, drfarrell, spartan-vutrannguyen, apps/devin-ai-integrat…

基于BI PaaS架构的衡石HENGSHI SENSE平台技术解析:重塑企业级数据分析基座

在数据驱动决策的时代&#xff0c;传统BI工具日益显露出扩展性弱、灵活性差、资源利用率低等痛点。衡石科技推出的HENGSHI SENSE平台&#xff0c;创新性地采用BI PaaS&#xff08;平台即服务&#xff09;架构&#xff0c;为企业构建了一个强大、开放、可扩展的数据分析基础设施…

【R语言编程绘图-plotly】

安装与加载 在R中使用plotly库前需要安装并加载。安装可以通过CRAN进行&#xff0c;使用install.packages()函数。加载库使用library()函数。 install.packages("plotly") library(plotly)测试库文件安装情况 # 安装并加载必要的包 if (!requireNamespace("p…

通信刚需,AI联手ethernet/ip转profinet网关打通工业技术难关

工业人工智能&#xff1a;食品和饮料制造商的实际用例通信刚需 了解食品饮料制造商如何利用人工智能克服业务挑战 食品和饮料制造商正面临劳动力短缺、需求快速变化、运营复杂性加剧以及通胀压力等挑战。如今&#xff0c;生产商比以往任何时候都更需要以更少的投入实现更高的…

JavaEE->多线程:定时器

定时器 约定一个时间&#xff0c;时间到了&#xff0c;执行某个代码逻辑&#xff08;进行网络通信时常见&#xff09; 客户端给服务器发送请求 之后就需要等待 服务器的响应&#xff0c;客户端不可能无限的等&#xff0c;需要一个最大的期限。这里“等待的最大时间”可以用定时…

<el-table>构建树形结构

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

linux——磁盘和文件系统管理

1、磁盘基础简述 1.1 硬盘基础知识 硬盘&#xff08;Hard Disk Drive&#xff0c;简称 HDD&#xff09;是计算机常用的存储设备之一. p如果从存储数据的介质上来区分&#xff0c;硬盘可分为机械硬盘&#xff08;Hard Disk Drive, HDD&#xff09;和固态硬盘&#xff08;Soli…

云原生 DevOps 实践路线:构建敏捷、高效、可观测的交付体系

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;DevOps 与云原生的深度融合 在传统软件工程范式下&#xff0c;开发与运维之间存在天然的壁垒。开发希望尽快…

gateway 网关 路由新增 (已亲测)

问题&#xff1a; 前端通过gateway调用后端接口&#xff0c;路由转发失败&#xff0c;提示404 not found 排查&#xff1a; 使用 { "href":"/actuator/gateway/routes", "methods":[ "POST", "GET" ] } 命令查看路由列表&a…

Python 训练营打卡 Day 33-神经网络

简单神经网络的流程 1.数据预处理&#xff08;归一化、转换成张量&#xff09; 2.模型的定义 继承nn.Module类 定义每一个层 定义前向传播流程 3.定义损失函数和优化器 4.定义训练过程 5.可视化loss过程 预处理补充&#xff1a; 分类任务中&#xff0c;若标签是整…

如何有效删除 iPhone 上的所有内容?

“在出售我的 iPhone 之前&#xff0c;我该如何清除它&#xff1f;我担心如果我卖掉它&#xff0c;有人可能会从我的 iPhone 中恢复我的信息。” 升级到新 iPhone 后&#xff0c;你如何处理旧 iPhone&#xff1f;你打算出售、以旧换新还是捐赠&#xff1f;无论你选择哪一款&am…

AI大模型学习三十二、飞桨AI studio 部署 免费Qwen3-235B与Qwen3-32B,并导入dify应用

一、说明 ‌Qwen3-235B 和 Qwen3-32B 的主要区别在于它们的参数规模和应用场景。‌ 参数规模 ‌Qwen3-235B‌&#xff1a;总参数量为2350亿&#xff0c;激活参数量为220亿‌。‌Qwen3-32B‌&#xff1a;总参数量为320亿‌。 应用场景 ‌Qwen3-235B‌&#xff1a;作为旗舰模型&a…

操作系统中的设备管理,Linux下的I/O

1. I/O软件分层 I/O 层次结构分为五层&#xff1a; 用户层 I/O 软件设备独立性软件设备驱动程序中断处理程序硬件 其中&#xff0c;设备独立性软件、设备驱动程序、中断处理程序属于操作系统的内核部分&#xff0c;即“I/O 系统”&#xff0c;或称“I/O 核心子系统”。 2.用…

LabVIEW与Modbus/TCP温湿度监控系统

基于LabVIEW 开发平台与 Modbus/TCP 通信协议&#xff0c;设计一套适用于实验室环境的温湿度数据采集监控系统。通过上位机与高精度温湿度采集设备的远程通信&#xff0c;实现多设备温湿度数据的实时采集、存储、分析及报警功能&#xff0c;解决传统人工采集效率低、环境适应性…

Cursor 1.0 版本 GitHub MCP 全面指南:从安装到工作流增强

Cursor 1.0 版本 GitHub MCP 全面指南:从安装到工作流增强 简介 GitHub MCP (Machine Coding Protocol) 是一种强大的工具,能够自动化代码生成、管理和分析,从而显著提升开发效率。本文将全面介绍 GitHub MCP 的安装、配置、使用以及如何将其融入您的工作流。 本文介绍两种…

自主设计一个DDS信号发生器

DDS发生器 DDS信号发生器是直接数字频率合成技术&#xff0c;采用直接数字频率合成(Direct Digital Synthesis&#xff0c;简称DDS)技术&#xff0c;把信号发生器的频率稳定度、准确度提高到与基准频率相同的水平&#xff0c;并且可以在很宽的频率范围内进行精细的频率调节。采…