Universal Auto Scroll

Hands-free reading! Press Alt+X to start 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 scrolling, then Alt+Up/Down to adjust speed. Escape/Space/Enter to stop scrolling.
// @icon           data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAABGUlEQVRoge2ZP0oDQRSG3yqFgoWCoVChUIXCoVAoFArFj7AoVAoVChUKBQKBYKFuwwF4gPQEHxBUUVRCEIIgL6EpUuvJ2kZnprM6O+c77xztycmNh+Gm10ea/LG5M9wlbSt0/ZPxXGtzLTZ/O4EvieIfUBeGm5v3U21dDUEbmBr8LUIuCp3t4GJwL/DngJQFhEfx1y3xks8G73K2lHKpxpq/mXwn4IEBL+oV1YfwHYpW9yFzFVqcmB9yNtRjLKKC8dp/ybA1lVXl1/MAVlRzNi33lQ8SkCeKShpJ2ryOYfQPSdLpIUKHhdfYXga7iWqODoIoNQF+b+EYOSuGpD9HI0U3EBcFRtdA/kXUwMiurYlwR/U8VjMvexqqkJ0APgXAhFvYGjAcwp7UXox+B6U82NwGbEBWAHwApBC8BV8s2Aa+d06fH7+nKpmKPAFcmgCebGfLK6lYXoAHUvntrXoPnFjP3h19TIADymtVYcDKAEeyt7Cz/kR5nXRAO2gZHRsAi8shdAa6DaQotNcZY1HUMbkuBajhffULNYFbJfhntZ+3NBM9D8KZNLjHQDpPywJK51frfWgLlmce/M/GUbzzd58B9wAIcX0tsBtAAAAAElFTkSuQmCC
// @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);
    }
}

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);
}