Выделение активного якоря с половины высоты экрана

239
18 февраля 2022, 09:20

В данном примере выделение активного якоря активируется когда секция располагается по верхнему краю экрана. А как можно сделать, чтобы якорь активировался, когда верх секции достигал половины высоты экрана (в т.ч. от центра)? И еще один момент, при клике на якорь, когда мы передвигаемся, нажимая поочередно на якоря снизу вверх, якорь выделяется верно. Но если двигаться сверху вниз, то якорь активируется неверно. Как это исправить? Благодарю за помощь!

jQuery(window).scroll(function() { 
  var $sections = $('section'); 
  $sections.each(function(i, el) { 
    var top = $(el).offset().top - 0; 
    var bottom = top + $(el).height(); 
    var scroll = $(window).scrollTop(); 
    var id = $(el).attr('id'); 
    if (scroll > top && scroll < bottom) { 
      $('a.active').removeClass('active'); 
      $('a[href="#' + id + '"]').addClass('active'); 
 
    } 
  }) 
}); 
$("nav").on("click", "a", function(event) { 
  event.preventDefault(); 
  var id = $(this).attr('href'), 
    top = $(id).offset().top; 
  $('body,html').animate({ 
    scrollTop: top 
  }, 800); 
});
ul, 
li { 
  list-style-type: none; 
  margin: 0; 
  padding: 0; 
} 
 
a { 
  text-decoration: none; 
  display: block; 
  padding: 20px 5px 5px 20px; 
} 
 
.menu { 
  position: fixed; 
  top: 0; 
  left: 0; 
} 
 
.section { 
  width: 100%; 
  height: 100vh; 
  padding: 0 0 0 50px; 
} 
 
.active { 
  color: white; 
  background: red; 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<nav> 
  <ul id="menu" class="menu"> 
    <li><a href="#sec1" class="scroll-to">1</a></li> 
    <li><a href="#sec2" class="scroll-to">2</a></li> 
    <li><a href="#sec3" class="scroll-to">3</a></li> 
    <li><a href="#sec4" class="scroll-to">4</a></li> 
    <li><a href="#sec5" class="scroll-to">5</a></li> 
  </ul> 
</nav> 
<section id="sec1" class="section">Секция 1</section> 
<section id="sec2" class="section">Секция 2</section> 
<section id="sec3" class="section">Секция 3</section> 
<section id="sec4" class="section">Секция 4</section> 
<section id="sec5" class="section">Секция 5</section>

Answer 1

var $sections = $('section'); 
var section_position = {}; //тут храним все верхние точки наших section 
var screen_height = $(window).height(); //высота видимой страницы 
 
checkPosition(); 
 
$(window).resize(function(){ 
  checkPosition(); 
}); 
 
function checkPosition(){ 
  screen_height = $(window).height(); 
 
  $sections.each(function(i, el) { 
    section_position[i] = $(el).offset().top - 0; 
  }); 
} 
 
function toggleActiveClass(id) { 
  $('a.active').removeClass('active'); 
  $('a[href="#' + id + '"]').addClass('active'); 
} 
 
$(window).scroll(function() { 
  var s_top = $(document).scrollTop() + screen_height / 2; 
 
  for (key in section_position) { 
 
    if (s_top >= section_position[key] || s_top <= section_position[key + 1]) { 
      var id = $($sections[key]).attr('id'); 
      toggleActiveClass(id); 
    } 
 
  }; 
 
}); 
 
$("nav").on("click", "a", function(event) { 
  event.preventDefault(); 
  id = $(this).attr('href'); 
  var top = $(id).offset().top; 
  $('body,html').animate({ 
    scrollTop: top 
  }, 800); 
});
ul, 
li { 
  list-style-type: none; 
  margin: 0; 
  padding: 0; 
} 
 
a { 
  text-decoration: none; 
  display: block; 
  padding: 20px 5px 5px 20px; 
} 
 
.menu { 
  position: fixed; 
  top: 0; 
  left: 0; 
} 
 
.section { 
  width: 100%; 
  height: 100vh; 
  padding: 0 0 0 50px; 
} 
 
.active { 
  color: white; 
  background: red; 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<nav> 
  <ul id="menu" class="menu"> 
    <li><a href="#sec1" class="scroll-to">1</a></li> 
    <li><a href="#sec2" class="scroll-to">2</a></li> 
    <li><a href="#sec3" class="scroll-to">3</a></li> 
    <li><a href="#sec4" class="scroll-to">4</a></li> 
    <li><a href="#sec5" class="scroll-to">5</a></li> 
  </ul> 
</nav> 
<section id="sec1" class="section">Секция 1</section> 
<section id="sec2" class="section">Секция 2</section> 
<section id="sec3" class="section">Секция 3</section> 
<section id="sec4" class="section">Секция 4</section> 
<section id="sec5" class="section">Секция 5</section>

READ ALSO
Как сделать скрипт для поля пароля. JavaScript [закрыт]

Как сделать скрипт для поля пароля. JavaScript [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

152
Координаты мыши внутри div не зависимо от окна браузера

Координаты мыши внутри div не зависимо от окна браузера

Как можно узнать координаты курсора мыши, относительно div, а вернее внутри него? Потому что если использовать clientX/clientY или pageX/pageY, то стоит...

100
Привести в верхний регистр

Привести в верхний регистр

Существует некая строка, предположим "RqaEzty", которую требуется вывести в таком формате: "R-Qq-Aaa-Eeee-Zzzzz-Tttttt-Yyyyyyy" Код ниже выводит в таком: "R-qq-aaa-eeee-zzzzz-tttttt-yyyyyyy"...

89
Как обновлять значения в массиве?

Как обновлять значения в массиве?

Есть массив: img Есть два метода: 1getBlueImg 2

76