// ==UserScript== // @name url-bar-plus 优化的自定义网址输入框 (滚动感知版) // @namespace http://tampermonkey.net/ // @version 4.3 // @description 在网页底部添加一个网址输入框,滚动到底部时自动隐藏,支持多行显示并自适应高度,使用快捷键Ctrl+K隐藏与显示 // @author cat (优化 by Assistant) // @match *://*/* // @grant none // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/508990/url-bar-plus%20%E4%BC%98%E5%8C%96%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E5%9D%80%E8%BE%93%E5%85%A5%E6%A1%86%20%28%E6%BB%9A%E5%8A%A8%E6%84%9F%E7%9F%A5%E7%89%88%29.user.js // @updateURL https://update.greasyfork.icu/scripts/508990/url-bar-plus%20%E4%BC%98%E5%8C%96%E7%9A%84%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BD%91%E5%9D%80%E8%BE%93%E5%85%A5%E6%A1%86%20%28%E6%BB%9A%E5%8A%A8%E6%84%9F%E7%9F%A5%E7%89%88%29.meta.js // ==/UserScript== (function() { 'use strict'; // 样式定义 const styles = ` #custom-url-input { position: fixed; bottom: 0; left: 0; width: 100%; font-size: 16px; padding: 10px; border-top: 2px solid #ccc; background-color: rgba(249, 249, 249, 0.95); z-index: 10000; white-space: pre-wrap; overflow-wrap: break-word; overflow: hidden; min-height: 30px; max-height: 150px; transition: all 0.3s ease; box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1); } #custom-url-input:focus { outline: none; border-top-color: #007BFF; } #custom-url-input:hover { background-color: rgba(249, 249, 249, 1); } #custom-url-input-tooltip { position: fixed; bottom: 100%; left: 10px; background-color: #333; color: #fff; padding: 5px 10px; border-radius: 3px; font-size: 12px; display: none; } `; // 创建样式元素 const styleElement = document.createElement('style'); styleElement.textContent = styles; document.head.appendChild(styleElement); // 创建输入框 const urlInput = document.createElement('div'); urlInput.id = 'custom-url-input'; urlInput.contentEditable = true; urlInput.innerHTML = colorizeUrl(window.location.href); document.body.appendChild(urlInput); // 创建提示框 const tooltip = document.createElement('div'); tooltip.id = 'custom-url-input-tooltip'; tooltip.textContent = 'Ctrl+K: 显示/隐藏 | Enter: 跳转 | Shift+Enter: 换行'; document.body.appendChild(tooltip); // 初始化显示状态 urlInput.style.display = getCookie('urlInputDisplay') || 'block'; // 事件监听器 urlInput.addEventListener('keydown', handleKeyDown); urlInput.addEventListener('input', handleInput); urlInput.addEventListener('focus', () => tooltip.style.display = 'block'); urlInput.addEventListener('blur', () => tooltip.style.display = 'none'); window.addEventListener('popstate', updateUrl); document.addEventListener('keydown', handleGlobalKeyDown); // 新增:滚动事件监听器 window.addEventListener('scroll', handleScroll); // 颜色化网址函数 function colorizeUrl(url) { const parts = url.match(/^([^:]+:)(\/\/[^\/]+)(.*)/); if (!parts) return url; const [, protocol, host, path] = parts; return `${protocol}` + `${host}` + `${path}`; } // 处理键盘事件 function handleKeyDown(event) { if (event.key === 'Enter') { event.preventDefault(); if (!event.shiftKey) { const newUrl = urlInput.innerText.trim(); if (newUrl) { window.location.href = newUrl; } } else { // Shift+Enter: 插入换行 document.execCommand('insertLineBreak'); } // 在每次按下回车键(无论是否有Shift)后更新颜色 urlInput.innerHTML = colorizeUrl(urlInput.innerText); } } // 处理输入事件 function handleInput() { adjustHeight(urlInput); } // 更新URL function updateUrl() { urlInput.innerHTML = colorizeUrl(window.location.href); adjustHeight(urlInput); } // 处理全局键盘事件 function handleGlobalKeyDown(event) { if (event.ctrlKey && event.key === 'k') { event.preventDefault(); toggleUrlInput(); } } // 切换输入框显示状态 function toggleUrlInput() { urlInput.style.display = urlInput.style.display === 'none' ? 'block' : 'none'; setCookie('urlInputDisplay', urlInput.style.display); if (urlInput.style.display === 'block') { urlInput.focus(); } } // 调整高度 function adjustHeight(element) { element.style.height = 'auto'; element.style.height = Math.min(element.scrollHeight, 150) + 'px'; } // 设置 cookie function setCookie(name, value, days = 365) { const date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); const expires = `expires=${date.toUTCString()}`; document.cookie = `${name}=${value};${expires};path=/`; } // 获取 cookie function getCookie(name) { const cookieArr = document.cookie.split(';'); for (let i = 0; i < cookieArr.length; i++) { const cookiePair = cookieArr[i].split('='); if (name === cookiePair[0].trim()) { return decodeURIComponent(cookiePair[1]); } } return null; } // 新增:处理滚动事件 function handleScroll() { if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight - 10) { // 滚动到接近底部时隐藏输入框 urlInput.style.display = 'none'; } else if (getCookie('urlInputDisplay') === 'block') { // 如果不在底部,且之前状态为显示,则显示输入框 urlInput.style.display = 'block'; } } // 初始化 adjustHeight(urlInput); })();