您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
滚动到顶/底、滚动条-新、记录页面滚动、屏幕常亮和自动滚动
当前为
// ==UserScript== // @name 网页随心滚 // @namespace http://tampermonkey.net/ // @version 1.2 // @description 滚动到顶/底、滚动条-新、记录页面滚动、屏幕常亮和自动滚动 // @author ^o^ // @match *://*/* // @grant GM_registerMenuCommand // @run-at document-start // ==/UserScript== (function() { 'use strict'; let w = window, d = document; let eScrollBtn = true, eScrollBar = true, eWakeLock = true; let scrollBarPosition = localStorage.getItem('scrollBarPosition') || 'right'; // 'left' or 'right' let scrollBtnPosition = localStorage.getItem('scrollBtnPosition') || 'right'; // 'left' or 'right' // 注册(不可用)菜单命令 GM_registerMenuCommand('滚动到顶/底按钮:开/关', toggleScrollBtn); GM_registerMenuCommand('滚动条:开/关', toggleScrollBar); GM_registerMenuCommand('滚动条位置:左/右切换', toggleScrollBarPosition); GM_registerMenuCommand('滚动到顶/底按钮位置:左/右切换', toggleScrollBtnPosition); GM_registerMenuCommand('保持屏幕常亮:开/关', toggleWakeLock); function toggleScrollBtn() { eScrollBtn = !eScrollBtn; let b = d.getElementById('scroll-top-btn'); if (b) b.remove(); if (eScrollBtn) initScrollBtn(); } function toggleScrollBar() { eScrollBar = !eScrollBar; let s = d.getElementById('theScrollBar'); if (s) s.remove(); if (eScrollBar) initScrollBar(); } function toggleWakeLock() { eWakeLock = !eWakeLock; if (eWakeLock) requestWL(); else if (wakeLock) wakeLock.release(); } function toggleScrollBarPosition() { scrollBarPosition = scrollBarPosition === 'left' ? 'right' : 'left'; localStorage.setItem('scrollBarPosition', scrollBarPosition); let s = d.getElementById('theScrollBar'); if (s) { s.style.left = scrollBarPosition === 'left' ? '2vw' : ''; s.style.right = scrollBarPosition === 'right' ? '2vw' : ''; } } function toggleScrollBtnPosition() { scrollBtnPosition = scrollBtnPosition === 'left' ? 'right' : 'left'; localStorage.setItem('scrollBtnPosition', scrollBtnPosition); let b = d.getElementById('scroll-top-btn'); if (b) { b.style.left = scrollBtnPosition === 'left' ? '15px' : ''; b.style.right = scrollBtnPosition === 'right' ? '15px' : ''; } } function initScrollBtn() { let b = d.createElement('button'); b.textContent = '▲'; b.id = 'scroll-top-btn'; Object.assign(b.style, { position: 'fixed', bottom: '15%', zIndex: 999999, width: '35px', height: '35px', borderRadius: '50%', padding: 0, background: 'rgba(255,255,255,0.3)', backdropFilter: 'blur(5px)', display: 'none', fontSize: '16px', textAlign: 'center', lineHeight: '35px', fontWeight: 'bold', cursor: 'pointer', transition: 'all 0.3s ease', border: 'none' }); // 根据位置设置 left 或 right if (scrollBtnPosition === 'left') { b.style.left = '15px'; } else { b.style.right = '15px'; } d.body.appendChild(b); let lastY = w.pageYOffset, t; w.addEventListener('scroll', () => { b.textContent = w.scrollY > lastY ? '▼' : '▲'; lastY = w.scrollY; b.style.display = w.pageYOffset > 100 ? 'block' : 'none'; clearTimeout(t); t = setTimeout(() => b.style.display = 'none', 2000); }); b.addEventListener('mouseenter', () => { b.style.background = 'rgba(255,255,255,0.6)'; b.style.transform = 'scale(1.1)'; }); b.addEventListener('mouseleave', () => { b.style.background = 'rgba(255,255,255,0.3)'; b.style.transform = 'scale(1)'; }); b.addEventListener('click', () => w.scrollTo({ top: b.textContent === '▲' ? 0 : d.documentElement.scrollHeight, behavior: 'smooth' })); } function initScrollBar() { let s = d.createElement("div"); s.id = "theScrollBar"; s.innerHTML = "<span style='font-size: 1rem;'>▲<br>▼</span>"; Object.assign(s.style, { position: 'fixed', top: '-14vw', zIndex: 9999999, width: '35px', fontSize: '16px', lineHeight: '35px', opacity: 0, background: 'rgba(255,255,255,0.3)', backdropFilter: 'blur(5px)', borderRadius: '17.5px', textAlign: 'center', transition: 'opacity 0.4s, left 0.4s, right 0.4s' }); // 根据位置设置 left 或 right if (scrollBarPosition === 'left') { s.style.left = '15px'; } else { s.style.right = '15px'; } d.body.appendChild(s); let h = null, lastTop = null, anim = false; function updateBar() { let st = w.scrollY; if (st !== lastTop) { let barTop = (st / h) * (w.innerHeight - s.clientHeight); s.style.top = barTop < 0 ? 0 : barTop + s.clientHeight > w.innerHeight ? w.innerHeight - s.clientHeight + 'px' : barTop + 'px'; lastTop = st; } w.requestAnimationFrame(updateBar); } w.addEventListener("touchstart", () => { if (d.documentElement.scrollHeight <= w.innerHeight * 2) return; h = d.documentElement.scrollHeight - w.innerHeight; updateBar(); }); let startY = null; function startScroll(e) { e.preventDefault(); startY = e.changedTouches[0].clientY - parseInt(s.style.top); } function scrolling(e) { e.preventDefault(); let curY = e.changedTouches[0].clientY; let barTop = curY - startY; s.style.top = barTop < 0 ? 0 : barTop > w.innerHeight - s.clientHeight ? w.innerHeight - s.clientHeight + 'px' : barTop + 'px'; w.scrollTo(w.scrollX, (barTop / (w.innerHeight - s.clientHeight)) * h); } s.addEventListener("touchstart", startScroll, { passive: false }); s.addEventListener("touchmove", scrolling, { passive: false }); let t; w.addEventListener("scroll", () => { clearTimeout(t); s.style.opacity = '0.8'; t = setTimeout(() => { s.style.opacity = '0'; }, 1000); if (anim) return; let st = w.scrollY, spd = Math.abs(st - lastTop); if ((st === 0 || st + w.innerHeight >= d.documentElement.scrollHeight) && spd > 7) { anim = true; s.style.animation = `bounce-${st === 0 ? 'down' : 'up'} 0.4s`; setTimeout(() => { s.style.animation = ''; anim = false; }, 500); } }); let style = d.createElement("style"); style.textContent = `@keyframes bounce-down{0%{transform:translateY(0)}30%{transform:translateY(10px)}100%{transform:translateY(0)}}@keyframes bounce-up{0%{transform:translateY(0)}30%{transform:translateY(-10px)}100%{transform:translateY(0)}}`; d.head.appendChild(style); } let wakeLock = null; async function requestWL() { if (!('wakeLock' in navigator)) return; try { wakeLock = await navigator.wakeLock.request("screen"); } catch (e) {} } eWakeLock && requestWL(); let scrolling = false, interval, speed = 25, pixels = 1; function toggleAutoScroll() { if (scrolling) { scrolling = false; clearInterval(interval); } else { scrolling = true; interval = setInterval(() => { w.scrollBy(0, pixels); if (w.innerHeight + w.scrollY >= d.body.scrollHeight) { w.scrollBy(0, 1); } }, speed); } } GM_registerMenuCommand('自动滚动:开始/停止', toggleAutoScroll); GM_registerMenuCommand('自动滚动:配置参数', () => { let s = prompt('滚动间隔(ms):', speed); if (s !== null) speed = parseInt(s) || speed; let p = prompt('每次滚动像素(px):', pixels); if (p !== null) pixels = parseInt(p) || pixels; }); eScrollBtn && initScrollBtn(); eScrollBar && initScrollBar(); // 记录页面滚动位置 w.addEventListener('scroll', () => { localStorage.setItem('pageScrollPosition', JSON.stringify({ top: w.scrollY, left: w.scrollX })); }); // 页面加载时恢复滚动位置 w.addEventListener('load', () => { let position = localStorage.getItem('pageScrollPosition'); if (position) { let scrollPosition = JSON.parse(position); w.scrollTo(scrollPosition.left, scrollPosition.right); } }); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址