Действия

MediaWiki

Common.js: различия между версиями

Материал из ВикиВоины

(Отмена правки 407903, сделанной Laurent Nautilus (обсуждение))
Метка: отмена
 
Строка 101: Строка 101:
 
     }
 
     }
 
   }
 
   }
 +
  var contentLinks = $('.side-nav a'); // Получаем ссылки на элементы списка содержания
 +
  var headerOffsets = []; // Массив для хранения верхних отступов заголовков
 +
 +
  // Заполняем массив верхними отступами заголовков
 +
  $(':header').each(function() {
 +
    headerOffsets.push($(this).offset().top);
 +
  });
 +
 +
  // Функция обновления активного элемента списка содержания
 +
  function updateActiveContentLink() {
 +
    var scrollTop = $(window).scrollTop();
 +
 +
    // Находим индекс текущего заголовка, который находится выше, чем положение прокрутки
 +
    var currentIndex = headerOffsets.findIndex(function(offset) {
 +
      return offset > scrollTop;
 +
    });
 +
 +
    // Если текущий индекс равен -1, значит, пользователь находится в самом низу страницы
 +
    // и активный элемент списка содержания должен быть последним
 +
    if (currentIndex === -1) {
 +
      currentIndex = headerOffsets.length - 1;
 +
    } else if (currentIndex > 0) {
 +
      // Если текущий индекс больше 0, уменьшаем его на 1, чтобы получить индекс предыдущего заголовка
 +
      currentIndex -= 1;
 +
    }
 +
 +
    // Удаляем класс active у всех элементов списка содержания
 +
    contentLinks.removeClass('active');
 +
 +
    // Добавляем класс active к текущему активному элементу списка содержания
 +
    contentLinks.eq(currentIndex).addClass('active');
 +
  }
 +
 +
  // Вызываем функцию обновления активного элемента при прокрутке страницы
 +
  $(window).scroll(updateActiveContentLink);
 +
 
 
});
 
});

Версия 21:15, 4 мая 2024

$(document).ready(function() {
function createContentsList($list, $parentItem) {
  $list.children('li').each(function() {
    var $listItem = $(this);
    var classes = $listItem.attr('class').split(' ');
    var tocLevel = classes.find(function(cls) {
      return cls.startsWith('toclevel-');
    });

    if (tocLevel) {
      var $sectionLink = $listItem.children('a').first();
      var sectionTitle = $sectionLink.find('.toctext').text().trim();
      var listItem = $('<li></li>');
      var sectionLink = $('').text(sectionTitle);
      sectionLink.attr('href', $sectionLink.attr('href'));
      listItem.append(sectionLink);

      var $subList = $listItem.children('ul').first();
      if ($subList.length) {
        var subLinkList = $('<ul class="side-nav"></ul>');
        listItem.append(subLinkList);
        createContentsList($subList, subLinkList);
      }

      $parentItem.append(listItem);
    }
  });
}

  if ($(window).width() < 640) {
    var contents = $('<div class="contents-overlay"></div>').hide();
    var sideNav = $('<ul class="side-nav"></ul>');
    var contentsItemWrap = $('<div class="contents-item-wrap"></div>');
    var contentsItemWrapFirst = $('<li></li>');
    var label = $('<label class="sidebar" id="p-tb">Содержание</label>');

    label.appendTo(contentsItemWrapFirst);
    contentsItemWrapFirst.appendTo(sideNav);
    sideNav.appendTo(contents);
    contentsItemWrap.appendTo(sideNav);
    contents.appendTo('.inner-wrap');

    createContentsList($('#toc > ul'), contentsItemWrap);

    var closeButton = $('<button class="close-button"><i class="fa fa-times"></i></button>');
    contents.append(closeButton);

    var isContentsOpen = false; 

    $('.content-button').on('click touchstart', function(e) {
      e.preventDefault();
      contents.toggle();
      updateIconColor();
    });

    $('.close-button').on('click touchstart', function(e) {
      e.preventDefault();
      contents.hide();
      updateIconColor();
    });

    function updateIconColor() {
      var isVisible = contents.is(':visible');
      $('.fa-list-ul').css('color', isVisible ? '#511414' : '');
    }
  } else {
    if ($('#toc').length) {
      var contents = $('<div class="contents side-nav"></div>');
      var isFixed = false;
      var activeSection = null; 

      var linkList = $('<ul class="side-nav"></ul>');
      contents.append(linkList);

      var contentLabel = $('<label class="sidebar" id="p-tb">Содержание</label>');
      var contentListItem = $('<li></li>');
      contentListItem.append(contentLabel);
      linkList.append(contentListItem);

      createContentsList($('#toc > ul'), linkList);

      if (linkList.children().length > 1) {
        $('#sidebar:last').append(contents);
      }

      var sidebarTop = $('.sidebar:last').offset().top;
      var contentsTop = contents.offset().top;
      var windowHeight = $(window).height();

      $(window).scroll(function() {
        var scrollTop = $(window).scrollTop();

        if (scrollTop > sidebarTop && scrollTop > contentsTop && !isFixed) {
          contents.addClass('fixed'); 
          isFixed = true;
        } else if ((scrollTop <= sidebarTop || scrollTop <= contentsTop) && isFixed) {
          contents.removeClass('fixed'); 
          isFixed = false;
        }
      });
    }
  }
  var contentLinks = $('.side-nav a'); // Получаем ссылки на элементы списка содержания
  var headerOffsets = []; // Массив для хранения верхних отступов заголовков

  // Заполняем массив верхними отступами заголовков
  $(':header').each(function() {
    headerOffsets.push($(this).offset().top);
  });

  // Функция обновления активного элемента списка содержания
  function updateActiveContentLink() {
    var scrollTop = $(window).scrollTop();

    // Находим индекс текущего заголовка, который находится выше, чем положение прокрутки
    var currentIndex = headerOffsets.findIndex(function(offset) {
      return offset > scrollTop;
    });

    // Если текущий индекс равен -1, значит, пользователь находится в самом низу страницы
    // и активный элемент списка содержания должен быть последним
    if (currentIndex === -1) {
      currentIndex = headerOffsets.length - 1;
    } else if (currentIndex > 0) {
      // Если текущий индекс больше 0, уменьшаем его на 1, чтобы получить индекс предыдущего заголовка
      currentIndex -= 1;
    }

    // Удаляем класс active у всех элементов списка содержания
    contentLinks.removeClass('active');

    // Добавляем класс active к текущему активному элементу списка содержания
    contentLinks.eq(currentIndex).addClass('active');
  }

  // Вызываем функцию обновления активного элемента при прокрутке страницы
  $(window).scroll(updateActiveContentLink);
  
});