Stepper de progreso horizontal con CSS usando Flexbox y pseudo-elementos, totalmente responsive y personalizable para interfaces multi-step.
/*
Stepper de progreso con Flexbox y pseudo-elementos
- Círculos numerados para cada paso
- Líneas de conexión entre pasos
- Estados: completado, actual, futuro
- Responsive y personalizable mediante variables CSS
*/
:root {
/* Variables para colores y tamaños */
--stepper-circle-size: 30px;
--stepper-line-height: 4px;
--color-completed: #4caf50; /* verde para completado */
--color-current: #2196f3; /* azul para paso actual */
--color-future: #cccccc; /* gris para pasos futuros */
--color-text: #333333;
--font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.stepper {
display: flex;
justify-content: space-between;
list-style: none;
padding: 0;
margin: 20px 0;
font-family: var(--font-family);
}
.stepper li {
position: relative;
flex: 1;
text-align: center;
color: var(--color-future);
cursor: default;
}
/* Círculo numerado o icono del paso */
.stepper li::before {
content: counter(step-counter);
counter-increment: step-counter;
width: var(--stepper-circle-size);
height: var(--stepper-circle-size);
line-height: var(--stepper-circle-size);
border-radius: 50%;
background-color: var(--color-future);
color: white;
display: block;
margin: 0 auto 10px auto;
font-weight: bold;
font-size: 1rem;
box-shadow: 0 0 3px rgba(0,0,0,0.2);
transition: background-color 0.3s ease, color 0.3s ease;
}
/* Línea de conexión entre pasos (excepto último) */
.stepper li::after {
content: '';
position: absolute;
top: calc(var(--stepper-circle-size) / 2 - var(--stepper-line-height) / 2);
left: 50%;
width: 100%;
height: var(--stepper-line-height);
background-color: var(--color-future);
z-index: -1;
transition: background-color 0.3s ease;
}
/* Quita la línea del último paso */
.stepper li:last-child::after {
content: none;
}
/* Estado completado */
.stepper li.completed {
color: var(--color-completed);
cursor: pointer;
}
.stepper li.completed::before {
background-color: var(--color-completed);
content: '\2713'; /* marca de verificación */
font-size: 1.2rem;
}
.stepper li.completed::after {
background-color: var(--color-completed);
}
/* Estado actual */
.stepper li.current {
color: var(--color-current);
font-weight: bold;
}
.stepper li.current::before {
background-color: var(--color-current);
content: counter(step-counter);
}
.stepper li.current::after {
background-color: var(--color-future);
}
/* Reinicia el contador para numerar los pasos */
ul.stepper {
counter-reset: step-counter;
}
/* Texto descriptivo debajo del círculo */
.stepper li span {
display: block;
font-size: 0.85rem;
margin-top: 5px;
user-select: none;
}
/* Responsive: reduce tamaños en pantallas pequeñas */
@media (max-width: 480px) {
:root {
--stepper-circle-size: 24px;
--stepper-line-height: 3px;
}
.stepper li::before {
font-size: 0.85rem;
line-height: var(--stepper-circle-size);
}
.stepper li span {
font-size: 0.75rem;
}
}
/* Ejemplo HTML para usar con este CSS:
<ul class="stepper">
<li class="completed"><span>Login</span></li>
<li class="completed"><span>Dirección</span></li>
<li class="current"><span>Pago</span></li>
<li><span>Confirmar</span></li>
</ul>
*/HTML: estructura básica con elementos <ul> y <li> para los pasos
CSS: uso de Flexbox para layout horizontal
CSS: pseudo-elementos ::before y ::after para círculos y líneas de conexión
CSS: clases .completed, .current y por defecto para gestionar estados de pasos
Configuración: variables CSS para colores y tamaños
Software: sin dependencias externas, solo CSS puro
Arduino: no aplicable en este contexto