Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.06.2018, 13:37
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

Активный пункт при прокрутке к якорю
Добрый день!
Подскажите, как правильно доработать функционал.

У меня есть скрипт, который добавляет активный пункт к ссылке в меню, но я не знаю как сделать так, чтобы он активировался и при скролле мимо якоря.

Скрипт
// добавляем активный пункт навигации
      $(".vertical a").click(function() {
        $(".active").removeClass("active");
        $(this).addClass("active");
      });


Меню
<div class="vnavbar">
      <nav class="vertical">
        <ul>
          <li><a href="#download" class="dot"><span>Download</span></a></li>
          <li><a href="#usage" class="dot"><span>Basic Usage</span></a></li>
          <li><a href="#gen_css" class="dot"><span>Setting preview</span></a></li>
          <li><a href="#css_gen" class="dot"><span>Min.css Gen</span></a></li>
          <li><a href="#gen" class="dot"><span>Box-shadow Gen</span></a></li>
        </ul>
      </nav>
    </div><!-- /vnavbar -->
Ответить с цитированием
  #2 (permalink)  
Старый 06.06.2018, 13:46
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

А как вы себе это представляете, когда одновременно все пункты меню находятся в области видимости (вьюпорт)? Прокрутка (скролл) на том и работает что относительно вьюпорта действует.
Ответить с цитированием
  #3 (permalink)  
Старый 06.06.2018, 13:58
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

Rise,
так есть же фиксированные бары. Только, как я понял, там контент делят на секции, где каждая секция = один экран. И при прокрутке активируется тот или иной пункт. В моем случае на экране может быть два пункта, но ведь расстояние между ними есть, пусть и не в 20, а в 4 небольших скролла колесиком.
Ответить с цитированием
  #4 (permalink)  
Старый 06.06.2018, 14:18
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Хорошо, такой вариант работал в свое время, но это так примитивный, наверное можно оптимизировать, да и там про футер)

Последний раз редактировалось Rise, 06.06.2018 в 14:26.
Ответить с цитированием
  #5 (permalink)  
Старый 06.06.2018, 15:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

при скролле, циклом проверять Math.abs(Element.getBoundingClientRect().top), у какого top меньше, ссылку на этот блок и "подсвечивать" , остальные ссылки "гасить".
Ответить с цитированием
  #6 (permalink)  
Старый 06.06.2018, 17:54
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

Сделал так, но все равно что-то не работает. https://jsfiddle.net/zew5ra7f/2/

Хотя на другом примере работает.
Ответить с цитированием
  #7 (permalink)  
Старый 06.06.2018, 18:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

madeas,
зачем тут parent?
if (lastId !== id) {
    lastId = id;
    menuItems
      .parent().removeClass("active")
      .end().filter("[href=#" + id + "]").parent().addClass("active");
  }


попробуйте так
if (lastId !== id) {
    lastId = id;
    menuItems.removeClass("active").filter("[href='#" + id + "']").addClass("active")
   }
Ответить с цитированием
  #8 (permalink)  
Старый 06.06.2018, 20:31
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

рони,
тогда получается, что и это тоже не нужно? Ну или не обязательно.
$(".vertical a").click(function() {
  $(".active").removeClass("active");
  $(this).addClass("active");
});
Ответить с цитированием
  #9 (permalink)  
Старый 06.06.2018, 20:41
Аватар для madeas
Профессор
Отправить личное сообщение для madeas Посмотреть профиль Найти все сообщения от madeas
 
Регистрация: 13.04.2018
Сообщений: 232

Ну да, все правильно, получается дублирование. рони, спасибо.
Ответить с цитированием
  #10 (permalink)  
Старый 06.06.2018, 20:46
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Сообщение от madeas
что и это тоже не нужно?
это вам решать ... есть вопрос: кликнули по 5 ссылке, но "активной" станет третья, если не хватит скролла?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Фиксирование и открепление вертикальной навигационной панели при прокрутке vettel jQuery 1 07.05.2015 18:39
Меню на дивах Golovastik (X)HTML/CSS 38 13.09.2010 09:10
Событие mouseout при наведении мыши на пункт меню WalterScott Events/DOM/Window 2 12.05.2009 22:05
Объект при загрузке страницы и после операций над ним fact jQuery 7 20.04.2009 22:02
Dojo может подгружать информацию из пунктов меню только при клике на выбранный пункт? vlad275 Dojo toolkit 0 30.10.2008 15:56