Los progress steps (o pasos de progreso), son un patrón de interfaz muy usado para guiar al usuario a través de procesos largos divididos en etapas, ofreciendo a la vez orientación, retroalimentación y control.
En este blog encontrarás cómo realizar este visual utilizando HTML, CSS y JavaScript, con la estructura en archivos individuales y una versión embebible para que puedas adaptarlo a tus necesidades: colores, número de pasos, etiquetas, interacción y accesibilidad.
1) Index.hmtl
Es el esqueleto del componente. Define la estructura y el contenido visibles del “progress steps”: el contenedor de la barra, los pasos (círculos) y los botones para avanzar/retroceder. Su código es el siguiente:
Funcionamiento
- Cabecera (<head>): configura el documento (<!doctype html>, idioma, charset, viewport) y vincula los estilos con <link rel="stylesheet" href="styles.css">.
- Contenedor principal (<main class="wrap">): agrupador visual y semántico del contenido; dentro va el título <h1>Progreso</h1>.
- Módulo de progreso
- progress-container: agrupa el visual y añade aria-label para accesibilidad.
- #progress: la barra cuyo width actualizará el JS.
- .circle: cada paso; el primero inicia con .active.
- Acciones(botones): Botones para retroceder/avanzar; “Anterior” inicia deshabilitado.
2) Script.js
Se encarga del comportamiento del componente. Mantiene el estado del paso actual (current), actualiza la interfaz (activa/desactiva círculos, ajusta el ancho de la barra de progreso) y controla la navegación con los botones Anterior/Siguiente. Su código es el siguiente:
Funcionamiento
script.js selecciona los elementos del DOM (#progress, todos los .circle, y los botones #prev/#next) y mantiene un estado llamado current que indica el paso activo. La función update() es el corazón:
-
marca como active los círculos con índice menor a current,
-
calcula el ancho de la barra con la fórmula ((current - 1)/(totalPasos - 1))*100 y lo asigna a style.width,
-
habilita/deshabilita los botones según si estás en el primer o último paso.
Luego, añade event listeners a los botones: “Siguiente” aumenta current (hasta el total), “Anterior” lo disminuye (hasta 1) y siempre llama a update() para refrescar la UI. Por último, ejecuta update() una vez al cargar para mostrar el estado inicial.
3) style.css
Define la presentación visual del componente. Controla la paleta de colores, tipografías, tamaños, la línea base del progreso, la barra que crece y los estados de cada círculo (normal/activo). También estiliza los botones y asegura que la barra no “tape” los números usando capas (z-index) y isolation:isolate. Su código es el siguiente:
Funcionamiento
- Tema: variables en :root (--accent, --line, --radius, etc.) para color y tamaños.
- Layout demo: body y .wrap solo dan fondo/tarjeta; no afectan la lógica.
- Contenedor: .progress-container con flex reparte los pasos; isolation:isolate evita que la barra tape los números.
- Línea base: ::before dibuja la pista (detrás) con z-index:0.
- Barra de progreso: .progress es la franja que crece; el JS cambia width; aquí controlas color y transition.
- Pasos: .circle define tamaño/borde; .circle.active cambia a color de acento y resalta.
- Botones: estilos visuales para #prev/#next (hover/disabled).
- Responsivo: media query reduce tamaño de .circle en móvil.
Alternativa código compacto
Si prefieres probarlo en un solo archivo, aquí tienes el código compacto: es exactamente la misma lógica y estilos de los tres archivos (HTML, CSS y JS), solo reorganizado dentro de un único documento para copiar y ejecutar al instante:
Resultado final
¡Y listo! Con esto en mano podrás implementar el visual de pasos de progreso donde lo necesites: ajustar colores, sumar etapas, añadir etiquetas o integrarlo en cualquier flujo (registro, checkout, onboarding). Solo adapta el HTML, personaliza el CSS y conecta el JS… ¡y a producir!
Progress steps