Как изменить активный класс меню при прокрутке страницы с использованием идентификатора - PullRequest
1 голос
/ 07 февраля 2020

Я сделал пользовательское меню в стиле параллакса. Меню зафиксировано сверху, и я хочу изменить активный класс для меню при прокрутке страницы. Я сделал это с помощью функции щелчка, поэтому, щелкая меню, активный класс меняется на это конкретное меню. Я создал это меню с идентификатором, а не 'href = "# home"'. Большая часть кода, который я нахожу, выполняется с помощью href = "#" и nav. Я не хочу, чтобы меню было с Nav Navbar. Так можно ли это сделать по id?

Мои коды ниже

  $("#home-btn").on('click',function() {
		$('html, body').animate({
			scrollTop : $("#home").offset().top - 10
		}, 1000);
		$('.main-menu ul li').removeClass('active');
		$('#home-btn').parent().addClass('active');
	});
	
	$("#service-btn").on('click',function() {
		$('html, body').animate({
			scrollTop : $("#service").offset().top - 45
		}, 1000);
		$('.main-menu ul li').removeClass('active');
		$('#service-btn').parent().addClass('active');
	});
	
	$("#about-btn").on('click',function() {
		$('html, body').animate({
			scrollTop : $("#about").offset().top - 120
		}, 1000);
		$('.main-menu ul li').removeClass('active');
		$('#about-btn').parent().addClass('active');
	});
	
	$("#contact-btn").on('click',function() {
		$('html, body').animate({
			scrollTop : $("#contact").offset().top - 120
		}, 2000);
		$('.main-menu ul li').removeClass('active');
		$('#contact-btn').parent().addClass('active');
	});
.top-adj {
  margin-top: 130px;
}

.main-menu {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  background: #f1f1f1;
}

.main-menu ul {
	display: flex;
	align-items: center;
	justify-content: space-between;
}

.main-menu ul li {
	display: block;
	font-weight: 600;
	margin-left: 25px;
}

.main-menu ul li:first-child {
	margin-left: 0px;
}

.main-menu ul li a {
	color: #000;
	display: block;
	cursor: pointer;
	padding: 25px 10px;
	position: relative;
	border-bottom: 4px solid;
	border-color: transparent;
}

.main-menu ul li a:hover {
	text-decoration: none;
}

.main-menu ul li.active a {
	padding: 25px 10px;
	border-bottom: 4px solid #104377;
}

.section {
  width: 100%;
  height: 100vh;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
 <div class="main-menu">
   <ul>
       <li class="active"><a id="home-btn">Home</a></li>
         <li><a id="service-btn">Services</a></li>
         <li><a id="about-btn">About</a></li>
         <li><a id="contact-btn">Contact</a></li>
    </ul>
 </div>

<div class="top-adj"></div>
<div class="section" id="home">Home</div>
<div class="section" id="service">Service</div>
<div class="section" id="about">About</div>
<div class="section" id="contact">Contact</div>

1 Ответ

2 голосов
/ 07 февраля 2020

Здесь мы выбрали все элементы, используя querySelectorAll метод Ванили JavaScript.

. Вы можете получить больше информации о функции Array.prototype.forEach.call() здесь .

Мы использовали событие window.onscroll для выполнения нашего шпиона прокрутки, в котором мы сопоставили верхнее смещение каждого раздела с позицией прокрутки windows и добавили класс на его основе.

(function () {
  var section = document.querySelectorAll(".section");
  var sections = {};
  var i = 0;

  Array.prototype.forEach.call(section, function (e) {
      sections[e.id] = e.offsetTop;
  });

  window.onscroll = function () {
      var scrollPosition = document.documentElement.scrollTop ||
          document.body.scrollTop;

      for (i in sections) {
          if (sections[i] <= scrollPosition) {
              document.querySelector('.active').setAttribute('class', ' ');
              document.querySelector('a[id*=' + i +
                  ']').parentElement.setAttribute('class', 'active');
          }
      }
  };

  // Your code
  $("#home-btn").on('click', function () {
      $('html, body').animate({
          scrollTop: $("#home").offset().top
      }, 1000);
  });

  $("#service-btn").on('click', function () {
      $('html, body').animate({
          scrollTop: $("#service").offset().top
      }, 1000);
  });

  $("#about-btn").on('click', function () {
      $('html, body').animate({
          scrollTop: $("#about").offset().top
      }, 1000);
  });

  $("#contact-btn").on('click', function () {
      $('html, body').animate({
          scrollTop: $("#contact").offset().top
      }, 2000);
  });
})();
.top-adj {
  margin-top: 130px;
}

.main-menu {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  background: #f1f1f1;
}

.main-menu ul {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.main-menu ul li {
  display: block;
  font-weight: 600;
  margin-left: 25px;
}

.main-menu ul li:first-child {
  margin-left: 0px;
}

.main-menu ul li a {
  color: #000;
  display: block;
  cursor: pointer;
  padding: 25px 10px;
  position: relative;
  border-bottom: 4px solid;
  border-color: transparent;
  text-decoration: none;
}

.main-menu ul li a:hover {
  text-decoration: none;
}

.main-menu ul li.active a {
  padding: 25px 10px;
  border-bottom: 4px solid #104377;
}

.section {
  width: 100%;
  height: 100vh;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="main-menu">
   <ul>
     <li class="active"><a id="home-btn">Home</a></li>
     <li><a id="service-btn">Services</a></li>
     <li><a id="about-btn">About</a></li>
     <li><a id="contact-btn">Contact</a></li>
    </ul>
 </div>

<div class="top-adj"></div>
<div class="section" id="home">Home</div>
<div class="section" id="service">Service</div>
<div class="section" id="about">About</div>
<div class="section" id="contact">Contact</div>

Надеюсь, это поможет.

...