您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
按住 Ctrl/Option 点击 GitHub 页面中的图片,即可在当前页面预览原图,支持滚轮缩放
当前为
// ==UserScript== // @name Git Image Preview (Ctrl/Option Click) // @namespace https://github.com/stuarthua/git-image-preview // @version 1.0.1 // @description 按住 Ctrl/Option 点击 GitHub 页面中的图片,即可在当前页面预览原图,支持滚轮缩放 // @author stuarthua // @match https://github.com/* // @icon https://raw.githubusercontent.com/stuarthua/git-image-preview/main/images/icon.png // @homepageURL https://github.com/stuarthua/git-image-preview // @license MIT // @grant GM_addStyle // ==/UserScript== (function () { 'use strict'; // Add custom CSS for the modal GM_addStyle(` .image-preview-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.8); display: flex; justify-content: center; align-items: center; z-index: 9999; } .image-preview-overlay img { max-width: 90%; max-height: 90%; box-shadow: 0 0 20px black; transition: transform 0.2s ease; } .image-preview-overlay .close-button { position: absolute; top: 20px; right: 20px; color: white; font-size: 30px; cursor: pointer; } `); function showImagePreview(src) { const overlay = document.createElement('div'); overlay.className = 'image-preview-overlay'; const img = document.createElement('img'); img.src = src; let scale = 1; overlay.addEventListener('wheel', (e) => { e.preventDefault(); scale += e.deltaY < 0 ? 0.1 : -0.1; scale = Math.min(Math.max(scale, 0.5), 5); img.style.transform = `scale(${scale})`; }); const closeButton = document.createElement('span'); closeButton.className = 'close-button'; closeButton.textContent = '×'; closeButton.onclick = () => document.body.removeChild(overlay); overlay.appendChild(img); overlay.appendChild(closeButton); overlay.onclick = (e) => { if (e.target === overlay) { document.body.removeChild(overlay); } }; document.body.appendChild(overlay); } // Listen in capture phase to intercept before default behavior document.addEventListener('click', function (e) { const link = e.target.closest('a'); if (!link || !link.querySelector('img')) return; const img = link.querySelector('img'); const isInMarkdown = link.closest('.markdown-body'); const isCtrlOrOptionPressed = e.ctrlKey || e.altKey || e.metaKey; if (img && isInMarkdown && isCtrlOrOptionPressed) { e.preventDefault(); e.stopImmediatePropagation(); showImagePreview(img.src); } }, true); })();