#javascript #jquery
#javascript #jquery
Вопрос:
Я пытаюсь изменить мои ссылки в моем фиксированном заголовке при прокрутке.
Кажется, что код работает, если вы обновляете страницу, например Если вы перейдете к разделу C, обновите страницу и прокрутите, она распознает, что вы находитесь в этом разделе, но по какой-то причине, похоже, это не выполняется динамически во время прокрутки.
https://jsfiddle.net/Lr53c1oh/1/
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style media="screen">
body, html {
padding: 0;
margin: 0;
height: 100%;
}
nav {
position: fixed;
top: 0;
width: 100%;
background: #f5f5f5;
text-align: center;
}
nav ul {
list-style: none;
display: inline-block;
}
nav ul li {
display: inline-block;
padding-right: 10px;
}
section {
height: 100%;
padding: 8rem;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
}
.sectionA {
background: orangered;
}
.sectionB {
background: steelblue;
}
.sectionC {
background: purple;
}
.sectionD {
background: black;
}
.active {
color: red;
}
</style>
</head>
<body>
<nav>
<ul>
<li class="sectionA-marker">Section A</li>
<li class="sectionB-marker">Section B</li>
<li class="sectionC-marker">Section C</li>
<li class="sectionD-marker">Section D</li>
</ul>
</nav>
<section class="sectionA">
<h2>Section A</h2>
</section>
<section class="sectionB">
<h2>Section B</h2>
</section>
<section class="sectionC">
<h2>Section C</h2>
</section>
<section class="sectionD">
<h2>Section D</h2>
</section>
</body>
<script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
<script type="text/javascript">
(function(){
var scrollTop = $(document).scrollTop();
var navHeight = $("nav").height();
var sectionElement = $("section");
$(document).on("scroll", function(){
sectionElement.each(function(){
var section = $(this);
if( section.offset().top < (scrollTop navHeight) amp;amp; (scrollTop navHeight) < (section.offset().top section.outerHeight()) ) {
var targetClass = "." section.attr("class") "-marker";
$("nav ul li").removeClass("active");
$(targetClass).addClass("active");
}
});
});
}());
</script>
</html>
Ответ №1:
Вот исправленная скрипка
https://jsfiddle.net/Lr53c1oh/3/
вам нужно получать текущее значение scrollTop каждый раз в событии прокрутки
$(document).on("scroll", function(){
var scrollTop = $(document).scrollTop();
//rest of the code
Ответ №2:
Отредактировано
Извините, мой первый ответ был довольно ленивым;
Проблема возникает из-за того, что вы пытаетесь сравнить верхнюю часть каждого раздела не с текущей позицией экрана, а с позицией, которую вы получаете при загрузке страницы.
Итак, событие должно быть похоже:
$(document).on("scroll", function(){
// get new value of scrollTop after each event call
scrollTop = $(document).scrollTop();
sectionElement.each(function(){
var section = $(this);
if( section.offset().top < (scrollTop navHeight) amp;amp; (scrollTop navHeight) < (section.offset().top section.outerHeight()) ) {
var targetClass = "." section.attr("class") "-marker";
$("nav ul li").removeClass("active");
$(targetClass).addClass("active");
}
});
});
Комментарии:
1. Спасибо за ссылку, но я бы хотел иметь возможность делать это и самостоятельно 🙂