Listo (Ctrl + Enter para ejecutar) Bootcamp Fullstack »
index.html
Tab = 4 espacios
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
Vista Previa
Bootstrap 5.3 + Popper