diff options
Diffstat (limited to 'src/js')
| -rw-r--r-- | src/js/even.js | 36 | 
1 files changed, 24 insertions, 12 deletions
| diff --git a/src/js/even.js b/src/js/even.js index 974346e..48db08c 100644 --- a/src/js/even.js +++ b/src/js/even.js @@ -88,23 +88,37 @@ Even._initToc = function () {    const HEADERFIX = 30    const $toclink = $('.toc-link')    const $headerlink = $('.headerlink') +  const $tocLinkLis = $('.post-toc-content li')    const headerlinkTop = $.map($headerlink, function (link) {      return $(link).offset().top    }) +  const headerLinksOffsetForSearch = $.map(headerlinkTop, function (offset) { +    return offset - HEADERFIX +  }) + +  const searchActiveTocIndex = function (array, target) { +    for (let i = 0; i < array.length - 1; i++) { +      if (target > array[i] && target <= array[i + 1]) return i +    } +    if (target > array[array.length - 1]) return array.length - 1 +    return -1 +  } +    $(window).scroll(function () {      const scrollTop = $(window).scrollTop() +    const activeTocIndex = searchActiveTocIndex(headerLinksOffsetForSearch, scrollTop) -    for (let i = 0; i < $toclink.length; i++) { -      const isLastOne = i + 1 === $toclink.length -      const currentTop = headerlinkTop[i] - HEADERFIX -      const nextTop = isLastOne ? Infinity : headerlinkTop[i + 1] - HEADERFIX +    $($toclink).removeClass('active') +    $($tocLinkLis).removeClass('has-active') -      if (currentTop < scrollTop && scrollTop <= nextTop) { -        $($toclink[i]).addClass('active') -      } else { -        $($toclink[i]).removeClass('active') +    if (activeTocIndex !== -1) { +      $($toclink[activeTocIndex]).addClass('active') +      let ancestor = $toclink[activeTocIndex].parentNode +      while (ancestor.tagName !== 'NAV') { +        $(ancestor).addClass('has-active') +        ancestor = ancestor.parentNode.parentNode        }      }    }) @@ -171,11 +185,9 @@ Even._refactorToc = function (toc) {    const oldTocList = toc.children[0]    let newTocList = oldTocList    let temp -  while (newTocList.children.length === 1 && (temp = newTocList.children[0].children[0]).tagName === 'UL') -    newTocList = temp +  while (newTocList.children.length === 1 && (temp = newTocList.children[0].children[0]).tagName === 'UL') newTocList = temp -  if (newTocList !== oldTocList) -    toc.replaceChild(newTocList, oldTocList) +  if (newTocList !== oldTocList) toc.replaceChild(newTocList, oldTocList)  }  Even._linkToc = function () { | 
