From 084bcbe6bfbdae6b3e4135bb00a49f45d9ebc68a Mon Sep 17 00:00:00 2001 From: fargelus Date: Tue, 1 Feb 2022 10:12:51 +0300 Subject: [PATCH 1/3] Highlighting sidebar links --- js/book.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/js/book.js b/js/book.js index e9fd6a9..f12fb22 100644 --- a/js/book.js +++ b/js/book.js @@ -268,3 +268,49 @@ window.onunload = function () { }; previousScrollTop = document.scrollingElement.scrollTop; }, { passive: true }); })(); + +(function highlightSideBarLink() { + var anchorsToLink = {}; + var $sidebarLinks = $('#sidebar .chapter a'); + $sidebarLinks.each(function(_, link) { + var match = link.href.match(/#(.+)$/); + if (match) { + anchorsToLink[ match[1] ] = link; + } + }); + + function getActiveHeaderId() { + var sectionHeaders = $(':header').filter(function(_, el) { + return anchorsToLink[ el.id ]; + }); + + var visibleHeaders = getHeadersInViewport(sectionHeaders); + if (visibleHeaders.length == 0) return null; + + var activeHeader = visibleHeaders.sort(function(header) { + return header.getBoundingClientRect().y; + })[0]; + + return activeHeader.id; + } + + function getHeadersInViewport(headers) { + return headers.filter(function(_, header) { + var headerRect = header.getBoundingClientRect(); + var headerTop = headerRect.top; + var headerBottom = headerRect.bottom; + + return headerTop >= 0 && headerBottom <= window.innerHeight; + }); + } + + var activeLinkClass = 'active'; + $('#content').on('scroll', function() { + var activeHeaderId = getActiveHeaderId(); + if (!activeHeaderId) return; + + $sidebarLinks.removeClass(activeLinkClass); + var activeLink = anchorsToLink[activeHeaderId]; + $(activeLink).addClass(activeLinkClass); + }); +})(); From 08f4dbcb5862b458efa72da1fa378862b402f6fb Mon Sep 17 00:00:00 2001 From: fargelus Date: Tue, 1 Feb 2022 10:21:57 +0300 Subject: [PATCH 2/3] Some review fixes --- js/book.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/js/book.js b/js/book.js index f12fb22..63a142f 100644 --- a/js/book.js +++ b/js/book.js @@ -279,12 +279,12 @@ window.onunload = function () { }; } }); - function getActiveHeaderId() { - var sectionHeaders = $(':header').filter(function(_, el) { - return anchorsToLink[ el.id ]; - }); + var sectionHeaders = $(':header').filter(function(_, el) { + return anchorsToLink[ el.id ]; + }); - var visibleHeaders = getHeadersInViewport(sectionHeaders); + function getActiveHeaderId() { + var visibleHeaders = getHeadersInViewport(); if (visibleHeaders.length == 0) return null; var activeHeader = visibleHeaders.sort(function(header) { @@ -294,8 +294,8 @@ window.onunload = function () { }; return activeHeader.id; } - function getHeadersInViewport(headers) { - return headers.filter(function(_, header) { + function getHeadersInViewport() { + return sectionHeaders.filter(function(_, header) { var headerRect = header.getBoundingClientRect(); var headerTop = headerRect.top; var headerBottom = headerRect.bottom; From ee3c9537b484e9add74636dd5382dfd7904be201 Mon Sep 17 00:00:00 2001 From: fargelus Date: Tue, 1 Feb 2022 10:29:01 +0300 Subject: [PATCH 3/3] Variable renaming --- js/book.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/js/book.js b/js/book.js index 63a142f..b07376f 100644 --- a/js/book.js +++ b/js/book.js @@ -279,21 +279,21 @@ window.onunload = function () { }; } }); - var sectionHeaders = $(':header').filter(function(_, el) { - return anchorsToLink[ el.id ]; - }); - - function getActiveHeaderId() { + function getViewableHeaderId() { var visibleHeaders = getHeadersInViewport(); if (visibleHeaders.length == 0) return null; - var activeHeader = visibleHeaders.sort(function(header) { + var viewableHeader = visibleHeaders.sort(function(header) { return header.getBoundingClientRect().y; })[0]; - return activeHeader.id; + return viewableHeader.id; } + var sectionHeaders = $(':header').filter(function(_, el) { + return anchorsToLink[ el.id ]; + }); + function getHeadersInViewport() { return sectionHeaders.filter(function(_, header) { var headerRect = header.getBoundingClientRect(); @@ -306,11 +306,11 @@ window.onunload = function () { }; var activeLinkClass = 'active'; $('#content').on('scroll', function() { - var activeHeaderId = getActiveHeaderId(); - if (!activeHeaderId) return; + var viewableHeaderId = getViewableHeaderId(); + if (!viewableHeaderId) return; $sidebarLinks.removeClass(activeLinkClass); - var activeLink = anchorsToLink[activeHeaderId]; + var activeLink = anchorsToLink[viewableHeaderId]; $(activeLink).addClass(activeLinkClass); }); })();