I recently recalled having a "scroll mark" feature, that is, a line that would show up when hitting the space bar in the Opera browser? There used to be a Greasemonkey script for Firefox, but even when you look for a copy, it's defunct and I couldn't find a working one, possibly because I can't convince the search engine to search for the right thing.
Screenshot to get an idea:
In any case, below is a quick solution that I drafted and given my lack of JavaScript/CSS/browser-fu, I'd like to get some feedback and potential improvements for this, in particular:
- is there a (much) better way to construct the marker line?
- are width and height correctly calculated in all (or most) circumstances?
- is there a better (short code, or more performant) way to describe the animation?
- any other opportunities to skip updates when the bar isn't shown / off-screen?
- is there a better way to make this behave well when scrolling with the mouse wheel, like doing a debounce step and only showing it after a short timeout, or is there another DOM feature that would allow me to only activate when a full page has been scrolled (i.e. hitting space bar)?
My plan is then to perhaps convert it to an extension as well, but that's a future review.
Feature-wise, this does what I personally want, but I could see the need for:
- disabling the fade animation,
- entirely disabling the automatic hiding of the marker and having a keyboard shortcut to toggle it manually,
- colour, size maybe, anything else?
The demo here doesn't do justice to the fading effect, at least on my system it doesn't properly show, you'd have to load it into Tampermonkey to see it.
(Updated to also show on scrolling up, since nobody had answered yet.)
// ==UserScript==
// @name Page Scroll Marker
// @namespace https://macrolet.net/
// @version 2024-06-20
// @description try to take over the world!
// @author You
// @match *://*/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=userscripts-mirror.org
// @grant none
// ==/UserScript==
(function() {
"use strict"
let bar = null
let previousPosition = window.scrollY
function upsertBar() {
if (bar === null) {
bar = document.createElement("div")
bar.style.zIndex = "2147483647"
bar.style.width = window.innerWidth + "px"
bar.style.height = "2px"
bar.style.background = "red"
bar.style.position = "absolute"
bar.style.left = "0px"
document.body.appendChild(bar)
}
if (window.scrollY > previousPosition) {
bar.style.top = (previousPosition + window.innerHeight - 2) + "px"
} else {
bar.style.top = (previousPosition - 2) + "px"
}
bar.style.opacity = "1"
setTimeout(function() {
bar.style.transition = "opacity 0.5s ease-in-out"
}, 0)
setTimeout(function() {
bar.style.opacity = "0"
}, 500)
setTimeout(function() {
bar.style.transition = ""
}, 1000);
previousPosition = window.scrollY
}
document.addEventListener("scrollend", function (event) {
upsertBar()
})
})()
<pre>
1 Lorem ipsum dolor
2 sit amet,
3 consectetur
4 adipiscing elit, sed
5 do eiusmod tempor
6 incididunt ut labore
7 et dolore magna
8 aliqua. Ut enim ad
9 minim veniam, quis
10 nostrud exercitation
11 ullamco laboris nisi
12 ut aliquip ex ea
13 commodo
14 consequat. Duis aute
15 irure dolor in
16 reprehenderit in
17 voluptate velit esse
18 cillum dolore eu
19 fugiat nulla
20 pariatur. Excepteur
21 sint occaecat
22 cupidatat non
23 proident, sunt in
24 culpa qui officia
25 deserunt mollit anim
26 id est laborum.
27
28 Lorem ipsum dolor
29 sit amet,
30 consectetur
31 adipiscing elit, sed
32 do eiusmod tempor
33 incididunt ut labore
34 et dolore magna
35 aliqua. Ut enim ad
36 minim veniam, quis
37 nostrud exercitation
38 ullamco laboris nisi
39 ut aliquip ex ea
40 commodo
41 consequat. Duis aute
42 irure dolor in
43 reprehenderit in
44 voluptate velit esse
45 cillum dolore eu
46 fugiat nulla
47 pariatur. Excepteur
48 sint occaecat
49 cupidatat non
50 proident, sunt in
51 culpa qui officia
52 deserunt mollit anim
53 id est laborum.
</pre>