home.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /**
  2. * 轮播图
  3. */
  4. document.addEventListener('DOMContentLoaded', function() {
  5. // 轮播图功能实现
  6. const slides = document.querySelectorAll('.carousel-slide');
  7. const prevButton = document.querySelector('.carousel-control.prev');
  8. const nextButton = document.querySelector('.carousel-control.next');
  9. const carouselContainer = document.querySelector('#banner-carousel');
  10. let currentSlide = 0;
  11. let interval;
  12. // 检测是否为移动设备
  13. const isMobile = window.matchMedia('(max-width: 768px)').matches;
  14. // 触摸事件变量
  15. let touchStartX = 0;
  16. let touchEndX = 0;
  17. let touchStartY = 0;
  18. let touchEndY = 0;
  19. // 显示指定幻灯片
  20. function showSlide(index) {
  21. // 隐藏所有幻灯片
  22. slides.forEach(slide => {
  23. slide.style.opacity = 0;
  24. slide.style.zIndex = 0;
  25. });
  26. // 显示当前幻灯片
  27. slides[index].style.opacity = 1;
  28. slides[index].style.zIndex = 1;
  29. currentSlide = index;
  30. }
  31. // 下一张幻灯片
  32. function nextSlide() {
  33. let next = currentSlide + 1;
  34. if (next >= slides.length) {
  35. next = 0;
  36. }
  37. showSlide(next);
  38. }
  39. // 上一张幻灯片
  40. function prevSlide() {
  41. let prev = currentSlide - 1;
  42. if (prev < 0) {
  43. prev = slides.length - 1;
  44. }
  45. showSlide(prev);
  46. }
  47. // 自动轮播
  48. function startAutoSlide() {
  49. interval = setInterval(nextSlide, 5000); // 5秒切换一次
  50. }
  51. // 停止自动轮播
  52. function stopAutoSlide() {
  53. clearInterval(interval);
  54. }
  55. // 显示控制按钮(仅桌面版)
  56. function showControls() {
  57. if (!isMobile) {
  58. prevButton.style.opacity = "1";
  59. nextButton.style.opacity = "1";
  60. }
  61. }
  62. // 隐藏控制按钮(仅桌面版)
  63. function hideControls() {
  64. if (!isMobile) {
  65. prevButton.style.opacity = "0";
  66. nextButton.style.opacity = "0";
  67. }
  68. }
  69. // 初始化显示第一张幻灯片
  70. showSlide(0);
  71. // 开始自动轮播
  72. startAutoSlide();
  73. // 点击上一张按钮
  74. prevButton.addEventListener('click', function(e) {
  75. e.stopPropagation(); // 防止事件冒泡
  76. stopAutoSlide();
  77. prevSlide();
  78. startAutoSlide();
  79. });
  80. // 点击下一张按钮
  81. nextButton.addEventListener('click', function(e) {
  82. e.stopPropagation(); // 防止事件冒泡
  83. stopAutoSlide();
  84. nextSlide();
  85. startAutoSlide();
  86. });
  87. // 桌面端鼠标悬停事件
  88. if (!isMobile) {
  89. // 鼠标悬停在轮播图上时停止自动轮播并显示控制按钮
  90. carouselContainer.addEventListener('mouseenter', function() {
  91. stopAutoSlide();
  92. showControls();
  93. });
  94. // 鼠标离开轮播图时恢复自动轮播并隐藏控制按钮
  95. carouselContainer.addEventListener('mouseleave', function() {
  96. startAutoSlide();
  97. hideControls();
  98. });
  99. }
  100. // 移动端触摸事件支持
  101. carouselContainer.addEventListener('touchstart', function(e) {
  102. stopAutoSlide();
  103. touchStartX = e.changedTouches[0].screenX;
  104. touchStartY = e.changedTouches[0].screenY;
  105. }, { passive: true });
  106. carouselContainer.addEventListener('touchend', function(e) {
  107. touchEndX = e.changedTouches[0].screenX;
  108. touchEndY = e.changedTouches[0].screenY;
  109. handleSwipe();
  110. startAutoSlide();
  111. }, { passive: true });
  112. // 处理滑动手势
  113. function handleSwipe() {
  114. const xDiff = touchEndX - touchStartX;
  115. const yDiff = touchEndY - touchStartY;
  116. // 确保是水平滑动而不是垂直滚动
  117. if (Math.abs(xDiff) > Math.abs(yDiff) && Math.abs(xDiff) > 50) {
  118. if (xDiff > 0) {
  119. // 右滑 - 上一张
  120. prevSlide();
  121. } else {
  122. // 左滑 - 下一张
  123. nextSlide();
  124. }
  125. }
  126. }
  127. });