Как подсветить активную якорную ссылку?

Здравствуйте!

Есть якорная навигация на одностраничном сайте, нужно при прокрутке страницы до определенного элемента с якорем (например H1) изменить класс у соответствующей ссылки в навигации, например на .active, ну и соответственно чтобы при прокрутке до другого якоря, класс .active удалялся у предыдущей ссылки и назначался следующей.

Пока реализовано на JQuery только плавная прокрутка до соответствующего якоря, хотелось бы дополнить этот скрипт. Рабочий код на jsfiddle: jsfiddle.net/yvoys547
Спасибо!

Код навигации и блоков с якорями:
<nav class="nav">
      <li><a href="#first">First</a></li>
      <li><a href="#second">Second</a></li>
      <li><a href="#thirst">Thirst</a></li>
      <li><a href="#four">Four</a></li>
    </nav>

    <h1 id='first'>Заголовок First</h1>
    <p>...</p>

    <h1 id='second'>Заголовок Second</h1>
    <p>...</p>

    <h1 id='thirst'>Заголовок Thirst</h1>
    <p>...</p>

    <h1 id='four'>Заголовок Four</h1>
    <p>...</p>


Код плавной прокрутки
$(document).ready(function(){
    $(".nav").on("click","a", function (event) {
        // исключаем стандартную реакцию браузера
        event.preventDefault();
 
        // получем идентификатор блока из атрибута href
        var id  = $(this).attr('href'),
 
        // находим высоту, на которой расположен блок
            top = $(id).offset().top;
         
        // анимируем переход к блоку, время: 800 мс
        $('body,html').animate({scrollTop: top}, 800);
    });
});
  • Вопрос задан
  • 21323 просмотра
Решения вопроса 1
Предложу свой вариант (для точности переключения нужно поиграть со значениями top и bottom)
jsfiddle.net/bonilka/p7sgwg4L
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
creativeworm
@creativeworm
function scroll_active() {

        /* вычисляем значения прокрутки страницы по вертикали */

        var window_top = $(window).scrollTop();

        /* вычисляем положение якорей на странице от начала страницы  по вертикали*/

        var menu_top = $('a[name="menu"]').offset().top -10;

        var gallery_top = $('a[name="gallery"]').offset().top -10;

        /* раздел «Контакты»  у меня на странице расположен самым последним разделом, и небольшой, поэтому если контаты уже отобразались на странице, тогда  активирую пункт меню «Контакты»  */

        var contacts_top = $('a[name="contacts"]').offset().top -  $(window).height() + 180;

        /* Переключатель активного пункта меню в зависимости от положения на странице, условии написаны от последнего якоря на странице, до первого */

        /* если на экране отображаются раздел «Контакты»*/

        if (window_top > contacts_top) {

                $(".main_menu li").removeClass("active");

                $('a[href="#contacts"]').parent().addClass("active");

                }

        /* если не отображается раздел «Контакты», но страницу прокрутили  ниже якоря третьего раздела*/

        else if (window_top > gallery_top) {

                $(".main_menu li").removeClass("active");

                $('a[href="#gallery"]').parent().addClass("active");

                }

        /* если выше третьего, но ниже якоря второго раздела*/

        else if (window_top > menu_top) {

                $(".main_menu li").removeClass("active");

                $('a[href="#menu"]').parent().addClass("active");

                }

        /* если не подходят условия предыдущие активируем первый пункт меню*/

        else {

                $(".main_menu li").removeClass("active");

                $('a[href="#page_top"]').parent().addClass("active");

                }

}

jQuery(function()

{

        jQuery(window).scroll(scroll_active);

});
Ответ написан
@yavasilek
Можно подсветить не изменяя классы, а через псевдокласс :target
Для Вашего примера необходимо добавить следующее
h1:target{
/*тут стиль для подсвечивания*/
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы