1
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Spinners en Bootstrap 5</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light p-4">
<div class="container" style="max-width: 600px;">
<div class="card shadow-sm border-0 rounded-4 p-4 bg-white text-center">
<h4 class="fw-bold text-dark mb-3">Indicadores de Proceso Asíncrono</h4>
<!-- 1. Galería de Spinners Circulares -->
<div class="d-flex justify-content-center gap-3 mb-4">
<div class="spinner-border text-primary" role="status"></div>
<div class="spinner-border text-success" role="status"></div>
<div class="spinner-border text-danger" role="status"></div>
<div class="spinner-border text-warning" role="status"></div>
</div>
<!-- 2. Galería de Spinners Grow (Pulso) -->
<div class="d-flex justify-content-center gap-3 mb-4">
<div class="spinner-grow text-primary" role="status"></div>
<div class="spinner-grow text-info" role="status"></div>
<div class="spinner-grow text-dark" role="status"></div>
</div>
<!-- 3. Botón Interactivo con Estado de Carga -->
<div>
<button id="btnSincronizar" class="btn btn-primary px-4 py-2 rounded-pill fw-semibold shadow-sm" onclick="simularPeticion()">
<span id="spinnerIcon" class="spinner-border spinner-border-sm d-none" aria-hidden="true"></span>
<span id="btnText">Sincronizar con Kilopolis</span>
</button>
</div>
</div>
</div>
<script>
function simularPeticion() {
const btn = document.getElementById('btnSincronizar');
const spinner = document.getElementById('spinnerIcon');
const txt = document.getElementById('btnText');
// Activar estado de carga
btn.disabled = true;
spinner.classList.remove('d-none');
txt.textContent = " Conectando al servidor...";
// Simular retraso de red de 2 segundos
setTimeout(() => {
btn.disabled = false;
spinner.classList.add('d-none');
txt.textContent = "¡Sincronización Exitosa!";
btn.classList.replace('btn-primary', 'btn-success');
// Restaurar estado original tras 2.5 segundos
setTimeout(() => {
txt.textContent = "Sincronizar con Kilopolis";
btn.classList.replace('btn-success', 'btn-primary');
}, 2500);
}, 2000);
}
</script>
</body>
</html>
Haz clic para editar este código