您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds sleek top and bottom navigation buttons with hover scrolling functionality for all websites
// ==UserScript== // @name Top/Bottom Navigation Buttons // @namespace https://openuserjs.org/ // @version 1.0.0 // @description Adds sleek top and bottom navigation buttons with hover scrolling functionality for all websites // @author r3dhack3r // @license MIT // @match *://*/* // @grant none // ==/UserScript== (function() { 'use strict'; // Create CSS styles const style = document.createElement('style'); style.textContent = ` .nav-button { position: fixed; right: 20px; top: 50%; width: 36px; height: 36px; background: rgba(255, 255, 255, 0.95); border: 1px solid rgba(0, 0, 0, 0.1); border-radius: 6px; cursor: pointer; z-index: 10000; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08); transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); display: flex; align-items: center; justify-content: center; backdrop-filter: blur(8px); } .nav-button:hover { background: rgba(255, 255, 255, 1); border-color: rgba(0, 0, 0, 0.15); box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12); transform: scale(1.05); } .nav-button:active { transform: scale(0.95); transition: all 0.1s ease; } .nav-button svg { width: 16px; height: 16px; fill: #374151; transition: all 0.25s ease; } .nav-button:hover svg { fill: #1f2937; } .nav-button.top { transform: translateY(-24px); opacity: 0; visibility: hidden; } .nav-button.bottom { transform: translateY(24px); opacity: 0; visibility: hidden; } .nav-button.visible { opacity: 1; visibility: visible; } .nav-button.scrolling { background: rgba(249, 250, 251, 1); border-color: rgba(0, 0, 0, 0.2); box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15); } `; document.head.appendChild(style); // Create top button const topButton = document.createElement('button'); topButton.className = 'nav-button top'; topButton.innerHTML = ` <svg viewBox="0 0 24 24"> <path d="M7.41 15.41L12 10.83l4.59 4.58L18 14l-6-6-6 6z"/> </svg> `; // Create bottom button const bottomButton = document.createElement('button'); bottomButton.className = 'nav-button bottom'; bottomButton.innerHTML = ` <svg viewBox="0 0 24 24"> <path d="M7.41 8.59L12 13.17l4.59-4.58L18 10l-6 6-6-6 1.41-1.41z"/> </svg> `; // Add buttons to page document.body.appendChild(topButton); document.body.appendChild(bottomButton); // Scroll variables let scrollInterval; let isScrolling = false; // Smooth scroll function function smoothScroll(targetY, duration = 800) { const startY = window.pageYOffset; const distance = targetY - startY; const startTime = performance.now(); function easeInOutCubic(t) { return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1; } function step(currentTime) { const elapsed = currentTime - startTime; const progress = Math.min(elapsed / duration, 1); const easedProgress = easeInOutCubic(progress); window.scrollTo(0, startY + distance * easedProgress); if (progress < 1) { requestAnimationFrame(step); } } requestAnimationFrame(step); } // Continuous scroll function function startContinuousScroll(direction) { if (isScrolling) return; isScrolling = true; const button = direction === 'up' ? topButton : bottomButton; button.classList.add('scrolling'); scrollInterval = setInterval(() => { const scrollAmount = direction === 'up' ? -15 : 15; window.scrollBy(0, scrollAmount); // Stop if reached limits if (direction === 'up' && window.pageYOffset <= 0) { stopContinuousScroll(); } else if (direction === 'down') { const documentHeight = Math.max( document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight ); if ((window.innerHeight + window.pageYOffset) >= documentHeight - 10) { stopContinuousScroll(); } } }, 20); } function stopContinuousScroll() { if (scrollInterval) { clearInterval(scrollInterval); scrollInterval = null; } isScrolling = false; topButton.classList.remove('scrolling'); bottomButton.classList.remove('scrolling'); } // Button event listeners topButton.addEventListener('click', (e) => { e.preventDefault(); smoothScroll(0); }); bottomButton.addEventListener('click', (e) => { e.preventDefault(); const documentHeight = Math.max( document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight ); smoothScroll(documentHeight - window.innerHeight); }); // Hover events for continuous scrolling topButton.addEventListener('mouseenter', () => { setTimeout(() => { if (topButton.matches(':hover')) { startContinuousScroll('up'); } }, 500); // Delay before starting continuous scroll }); topButton.addEventListener('mouseleave', stopContinuousScroll); bottomButton.addEventListener('mouseenter', () => { setTimeout(() => { if (bottomButton.matches(':hover')) { startContinuousScroll('down'); } }, 500); // Delay before starting continuous scroll }); bottomButton.addEventListener('mouseleave', stopContinuousScroll); // Show/hide buttons based on scroll position function updateButtonVisibility() { const scrollTop = window.pageYOffset; const documentHeight = Math.max( document.body.scrollHeight, document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, document.documentElement.offsetHeight ); const windowHeight = window.innerHeight; // Show top button if scrolled down if (scrollTop > 200) { topButton.classList.add('visible'); } else { topButton.classList.remove('visible'); } // Show bottom button if not at bottom if (scrollTop + windowHeight + 100 < documentHeight) { bottomButton.classList.add('visible'); } else { bottomButton.classList.remove('visible'); } } // Throttled scroll listener let scrollTimeout; window.addEventListener('scroll', () => { if (scrollTimeout) { clearTimeout(scrollTimeout); } scrollTimeout = setTimeout(updateButtonVisibility, 10); }); // Initial visibility check setTimeout(updateButtonVisibility, 100); // Keyboard shortcuts (optional) document.addEventListener('keydown', (e) => { if (e.ctrlKey || e.metaKey) { if (e.key === 'Home') { e.preventDefault(); smoothScroll(0); } else if (e.key === 'End') { e.preventDefault(); smoothScroll(document.body.scrollHeight - window.innerHeight); } } }); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址