缩小标题字体,缩小图片,并允许通过快捷键取消更改

摸鱼的艺术,更新hover时恢复图片大小, Alt+Shift+F 取消更改

// ==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
// ==/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();
    };
})();