-
Notifications
You must be signed in to change notification settings - Fork 11.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a progress bar to show the scroll position
This feature adds a horizontal bar under the top menu which tracks the vertical scroll position. Such a feature can be useful to represent how much is left to read on the current page more aesthetically. As this is an optional feature, `enable_progressbar` must be set to `true` in `_config.yml` to activate the functionality. I am not the original author of this code. I just made it compatible with the current version of the template at the time of this commit. The original code was most likely authored by Pankaj Parashar in this [post](https://css-tricks.com/reading-position-indicator/) made a few years before the first inclusion in an `al-folio` site. Then, the code was adapted for compatibility with the template at Anthony Plantanios' site. Finally, I did the last updates to have the code fit the new conventions used in the project.
- Loading branch information
1 parent
951ae92
commit 3c403e4
Showing
5 changed files
with
144 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
{% if site.enable_progressbar %} | ||
|
||
<!-- Scrolling Progress Bar --> | ||
<script type="text/javascript"> | ||
/* | ||
This contribution is based upon previous work that, to the best of my | ||
knowledge, was authored by Pankaj Parashar for | ||
[this post](https://css-tricks.com/reading-position-indicator/) | ||
in 2014. Then, it was adapted for a fork of `al-folio` by [Anthony | ||
Platanios](https://github.com/eaplatanios/eaplatanios.github.io.git) | ||
in 2019. Finally, I refactored the code to make it up to date with the | ||
template, more maintainable, and added JS ES6 features. | ||
*/ | ||
const progressBar = $("#progress"); | ||
/* | ||
setup the bar after all elements are done loading | ||
In some cases, if the images in the page are larger than the intended | ||
size they'll have on the page, they'll be resized via CSS to accomodate | ||
the desired size. This mistake, however, breaks the computations as the | ||
scroll size is computed as soon as the elements finish loading. | ||
To account for this, a minimal delay was introduced before computing the | ||
values. | ||
*/ | ||
window.onload = function() { setTimeout(progressBarSetup, 50); }; | ||
/* | ||
We set up the bar according to the browser. | ||
If the browser supports the progress element we use that. | ||
Otherwise, we resize the bar thru CSS styling | ||
*/ | ||
function progressBarSetup() { | ||
if ("max" in document.createElement("progress")) { | ||
initializeProgressElement(); | ||
$(document).on("scroll", function() { | ||
progressBar.attr({ value: getCurrentScrollPosition() }); | ||
}); | ||
$(window).on("resize", initializeProgressElement); | ||
} else { | ||
resizeProgressBar(); | ||
$(document).on("scroll", resizeProgressBar); | ||
$(window).on("resize", resizeProgressBar); | ||
} | ||
} | ||
/* | ||
* The vertical scroll position is the same as the number of pixels that | ||
* are hidden from view above the scrollable area. Thus, a value > 0 is | ||
* how much the user has scrolled from the top | ||
*/ | ||
function getCurrentScrollPosition() { | ||
return $(window).scrollTop(); | ||
} | ||
|
||
function initializeProgressElement() { | ||
let navbarHeight = $("#navbar").outerHeight(true); | ||
$("body").css({ "padding-top": navbarHeight }); | ||
$("progress-container").css({ "padding-top": navbarHeight }); | ||
progressBar.css({ "top": navbarHeight }); | ||
progressBar.attr({ max: getDistanceToScroll(), | ||
value: getCurrentScrollPosition() }); | ||
} | ||
/* | ||
* The offset between the html document height and the browser viewport | ||
* height will be greater than zero if vertical scroll is possible. | ||
* This is the distance the user can scroll | ||
*/ | ||
function getDistanceToScroll() { | ||
return $(document).height() - $(window).height(); | ||
} | ||
|
||
function resizeProgressBar() { | ||
progressBar.css({ width: getWidthPercentage() + "%" }); | ||
} | ||
// The scroll ratio equals the percentage to resize the bar | ||
function getWidthPercentage() { | ||
return (getCurrentScrollPosition() / getDistanceToScroll()) * 100; | ||
} | ||
</script> | ||
|
||
{%- endif %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters