如何实现进度条线条与检查点分离的效果?
实现检查点与线条分离的物流追踪进度条
要实现检查点和进度线条分离的效果,核心是将进度条拆分为独立的分段线条和检查点,通过flex布局实现自动排列,再分别控制各部分的状态。以下是修改后的完整实现:
<!DOCTYPE html> <html> <head> <style> /* 外层容器,居中对齐 */ .outer-container { display: flex; justify-content: center; align-items: center; height: 100vh; } /* 进度轨道容器,用flex排列检查点和分段线条 */ .progress-track { width: 80%; display: flex; align-items: center; position: relative; } /* 分段进度条,默认未完成状态为灰色 */ .progress-segment { flex: 1; height: 3px; background-color: #ccc; transition: background-color 0.5s ease; } /* 已完成的分段线条 */ .progress-segment.completed { background-color: green; } /* 检查点样式 */ .checkpoint { width: 18px; height: 18px; border-radius: 50%; background-color: #88CCDF; border: 2px solid #fff; box-shadow: 0 0 0 1px #ccc; transition: background-color 0.5s ease; z-index: 1; } /* 检查点状态:已到达 */ .checkpoint.reached { background-color: yellow; } /* 检查点状态:已通过 */ .checkpoint.passed { background-color: green; } /* 红色移动圆点(car) */ .car { width: 20px; height: 20px; background-color: red; border-radius: 50%; position: absolute; top: 50%; transform: translate(-50%, -50%); transition: left 1s linear; z-index: 2; } </style> </head> <body> <div class="outer-container"> <div class="progress-track"> <!-- 检查点 + 分段线条 交替排列 --> <div class="checkpoint reached"></div> <div class="progress-segment"></div> <div class="checkpoint"></div> <div class="progress-segment"></div> <div class="checkpoint"></div> <div class="progress-segment"></div> <div class="checkpoint"></div> <div class="progress-segment"></div> <div class="checkpoint"></div> <div class="car"></div> </div> </div> <script> const car = document.querySelector('.car'); const checkpoints = document.querySelectorAll('.checkpoint'); const segments = document.querySelectorAll('.progress-segment'); let currentIndex = 0; // 初始化:设置第一个检查点为已到达,car定位到第一个检查点 car.style.left = `${checkpoints[currentIndex].offsetLeft}px`; function moveCarToNext() { if (currentIndex < checkpoints.length - 1) { // 标记当前检查点为已通过 checkpoints[currentIndex].classList.remove('reached'); checkpoints[currentIndex].classList.add('passed'); // 标记当前分段线条为已完成 segments[currentIndex].classList.add('completed'); currentIndex++; // 标记下一个检查点为已到达 checkpoints[currentIndex].classList.add('reached'); // 移动car到下一个检查点位置 car.style.left = `${checkpoints[currentIndex].offsetLeft}px`; } else { // 最后一个检查点标记为已通过 checkpoints[currentIndex].classList.remove('reached'); checkpoints[currentIndex].classList.add('passed'); } } // 模拟进度:每2秒移动一次 setInterval(moveCarToNext, 2000); </script> </body> </html>
关键改动说明:
- 结构重构:用
progress-track作为flex容器,交替放置checkpoint和progress-segment,让线条和检查点自动排列,实现视觉分离。 - 状态独立控制:每个分段线条和检查点都有独立的状态类,未完成的线条是灰色,已完成的变为绿色;检查点根据状态显示不同颜色。
- 精准定位:红色圆点通过获取检查点的
offsetLeft值定位,确保移动位置准确,同时用transform: translate(-50%, -50%)让圆点中心对准检查点。 - 过渡动画:给线条和检查点的状态切换添加过渡效果,让视觉变化更平滑。
内容的提问来源于stack exchange,提问作者the_yaz2000
相关产品推荐
相关产品推荐

