您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
自动滚动页面,rAF 丝滑驱动 + 可调速面板(兼容无限下拉)
当前为
- // ==UserScript==
- // @name AutoScroller UI Plus ✨
- // @namespace https://example.com/
- // @version 0.4
- // @description 自动滚动页面,rAF 丝滑驱动 + 可调速面板(兼容无限下拉)
- // @author 你
- // @license MIT
- // @match *://*/*
- // @icon https://example.com/icon.png
- // @grant GM_addStyle
- // ==/UserScript==
- (function () {
- 'use strict';
- /* ——— 可自定义变量 ——— */
- let su_du = 200; // 滚动速度(px / 秒)← 可自定义
- let yun_xing = false; // 运行标志
- let shang_ci = 0; // 上次帧时间戳
- /* ——— 创建 UI ——— */
- const kuang = document.createElement('div');
- kuang.id = 'autoScrollerPanel';
- kuang.innerHTML = `
- <header id="tiaoTi">自动滚动 ⇲</header>
- <div class="neiRong">
- <label>速度(px/s):
- <input type="number" id="suDuInput" value="${su_du}" />
- </label>
- <div class="btns">
- <button id="kaiShiBtn">开始 🚀</button>
- <button id="tingZhiBtn">停止 🛑</button>
- </div>
- </div>
- `;
- document.body.appendChild(kuang);
- /* ——— 样式 ——— */
- GM_addStyle(`
- :root{
- --as-main:#6366f1;
- --as-main-light:#8b97ff;
- --as-bg:rgba(255,255,255,0.85);
- }
- #autoScrollerPanel{
- position:fixed; bottom:20px; right:20px;
- width:190px; border-radius:12px; z-index:9999;
- box-shadow:0 4px 18px rgba(0,0,0,.15);
- backdrop-filter:blur(10px); background:var(--as-bg);
- font-size:14px; color:#111; user-select:none;
- transition:box-shadow .2s;
- }
- #autoScrollerPanel header{
- background:var(--as-main); color:#fff;
- padding:8px 12px; border-radius:12px 12px 0 0;
- cursor:move; font-weight:600; letter-spacing:.5px;
- }
- #autoScrollerPanel .neiRong{padding:12px 14px;}
- #autoScrollerPanel input{
- width:78px; margin-left:4px; padding:2px 4px;
- border:1px solid #ccc; border-radius:6px;
- }
- #autoScrollerPanel .btns{margin-top:10px; display:flex; gap:8px;}
- #autoScrollerPanel button{
- flex:1; padding:6px 0; border:none; border-radius:8px;
- background:var(--as-main); color:#fff; font-weight:500;
- box-shadow:0 2px 6px rgba(0,0,0,.15);
- transition:transform .2s, background .2s, box-shadow .2s;
- cursor:pointer;
- }
- #autoScrollerPanel button:hover{
- background:var(--as-main-light); transform:translateY(-2px);
- box-shadow:0 6px 12px rgba(0,0,0,.2);
- }
- `);
- /* ——— 事件 ——— */
- const suDuInput = kuang.querySelector('#suDuInput');
- const kaiShiBtn = kuang.querySelector('#kaiShiBtn');
- const tingZhiBtn = kuang.querySelector('#tingZhiBtn');
- kaiShiBtn.addEventListener('click', () => {
- su_du = parseFloat(suDuInput.value) || su_du;
- if (yun_xing) return; // 已在跑
- yun_xing = true;
- shang_ci = 0;
- requestAnimationFrame(gunDong);
- });
- tingZhiBtn.addEventListener('click', () => {
- yun_xing = false;
- });
- /* ——— 核心滚动 (rAF) ——— */
- function gunDong(time){
- if (!yun_xing) return;
- if (!shang_ci) shang_ci = time;
- const cha = time - shang_ci; // Δt (ms)
- const bu_chang = su_du * cha / 1000; // Δs = 速度 * 时间
- const diBuCha = document.body.scrollHeight - (window.scrollY + window.innerHeight);
- if (diBuCha > 0) window.scrollBy(0, bu_chang);
- // 到底部但可能懒加载 → 维持循环
- shang_ci = time;
- requestAnimationFrame(gunDong);
- }
- /* ——— 面板拖拽 ——— */
- (function drag(el, handle){
- let startX, startY, startL, startT, z = 9999;
- handle.addEventListener('mousedown', e=>{
- startX = e.clientX; startY = e.clientY;
- const rect = el.getBoundingClientRect();
- startL = rect.left; startT = rect.top;
- el.style.transition = 'none';
- document.addEventListener('mousemove', move);
- document.addEventListener('mouseup', up, {once:true});
- e.preventDefault();
- });
- function move(e){
- el.style.left = startL + (e.clientX - startX) + 'px';
- el.style.top = startT + (e.clientY - startY) + 'px';
- el.style.right = 'auto'; el.style.bottom = 'auto';
- el.style.position = 'fixed'; el.style.zIndex = ++z;
- }
- function up(){ document.removeEventListener('mousemove', move); }
- })(kuang, kuang.querySelector('#tiaoTi'));
- })();