heroedge.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. (function () {
  2. var DUR = 900;
  3. var AUTO_DELAY = 5500;
  4. var slides = Array.from(document.querySelectorAll('.hs-slide'));
  5. var dots = Array.from(document.querySelectorAll('.hs-dot'));
  6. var prevBtn = document.getElementById('hsArr-prev');
  7. var nextBtn = document.getElementById('hsArr-next');
  8. var numEl = document.getElementById('hsNum');
  9. var current = 0;
  10. var animating = false;
  11. var autoTimer = null;
  12. var rafId = null;
  13. var progStart = null;
  14. /* ── Progress bar ──────────────────────────── */
  15. function startProgress() {
  16. cancelAnimationFrame(rafId);
  17. progStart = null;
  18. rafId = requestAnimationFrame(tick);
  19. }
  20. function tick(now) {
  21. if (!progStart) progStart = now;
  22. var t = Math.min((now - progStart) / AUTO_DELAY, 1);
  23. if (t < 1) rafId = requestAnimationFrame(tick);
  24. }
  25. /* ── Slide transition ──────────────────────── */
  26. function goTo(next) {
  27. if (animating || next === current) return;
  28. animating = true;
  29. var leaving = slides[current];
  30. var entering = slides[next];
  31. leaving.classList.add('is-leaving');
  32. leaving.classList.remove('is-active');
  33. entering.classList.add('is-entering');
  34. dots[current].classList.remove('is-active');
  35. dots[next].classList.add('is-active');
  36. // Actualizar contador numérico del nav
  37. numEl.textContent = (next + 1) + '';
  38. var padded = next + 1 < 10 ? '0' + (next + 1) : '' + (next + 1);
  39. entering.querySelector('.hs-index').textContent = padded;
  40. setTimeout(function () {
  41. leaving.classList.remove('is-leaving');
  42. entering.classList.remove('is-entering');
  43. entering.classList.add('is-active');
  44. current = next;
  45. animating = false;
  46. startProgress();
  47. }, DUR);
  48. }
  49. /* ── Auto advance ──────────────────────────── */
  50. function advance(dir) {
  51. clearTimeout(autoTimer);
  52. cancelAnimationFrame(rafId);
  53. goTo((current + dir + slides.length) % slides.length);
  54. schedule();
  55. }
  56. function schedule() {
  57. clearTimeout(autoTimer);
  58. autoTimer = setTimeout(function () {
  59. advance(1);
  60. }, AUTO_DELAY);
  61. }
  62. /* ── Events ────────────────────────────────── */
  63. nextBtn.addEventListener('click', function () { advance(1); });
  64. prevBtn.addEventListener('click', function () { advance(-1); });
  65. dots.forEach(function (dot, i) {
  66. dot.addEventListener('click', function () {
  67. if (i === current) return;
  68. clearTimeout(autoTimer);
  69. cancelAnimationFrame(rafId);
  70. goTo(i);
  71. schedule();
  72. });
  73. });
  74. document.addEventListener('keydown', function (e) {
  75. if (e.key === 'ArrowRight') advance(1);
  76. if (e.key === 'ArrowLeft') advance(-1);
  77. });
  78. /* ── Init ──────────────────────────────────── */
  79. schedule();
  80. startProgress();
  81. })();