// ==UserScript== // @name 软替换网页默认字体 // @namespace chNt6w8D6cVSQE93BSC8VS6QxNshGaSP9QcK82kruzbN5E4K2TJKxbNjpAXDfJKe // @description 替换网页默认字体,默认为 MiSans、FZYouSong GBK 509R(方正悠宋)、Cascadia Mono。可根据需求修改脚本中的字体设置。使用前需确保已安装所需字体。 // @version 6 // @license Apache License 2.0 // @author Anonymous // @compatible firefox // @compatible safari // @compatible chrome // @match *://*/* // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand // @run-at document-start // @downloadURL none // ==/UserScript== (function () { "use strict"; const defaultConfig = { sans: ["MiSans", "MiSans L3", "Arial"], serif: ["FZYouSong GBK 509R", "Times New Roman", "Arial"], mono: ["Cascadia Mono", "Arial", "Arial"], }; function loadConfig() { return { sans: GM_getValue("sansFonts", defaultConfig.sans), serif: GM_getValue("serifFonts", defaultConfig.serif), mono: GM_getValue("monoFonts", defaultConfig.mono), }; } function saveConfig() { GM_setValue("sansFonts", config.sans); GM_setValue("serifFonts", config.serif); GM_setValue("monoFonts", config.mono); } function createConfigUI() { const overlay = document.createElement("div"); overlay.style = ` position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); display: flex; justify-content: center; align-items: center; z-index: 999999; `; const panel = document.createElement("div"); panel.style = ` background: #fff; padding: 24px; border-radius: 12px; width: 500px; max-height: 80vh; overflow-y: auto; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); font-family: Arial, sans-serif; `; const title = document.createElement("h2"); title.textContent = "软替换网页默认字体配置"; title.style = ` margin: 0 0 24px; text-align: center; color: #333; `; panel.appendChild(title); const createInputGroup = (type, label) => { const container = document.createElement("div"); container.style.marginBottom = "20px"; const titleLabel = document.createElement("label"); titleLabel.textContent = label; titleLabel.style = ` display: block; margin-bottom: 12px; font-weight: 600; color: #555; `; container.appendChild(titleLabel); for (let i = 0; i < 3; i++) { const input = document.createElement("input"); input.type = "text"; input.value = config[type][i]; input.dataset.type = type; input.dataset.index = i; input.placeholder = `字体 ${i + 1}`; input.style = ` width: 100%; padding: 8px; margin-bottom: 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; `; const labelEl = document.createElement("label"); labelEl.textContent = `备选字体 ${i + 1}:`; labelEl.style = ` display: block; margin-bottom: 4px; color: #777; `; container.appendChild(labelEl); container.appendChild(input); } return container; }; panel.appendChild(createInputGroup("sans", "无衬线字体")); panel.appendChild(createInputGroup("serif", "衬线字体")); panel.appendChild(createInputGroup("mono", "等宽字体")); const importExportSection = document.createElement("div"); importExportSection.style.marginBottom = "20px"; const buttonContainer = document.createElement("div"); buttonContainer.style.display = "flex"; buttonContainer.style.gap = "12px"; const importInput = document.createElement("input"); importInput.type = "file"; importInput.accept = ".json"; importInput.style.display = "none"; const importBtn = document.createElement("button"); importBtn.textContent = "导入配置"; importBtn.style = ` flex: 1; padding: 10px; background: #4CAF50; color: white; border: none; border-radius: 4px; cursor: pointer; `; importBtn.onclick = () => importInput.click(); importInput.onchange = async () => { try { const file = importInput.files[0]; const content = await file.text(); const importedConfig = JSON.parse(content); Object.assign(config, importedConfig); saveConfig(); alert("配置已导入,请刷新页面生效"); overlay.remove(); } catch (e) { alert("导入失败:无效的配置文件"); } }; // 导出功能 const exportBtn = document.createElement("button"); exportBtn.textContent = "导出配置"; exportBtn.style = ` flex: 1; padding: 10px; background: #007BFF; color: white; border: none; border-radius: 4px; cursor: pointer; `; exportBtn.onclick = () => { const blob = new Blob([JSON.stringify(config, null, 2)], { type: "application/json", }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = "font-config.json"; a.click(); URL.revokeObjectURL(url); }; buttonContainer.appendChild(importBtn); buttonContainer.appendChild(exportBtn); importExportSection.appendChild(buttonContainer); panel.appendChild(importExportSection); // 保存按钮 const saveBtn = document.createElement("button"); saveBtn.textContent = "保存配置"; saveBtn.style = ` width: 100%; padding: 12px; background: #333; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; `; saveBtn.onclick = () => { const inputs = panel.querySelectorAll("input"); inputs.forEach((input) => { config[input.dataset.type][input.dataset.index] = input.value; }); saveConfig(); alert("配置已保存,刷新页面后生效"); overlay.remove(); }; panel.appendChild(saveBtn); overlay.appendChild(panel); document.body.appendChild(overlay); } function generateCSS() { const [sans1, sans2, sans3] = config.sans; const [serif1, serif2, serif3] = config.serif; const [mono1, mono2, mono3] = config.mono; return ` /* 基本字体 */ @font-face{font-family:sans-serif;src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:serif;src:local(${serif1}),local(${serif2}),local(${serif3});} @font-face{font-family:monospace;src:local(${mono1}),local(${mono2}),local(${mono3});} /* 无衬线字体 拉丁文 */ @font-face{font-family:"Arial";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Cambria";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Calibri";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Verdana";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Helvetica";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Helvetica Neue";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"HelveticaNeue";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"San Francisco";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"San Francisco Pro";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Segoe UI";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Google Sans";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Google Sans Text";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Roboto";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Noto Sans";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Lucida Sans";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Lucida Grande";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"DejaVu Sans";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Liberation Sans";src:local(${sans1}),local(${sans2}),local(${sans3});} @font-face{font-family:"Open Sans";src:local(${sans1}),local(${sans2}),local(${sans3});} /* 无衬线字体 简化字形 */ @font-face{font-family:"HarmonyOS Sans";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 鸿蒙字体 */ @font-face{font-family:"Noto Sans SC";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 谷歌豆腐字体 */ @font-face{font-family:"SimHei";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 中易黑体 ( Windows 里的 黑体 ) */ @font-face{font-family:"黑体";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 中易黑体 ( Windows 里的 黑体 ) */ @font-face{font-family:"HarmonyOS Sans";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 鸿蒙字体 */ @font-face{font-family:"Noto Sans SC";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 谷歌豆腐字体 */ @font-face{font-family:"SimHei";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 中易黑体 ( Windows 里的 黑体 ) */ @font-face{font-family:"黑体";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 中易黑体 ( Windows 里的 黑体 ) */ @font-face{font-family:"Microsoft YaHei";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 微软雅黑 */ @font-face{font-family:"微软雅黑";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 微软雅黑 */ @font-face{font-family:"Microsoft YaHei UI";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 微软雅黑 UI */ @font-face{font-family:"微软雅黑 UI";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 微软雅黑 UI */ @font-face{font-family:"PingFang SC";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 苹方 */ @font-face{font-family:"Hiragino Sans GB";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 冬青黑体 */ @font-face{font-family:"STHeiti";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 华文黑体 */ /* 无衬线字体 传统字形 */ @font-face{font-family:"Noto Sans TC";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 谷歌豆腐字体 */ @font-face{font-family:"Microsoft JhengHei";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 微軟正黑體 */ @font-face{font-family:"微軟正黑體";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 微軟正黑體 */ @font-face{font-family:"Microsoft JhengHei UI";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 微軟正黑體 */ @font-face{font-family:"微軟正黑體修正";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 微軟正黑體 */ @font-face{font-family:"MHei";src:local(${sans1}),local(${sans2}),local(${sans3});}/* 蒙纳黑体 */ /* 衬线字体 简化字形 */ @font-face{font-family:"SimSun";src:local(${serif1}),local(${serif2}),local(${serif3});}/* 中易宋体 ( Windows 里的 宋体 ) */ @font-face{font-family:"宋体";src:local(${serif1}),local(${serif2}),local(${serif3});}/* 中易宋体 ( Windows 里的 宋体 ) */ @font-face{font-family:"NSimSun";src:local(${serif1}),local(${serif2}),local(${serif3});}/* 中易新宋体 ( Windows 里的 新宋体 ) */ @font-face{font-family:"新宋体";src:local(${serif1}),local(${serif2}),local(${serif3});}/* 中易新宋体 ( Windows 里的 新宋体 ) */ @font-face{font-family:"FangSong";src:local(${serif1}),local(${serif2}),local(${serif3});}/* 中易仿宋 ( Windows 里的 仿宋 ) */ @font-face{font-family:"FangSong_GB2312";src:local(${serif1}),local(${serif2}),local(${serif3});}/* 中易仿宋 ( Windows 里的 仿宋 ) */ @font-face{font-family:"仿宋";src:local(${serif1}),local(${serif2}),local(${serif3});}/* 中易仿宋 ( Windows 里的 仿宋 ) */ @font-face{font-family:"仿宋_GB2312";src:local(${serif1}),local(${serif2}),local(${serif3});}/* 中易仿宋 ( Windows 里的 仿宋 ) */ @font-face{font-family:"STSong";src:local(${serif1}),local(${serif2}),local(${serif3});}/* 华文宋体 */ @font-face{font-family:"STFangsong";src:local(${serif1}),local(${serif2}),local(${serif3});}/* 华文仿宋 */ @font-face{font-family:"STZhongsong";src:local(${serif1}),local(${serif2}),local(${serif3});}/* 华文中宋 */ /* 等宽字体(代码) */ @font-face{font-family:"Menlo";src:local(${mono1}),local(${mono2}),local(${mono3});} @font-face{font-family:"Monaco";src:local(${mono1}),local(${mono2}),local(${mono3});} @font-face{font-family:"Consolas";src:local(${mono1}),local(${mono2}),local(${mono3});} @font-face{font-family:"Courier";src:local(${mono1}),local(${mono2}),local(${mono3});} @font-face{font-family:"Courier New";src:local(${mono1}),local(${mono2}),local(${mono3});} @font-face{font-family:"Andale Mono";src:local(${mono1}),local(${mono2}),local(${mono3});} @font-face{font-family:"Ubuntu Mono";src:local(${mono1}),local(${mono2}),local(${mono3});} @font-face{font-family:"Fira Code";src:local(${mono1}),local(${mono2}),local(${mono3});} @font-face{font-family:"Fira Mono";src:local(${mono1}),local(${mono2}),local(${mono3});} @font-face{font-family:"DejaVu Sans Mono";src:local(${mono1}),local(${mono2}),local(${mono3});} @font-face{font-family:"Liberation Mono";src:local(${mono1}),local(${mono2}),local(${mono3});} @font-face{font-family:"Source Code Pro";src:local(${mono1}),local(${mono2}),local(${mono3});} /* 字体渲染优化 */ body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;} `; } const config = loadConfig(); GM_registerMenuCommand("配置界面", createConfigUI); GM_addStyle(generateCSS()); })();