// ==UserScript== // @name 网页电子教材自动来回滚动演示 // @namespace http://tampermonkey.net/ // @version 1.4 // @description 【仅技术演示】网页长文本自动来回滚动,支持面板实时调速,不可用于网课刷时长 // @author demo // @match *://*/* // @grant GM_addStyle // ==/UserScript== (function() { 'use strict'; GM_addStyle(` .book-auto-read-panel { position: fixed; top: 80px; right: 16px; background: rgba(0,0,0,0.7); color:#fff; padding:12px; border-radius:6px; z-index:99999; } .book-auto-read-panel button { padding: 6px 10px; margin:4px; border:none; border-radius:4px; cursor:pointer; } .book-auto-read-panel input { width:60px; padding:4px; margin:4px; } `); const cfg = { speed: 1.5, // 默认滚动像素 interval: 60, // 滚动间隔ms bottomGap: 120, topGap: 20 }; let timer = null; let paused = false; let direction = 1; // 1向下,-1向上 const panel = document.createElement('div'); panel.className = "book-auto-read-panel"; panel.innerHTML = `
来回滚动演示
速度:
`; document.body.appendChild(panel); const speedInput = document.querySelector("#speedInput"); // 获取真实滚动容器 function getScrollContainer() { const html = document.documentElement; const body = document.body; if (html.scrollHeight > html.clientHeight) return html; if (body.scrollHeight > body.clientHeight) return body; const allDivs = document.querySelectorAll('div'); for(let el of allDivs){ if(el.scrollHeight > el.clientHeight && getComputedStyle(el).overflow !== 'hidden'){ return el; } } return window; } function startScroll() { if(timer) return; paused = false; direction = 1; timer = setInterval(()=>{ if(paused) return; // 实时读取输入框速度 cfg.speed = parseFloat(speedInput.value) || 1.5; const scrollEl = getScrollContainer(); let scrollTop, scrollH, viewH; if(scrollEl === window){ scrollTop = window.scrollY; scrollH = document.documentElement.scrollHeight; viewH = window.innerHeight; }else{ scrollTop = scrollEl.scrollTop; scrollH = scrollEl.scrollHeight; viewH = scrollEl.clientHeight; } // 触底切换向上 if(direction === 1 && scrollTop + viewH >= scrollH - cfg.bottomGap){ direction = -1; } // 触顶切换向下 if(direction === -1 && scrollTop <= cfg.topGap){ direction = 1; } const newScrollTop = scrollTop + cfg.speed * direction; if(scrollEl === window){ window.scrollTo(0, newScrollTop); }else{ scrollEl.scrollTop = newScrollTop; } }, cfg.interval); } function pauseScroll(){ paused = !paused; } function stopScroll(){ clearInterval(timer); timer = null; } document.querySelector("#readStart").onclick = startScroll; document.querySelector("#readPause").onclick = pauseScroll; document.querySelector("#readStop").onclick = stopScroll; })();