// ==UserScript== // @name 缩小标题字体,缩小图片,并允许通过快捷键取消更改 // @namespace http://tampermonkey.net/ // @version 3.3 // @description 摸鱼的艺术,更新hover时恢复图片大小, Alt+Shift+F 取消更改 // @author chenjiamian // @match http://*/* // @match https://*/* // @exclude *.png // @exclude *.jpg // @exclude *.gif // @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== // @grant none // @license MIT // @downloadURL none // ==/UserScript== (function() { 'use strict'; let isEnabled = true; const originalFontSizes = new WeakMap(); let originalStyles = new Map(); // 用于存储原始样式 // 保存元素的原始样式 function saveOriginalStyle(element) { if (!originalStyles.has(element)) { originalStyles.set(element, { fontSize: element.style.fontSize, fontWeight: element.style.fontWeight, maxWidth: element.style.maxWidth, height: element.style.height }); } } // 恢复元素的原始样式 function restoreOriginalStyle(element) { if (originalStyles.has(element)) { const styles = originalStyles.get(element); element.style.fontSize = styles.fontSize; element.style.fontWeight = styles.fontWeight; element.style.maxWidth = styles.maxWidth; element.style.height = styles.height; originalStyles.delete(element); } } // 记录原始字体大小 function recordOriginalFontSizes() { document.querySelectorAll('*').forEach(ele => { if (!['HTML', 'HEAD', 'BODY'].includes(ele.tagName)) { const fontSize = parseFloat(getComputedStyle(ele).fontSize); originalFontSizes.set(ele, fontSize); saveOriginalStyle(ele); } }); } function addCSS(cssText) { const style = document.createElement('style'); style.textContent = cssText; (document.head || document.documentElement).appendChild(style); } function isDescendantOfPhotoShowViewer(element) { let parent = element.parentElement; while (parent) { if (parent.id === 'photoShowViewer') { return true; } parent = parent.parentElement; } return false; } function processElements() { if (!isEnabled) return; // 如果禁用,则不处理元素 document.querySelectorAll('*').forEach(ele => { if (!['HTML', 'HEAD', 'BODY'].includes(ele.tagName)) { const originalFontSize = originalFontSizes.get(ele) || 16; saveOriginalStyle(ele); // 保存原始样式 if (originalFontSize > 17) { ele.style.fontWeight = 'bold'; } else{ ele.style.fontWeight = ''; } ele.style.fontSize = '16px'; } if (ele.tagName === 'IMG' && !isDescendantOfPhotoShowViewer(ele)) { const imgWidth = parseFloat(getComputedStyle(ele).width); if (imgWidth > 500) { ele.dataset.originalWidth = ele.width; ele.dataset.originalHeight = ele.height; saveOriginalStyle(ele); // 保存原始样式 ele.style.setProperty('max-width', '150px', 'important'); ele.style.setProperty('height', 'auto', 'important'); } } }); } // 恢复所有元素的原始样式 function restoreAllOriginalStyles() { document.querySelectorAll('*').forEach(ele => { restoreOriginalStyle(ele); }); originalFontSizes.clear(); } // 使用 MutationObserver 监听 DOM 变化 const observer = new MutationObserver((mutations) => { if (!isEnabled) return; // 如果禁用,则不处理元素 mutations.forEach((mutation) => { if (mutation.type === 'childList') { mutation.addedNodes.forEach((node) => { if (node.nodeType === Node.ELEMENT_NODE) { // 为新添加的元素记录原始字体大小 const fontSize = parseFloat(getComputedStyle(node).fontSize); originalFontSizes.set(node, fontSize); saveOriginalStyle(node); processElements(); } }); } }); }); // 快捷键处理函数 function handleKeyPress(event) { if (event.altKey && event.shiftKey && event.key === 'F') { isEnabled = !isEnabled; if (isEnabled) { originalStyles = new Map(); // 重新启用时清空原始样式 recordOriginalFontSizes(); processElements(); console.log('字体和图片缩小已启用'); } else { restoreAllOriginalStyles(); console.log('字体和图片缩小已禁用,已恢复原始样式'); } } } // 确保在 DOM 加载完成后执行初始化 function initialize() { recordOriginalFontSizes(); processElements(); observer.observe(document.body, { childList: true, subtree: true }); window.addEventListener('keydown', handleKeyPress); console.log('字体和图片缩小脚本已启用,按 Alt+Shift+F 切换'); } // 在 DOMContentLoaded 事件触发时执行初始化 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initialize); } else { // 如果 DOMContentLoaded 已经触发,立即执行初始化 initialize(); } // 使用 requestAnimationFrame 平滑应用样式 function update() { if(isEnabled){ processElements(); } requestAnimationFrame(update); } requestAnimationFrame(update); // 处理动态加载的内容 window.addEventListener('hashchange', processElements); window.addEventListener('popstate', processElements); const originalPushState = history.pushState; history.pushState = function() { originalPushState.apply(this, arguments); processElements(); }; })();