// ==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;
})();