Universal Auto Scroll

Hands-free reading! Press Alt+X to start/increase scrolling, then Alt+Up/Down to adjust speed. Escape/Space/Enter to stop scrolling.

当前为 2025-02-17 提交的版本,查看 最新版本

// ==UserScript==
// @name           Universal Auto Scroll
// @version        1.0
// @namespace      MedX-AA
// @author         MedX
// @license        MIT
// @description    Hands-free reading! Press Alt+X to start/increase scrolling, then Alt+Up/Down to adjust speed. Escape/Space/Enter to stop scrolling.
// @icon           data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABGUlEQVR4nO3VsS4EURQG4E9oRCEh0ZDQi3gDjV7lHXTeAYVo9gl0ahregEapoKEh0SFRbVbIyiSjEYnd2TtzZ5PzJSeZYjbzn/2LQwghlSN8oP/PFO8caqHeAOF/pni3dfpDTuvEArlFA7lFA7lFA7lFA7lFA7lFA7lFA7lFA7m1uoE9dCuErDrd8pvJvDYYvl/OS8oFOhkW6KRcYBKnDYY/x5TEpnHZQPhrzKjJLG5qDH+LOTVbxGMN4Z+xrCGreEsY/h3rGraR6Db0sCmTLXyOEP4L2zLbGWGBXS1xUCH8vhaZwPEQ4U/K37RKca3PBgh/UceVTXmtr3Jd2VTmcfdH+HssGBNLePp1ZVeMmTU8lP988RxCkN43yek7CExEuggAAAAASUVORK5CYII=
// @grant          none
// @include        *
// ==/UserScript==

var isScrolling = false; // Track if auto-scroll is active
var scrollSpeed = 0;
var initialSpeed = 30;
var lastTime;

// Key Codes
var DOM_VK_X = 88;
var DOM_VK_UP = 38;
var DOM_VK_DOWN = 40;
var DOM_VK_ESCAPE = 27;
var DOM_VK_SPACE = 32;
var DOM_VK_ENTER = 13;

window.addEventListener('keydown', handleKeyPress, true);

function handleKeyPress(e) {
    // Block Alt + X if Ctrl or Shift is held
    if (e.altKey && !e.ctrlKey && !e.shiftKey && e.keyCode === DOM_VK_X) {
        startAutoScroll();
        e.preventDefault();
    }

    // Only allow Alt + Up/Down after Alt + X was pressed
    if (isScrolling) {
        if (e.altKey && !e.ctrlKey && !e.shiftKey && e.keyCode === DOM_VK_UP) {
            scrollSpeed -= 10;
            e.preventDefault();
        }
        if (e.altKey && !e.ctrlKey && !e.shiftKey && e.keyCode === DOM_VK_DOWN) {
            scrollSpeed += 10;
            e.preventDefault();
        }
    }

    // Stop scrolling with Escape, Space, or Enter
    if (e.keyCode === DOM_VK_ESCAPE || e.keyCode === DOM_VK_SPACE || e.keyCode === DOM_VK_ENTER) {
        stopAutoScroll();
        e.preventDefault();
    }
}

function startAutoScroll() {
    if (!isScrolling) {
        isScrolling = true;
        scrollSpeed = initialSpeed;
        lastTime = performance.now();
        requestAnimationFrame(autoScroll);
    } else {
        // If already scrolling, increase speed
        scrollSpeed += 10;
    }
}

function stopAutoScroll() {
    isScrolling = false;
    scrollSpeed = 0;
}

function autoScroll(timestamp) {
    if (!isScrolling) return;

    var elapsed = timestamp - lastTime;
    var jumpPixels = (scrollSpeed * elapsed) / 1000;
    window.scrollBy(0, jumpPixels);
    lastTime = timestamp;

    requestAnimationFrame(autoScroll);
}