利用GPT實現油猴腳本—網頁滾動(優化版)

在瀏覽網頁的時候,發現有的網頁沒有直達最前這樣的功能,所有心血來潮利用ChatGPT寫了一個油猴腳本以實現此功能,在網站上出現一個可以自由拖動的滑塊。
聲明:引用或二創需注明出處。


如圖:
點擊即可直達當前網頁最前、中間、最后。
可以任意在網頁上推動,點擊小齒輪有簡單的設置。
感覺可以在優化一下,直接發布腳本了。
滑塊
在這里插入圖片描述


腳本在此,可以復制自己用喲:

// ==UserScript==
// @name         滾動助手(優化版)
// @namespace    https://github.com/yourname/scroll-helper
// @version      1.0
// @description  支持快捷滾動、自定義熱鍵、圖標拖動、暗色模式、圖形化設置中心,適配所有網頁
// @author       GPT、依舊天真無邪
// @match        *://*/*
// @require      https://unpkg.com/sweetalert2@10.16.6/dist/sweetalert2.all.min.js
// @grant        none
// ==/UserScript==(function () {'use strict';const defaultConfig = {scrollKeys: { top: 'ArrowUp', bottom: 'ArrowDown' },autoShow: true,iconSize: 18,iconGap: 8,borderRadius: 12,panelOpacity: 60,iconPos: { right: 30, bottom: 100 },darkMode: false,keyEnabled: true};const storageKey = 'ScrollHelperConfig';const config = Object.assign({}, defaultConfig, JSON.parse(localStorage.getItem(storageKey) || '{}'));const isDark = config.darkMode || window.matchMedia('(prefers-color-scheme: dark)').matches;const Util = {saveConfig() {localStorage.setItem(storageKey, JSON.stringify(config));},createBtn(id, label, title, onClick) {const btn = document.createElement('button');btn.id = id;btn.textContent = label;btn.title = title;Object.assign(btn.style, {all: 'unset',fontSize: `${config.iconSize}px`,padding: '6px',borderRadius: `${config.borderRadius}px`,background: isDark ? '#444' : '#007BFF',color: '#fff',cursor: 'pointer',boxShadow: '0 1px 4px rgba(0,0,0,0.2)',textAlign: 'center',transition: 'transform 0.2s'});btn.onmouseover = () => btn.style.transform = 'scale(1.1)';btn.onmouseout = () => btn.style.transform = 'scale(1.0)';btn.onmousedown = () => btn.style.transform = 'scale(0.9)';btn.onmouseup = () => btn.style.transform = 'scale(1.1)';btn.onclick = onClick;return btn;},limitToViewport(pos) {const w = window.innerWidth;const h = window.innerHeight;pos.right = Math.min(Math.max(0, pos.right), w - 50);pos.bottom = Math.min(Math.max(0, pos.bottom), h - 50);return pos;}};const UI = {panel: null,createPanel() {const panel = document.createElement('div');panel.id = 'scroll-helper-panel';Object.assign(panel.style, {position: 'fixed',right: `${config.iconPos.right}px`,bottom: `${config.iconPos.bottom}px`,display: 'flex',flexDirection: 'column',gap: `${config.iconGap}px`,zIndex: 99999,opacity: config.panelOpacity / 100,cursor: 'move'});this.panel = panel;const buttons = [Util.createBtn('scroll-top', '??', '返回頂部', () => window.scrollTo({ top: 0, behavior: 'smooth' })),Util.createBtn('scroll-mid', '??', '滾動中部', () => window.scrollTo({ top: (document.body.scrollHeight - window.innerHeight) / 2, behavior: 'smooth' })),Util.createBtn('scroll-bottom', '??', '滾動到底', () => window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' })),Util.createBtn('scroll-settings', '??', '設置中心', UI.openSettings)];buttons.forEach(btn => panel.appendChild(btn));document.body.appendChild(panel);this.enableDrag();},enableDrag() {let isDragging = false, startX, startY;this.panel.addEventListener('mousedown', (e) => {isDragging = true;startX = e.clientX;startY = e.clientY;e.preventDefault();});window.addEventListener('mousemove', (e) => {if (!isDragging) return;const dx = e.clientX - startX;const dy = e.clientY - startY;config.iconPos.right -= dx;config.iconPos.bottom -= dy;Util.limitToViewport(config.iconPos);this.panel.style.right = `${config.iconPos.right}px`;this.panel.style.bottom = `${config.iconPos.bottom}px`;startX = e.clientX;startY = e.clientY;});window.addEventListener('mouseup', () => {if (isDragging) {isDragging = false;Util.saveConfig();}});},openSettings() {const html = `<div style="text-align:left"><label>圖標大小:<input type="number" id="set-iconSize" value="${config.iconSize}" style="width:60px"></label><br><br><label>圓角半徑:<input type="number" id="set-radius" value="${config.borderRadius}" style="width:60px"></label><br><br><label>透明度(%):<input type="number" id="set-opacity" value="${config.panelOpacity}" style="width:60px"></label><br><br><label><input type="checkbox" id="set-autoShow" ${config.autoShow ? 'checked' : ''}> 自動顯示滾動按鈕</label><br><br><label><input type="checkbox" id="set-keyEnabled" ${config.keyEnabled ? 'checked' : ''}> 啟用快捷鍵 Ctrl+↑↓</label><br><br><label><input type="checkbox" id="set-darkMode" ${config.darkMode ? 'checked' : ''}> 暗色模式</label></div>`;Swal.fire({title: '滾動助手設置',html,confirmButtonText: '保存設置',showCancelButton: true,preConfirm: () => {config.iconSize = parseInt(document.getElementById('set-iconSize').value);config.borderRadius = parseInt(document.getElementById('set-radius').value);config.panelOpacity = parseInt(document.getElementById('set-opacity').value);config.autoShow = document.getElementById('set-autoShow').checked;config.keyEnabled = document.getElementById('set-keyEnabled').checked;config.darkMode = document.getElementById('set-darkMode').checked;Util.saveConfig();}}).then(res => {if (res.isConfirmed) {location.reload(); // 刷新頁面以應用新設置}});},handleScrollDisplay() {if (!config.autoShow) {this.panel.style.display = 'flex';return;}window.addEventListener('scroll', () => {if (window.scrollY > 200) {this.panel.style.display = 'flex';} else {this.panel.style.display = 'none';}});}};const Shortcut = {init() {if (!config.keyEnabled) return;document.addEventListener('keydown', (e) => {if (e.ctrlKey && e.key === config.scrollKeys.top) {window.scrollTo({ top: 0, behavior: 'smooth' });}if (e.ctrlKey && e.key === config.scrollKeys.bottom) {window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' });}});}};function init() {UI.createPanel();UI.handleScrollDisplay();Shortcut.init();}if (document.readyState === 'complete' || document.body) {init();} else {window.addEventListener('DOMContentLoaded', init);}})();

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79100.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79100.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79100.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL基礎關鍵_013_常用 DBA 命令

目 錄 一、MySQL 用戶信息存儲位置 二、新建用戶 1.創建本地用戶 2.創建外網用戶 三、用戶授權 1.說明 2.實例 四、撤銷授權 五、修改用戶密碼 六、修改用戶名、主機名/IP地址 七、刪除用戶 八、數據備份 1.導出數據 2.導入數據 &#xff08;1&#xff09;方式…

計算機視覺與深度學習 | 圖像匹配算法綜述

圖像匹配算法綜述 圖像匹配 圖像匹配算法綜述一、算法分類二、經典算法原理與公式1. **SIFT (Scale-Invariant Feature Transform)**2. **ORB (Oriented FAST and Rotated BRIEF)**3. **模板匹配(歸一化互相關,NCC)**4. **SuperPoint(深度學習)**三、代碼示例1. **SIFT 特…

切比雪夫不等式詳解

切比雪夫不等式詳解 一、引言 切比雪夫不等式&#xff08;Chebyshev’s Inequality&#xff09;是概率論和統計學中最重要的基本定理之一&#xff0c;由俄國數學家切比雪夫&#xff08;P. L. Chebyshev&#xff0c;1821-1894&#xff09;提出。它為我們提供了一個強大工具&am…

霸王茶姬微信小程序自動化簽到系統完整實現解析

霸王茶姬微信小程序自動化簽到系統完整實現解析 技術棧&#xff1a;Node.js 微信小程序API MD5動態簽名 一、腳本全景架構 功能模塊圖 #mermaid-svg-0vx5W2xo0IZWn6mH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…

氣動帶刮刀硬密封固定式對夾球閥:專為高粘度、強腐蝕性介質設計的工業解決方案-耀圣

氣動帶刮刀硬密封固定式對夾球閥&#xff1a;專為高粘度、強腐蝕性介質設計的工業解決方案 在石油化工、鋰電材料、污水處理等高難度工況中&#xff0c;帶顆粒的高粘度介質、料漿及強腐蝕性流體對閥門的性能提出了嚴苛要求。 氣動帶刮刀硬密封固定式對夾球閥憑借其獨特的結構…

Filecoin存儲管理:如何停止Lotus向特定存儲路徑寫入新扇區數據

Filecoin存儲管理&#xff1a;如何停止Lotus向特定存儲路徑寫入新扇區數據 引言背景問題場景解決方案步驟1&#xff1a;修改sectorstore.json文件步驟2&#xff1a;重新加載存儲配置步驟3&#xff1a;驗證更改 技術原理替代方案最佳實踐結論 引言 在Filecoin挖礦過程中&#x…

互聯網大廠Java求職面試:高并發系統設計與架構實戰

互聯網大廠Java求職面試&#xff1a; 高并發系統設計與架構實戰 第一輪提問&#xff1a;基礎概念與核心原理 技術總監&#xff08;嚴肅&#xff09;&#xff1a;鄭薪苦&#xff0c;你對JVM的內存模型了解多少&#xff1f;能說說堆、棧、方法區的區別嗎&#xff1f; 鄭薪苦&a…

AD原理圖復制較多元器件時報錯:“InvalidParameter Exception Occurred In Copy”

一、問題描述 AD原理圖復制較多元器件時報錯&#xff1a;AD原理圖復制較多元器件時報錯&#xff1a;“InvalidParameter Exception Occurred In Copy”。如下圖 二、問題分析 破解BUG。 三、解決方案 1、打開參數配置 2、打開原理圖優先項中的通用配置&#xff0c;取消勾選G…

網絡研討會開發注冊中, 5月15日特勵達力科,“了解以太網”

在線研討會主題 Understanding Ethernet - from basics to testing & optimization 了解以太網 - 從基礎知識到測試和優化 注冊鏈接# https://register.gotowebinar.com/register/2823468241337063262 時間 北京時間 2025 年 5 月 15 日 星期四 下午 3:30 - 4:30 適宜…

Spring Boot中的攔截器!

每次用戶請求到達Spring Boot服務端&#xff0c;你是否需要重復寫日志、權限檢查或請求格式化代碼&#xff1f;這些繁瑣的“前置后置”工作讓人頭疼&#xff01;好在&#xff0c;Spring Boot攔截器如同一道智能關卡&#xff0c;統一處理請求的橫切邏輯&#xff0c;讓代碼優雅又…

三個線程 a、b、c 并發運行,b,c 需要 a 線程的數據如何解決

說明&#xff1a; 開發中經常會碰到線程并發&#xff0c;但是后續線程需要等待第一個線程執行完返回結果后&#xff0c;才能再執行后面線程。 如何處理呢&#xff0c;今天就介紹兩種方法 1、使用Java自有的API即CountDownLatch&#xff0c;進行實現 思考&#xff1a;CountDown…

js原型污染 + xss劫持base -- no-code b01lersctf 2025

題目信息:Found this new web framework the other day—you don’t need to write any code, just JSON. 我們先來搞清楚究竟發生了什么 當我們訪問 /index /*** 處理 /:page 路徑的 GET 請求* param {Object} req - 請求對象* param {Object} reply - 響應對象* returns {Pro…

Qwen智能體qwen_agent與Assistant功能初探

Qwen智能體qwen_agent與Assistant功能初探 一、Qwen智能體框架概述 Qwen&#xff08;通義千問&#xff09;智能體框架是阿里云推出的新一代AI智能體開發平臺&#xff0c;其核心模塊qwen_agent.agent提供了一套完整的智能體構建解決方案。該框架通過模塊化設計&#xff0c;將L…

vue數據可視化開發常用庫

一、常用數據可視化庫 1. ECharts 特點&#xff1a;功能強大&#xff0c;支持多種圖表類型&#xff0c;社區活躍。適用場景&#xff1a;復雜圖表、大數據量、3D 可視化。安裝&#xff1a;npm install echarts示例&#xff1a;<template><div ref"chart" c…

小紅書視頻無水印下載方法

下載小紅書&#xff08;RED/Xiaohongshu&#xff09;視頻并去除水印可以通過以下幾種方法實現&#xff0c;但請注意尊重原創作者版權&#xff0c;下載內容僅限個人使用&#xff0c;避免侵權行為。 方法一&#xff1a;使用在線解析工具&#xff08;推薦&#xff09; 復制視頻鏈…

Qt讀寫XML文檔

XML 結構與概念簡介 XML&#xff08;可擴展標記語言&#xff09; 是一種用于存儲和傳輸結構化數據的標記語言。其核心特性包括&#xff1a; 1、樹狀結構&#xff1a;XML 數據以層次化的樹形結構組織&#xff0c;包含一個根元素&#xff08;Root Element&#xff09;&#xff…

lambda 表達式

C 的 lambda 表達式 是一種輕量、內聯的函數對象寫法&#xff0c;廣泛用于標準算法、自定義回調、事件響應等場景。它簡潔且強大。以下將系統、詳細地講解 lambda 的語法、捕獲規則、應用技巧和實際使用場景。 &#x1f9e0; 一、基本語法 [捕獲列表](參數列表) -> 返回類型…

Web端項目系統訪問頁面很慢,后臺數據返回很快,網絡也沒問題,是什么導致的呢?

Web端訪問緩慢問題診斷指南(測試工程師專項版) ——從瀏覽器渲染到網絡層的全鏈路排查方案 一、問題定位黃金法則(前端性能四象限) 1. [網絡層] 數據返回快 ≠ 資源加載快(檢查Content Download時間) 2. [渲染層] DOM復雜度與瀏覽器重繪(查看FPS指標) 3. [執行層…

Docker網絡模式深度解析:Bridge與Host模式對比及實踐指南

#作者&#xff1a;鄧偉 文章目錄 一、引言二、Bridge模式&#xff08;網橋模式&#xff09;2.1 工作原理2.2 核心特性2.4 適用場景2.5 優缺點分析 三、Host模式3.1 工作原理3.2 核心特性3.3 配置方法3.4 適用場景3.5 優缺點分析 四、網橋模式與Host模式對比五、最佳實踐與注意…

React+Taro選擇日期組件封裝

話不多說&#xff0c;直接上效果 1.頁面渲染時間模塊 {this.renderCalendarPopup()}2.引入時間組件彈層&#xff0c;state中加入showPopup(控制什么時候展示時間選擇彈層)&#xff0c;time(選擇后的時間值) private renderCalendarPopup () > {const { showPopup, time…