您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Selectively toggle dark mode for any website
- // ==UserScript==
- // @name Darkify
- // @namespace http://yifangu.com
- // @license MIT
- // @version 2024-02-27
- // @description Selectively toggle dark mode for any website
- // @author You
- // @match *://*/*
- // @run-at document-start
- // @inject-into content
- // @grant GM.setValue
- // @grant GM.getValue
- // @grant GM.info
- // ==/UserScript==
- (async function () {
- "use strict";
- if (window.top !== window.self) {
- return;
- }
- const ver = GM.info.script.version;
- const firstRunReadme = [
- "This is your first time running Darkify",
- "Press CTRL+SHIFT+D to toggle on/off dark mode at a given site.",
- "For mobile devices, hold down three fingers for 3 seconds to toggle on/off dark mode.",
- `Version ${ver}`,
- ].join("\n");
- const upgradeReadme = [
- `Darkify has been upgraded to version ${ver}`
- ].join("\n");
- const defaultConfig = {
- enabled: false,
- };
- const savedVer = await GM.getValue("version");
- if (savedVer === undefined) {
- // first run
- alert(firstRunReadme);
- await GM.setValue("version", ver);
- } else if (savedVer !== ver) {
- alert(upgradeReadme);
- await GM.setValue("version", ver);
- }
- function hex(s) {
- return s.split("").map((c) => c.charCodeAt(0).toString(16)).join("");
- }
- const loadConfig = async () => {
- const siteKey = hex(location.hostname);
- const configJson = await GM.getValue(`siteConfig.${siteKey}`, "{}");
- let config = defaultConfig;
- try {
- config = { ...defaultConfig, ...JSON.parse(configJson) };
- } catch (e) {
- // ignore
- }
- return config;
- };
- const saveConfig = async (config) => {
- const siteKey = hex(location.hostname);
- await GM.setValue(`siteConfig.${siteKey}`, JSON.stringify(config));
- }
- const config = await loadConfig();
- const { enabled } = config;
- const toggle = async () => {
- await saveConfig({ ...config, enabled: !enabled });
- location.reload();
- };
- window.addEventListener("keydown", async (e) => {
- // ctrl + shift + d
- if (e.ctrlKey && e.shiftKey && e.key === "D") {
- e.preventDefault();
- await toggle();
- }
- });
- let toggleTimeoutHandle;
- document.addEventListener("touchmove", (e) => {
- const num = e.touches.length;
- if (num === 3) {
- if (toggleTimeoutHandle === undefined) {
- toggleTimeoutHandle = setTimeout(async () => {
- await toggle();
- toggleTimeoutHandle = undefined;
- }, 3000);
- }
- } else {
- if (toggleTimeoutHandle !== undefined) {
- clearTimeout(toggleTimeoutHandle);
- toggleTimeoutHandle = undefined;
- }
- }
- });
- document.addEventListener("touchend", () => {
- if (toggleTimeoutHandle !== undefined) {
- clearTimeout(toggleTimeoutHandle);
- toggleTimeoutHandle = undefined;
- }
- });
- if (!enabled) {
- return;
- }
- const css = `
- :root {
- color-scheme: dark;
- background-color: white;
- filter: invert(100%) hue-rotate(180deg) !important;
- -webkit-font-smoothing: antialiased;
- color: black;
- }
- body {
- color-scheme: light;
- background-color: #000 !important;
- background: linear-gradient(#fff, #fff);
- }
- img:not([src*="svg"]),video,iframe,embed,object,canvas,picture,.logo,.darkify-ignore {
- filter: invert(100%) hue-rotate(180deg) !important;
- }
- img[src*="svg"]:hover {
- background-color: #aaa !important;
- }
- `;
- function darkify() {
- const divs = document.querySelectorAll("div");
- for (const div of divs) {
- if (!div.classList.contains("darkify-ignore")) {
- continue;
- }
- const cs = getComputedStyle(div);
- const bg = cs.backgroundImage;
- const bs = cs.backgroundSize;
- if (bg === "none") {
- continue;
- }
- if (!["cover", "contain"].includes(bs)) {
- continue;
- }
- if (bg.includes(".svg") || bg.includes(".gif")) {
- continue;
- }
- div.classList.add("darkify-ignore");
- }
- if (document.getElementById("darkify")) {
- return;
- }
- const style = document.createElement("style");
- style.id = "darkify";
- style.innerHTML = css;
- const themeColorMeta = document.createElement("meta");
- themeColorMeta.name = "theme-color";
- themeColorMeta.content = "#000000";
- document.head.appendChild(style);
- document.head.appendChild(themeColorMeta);
- }
- darkify();
- document.addEventListener("DOMContentLoaded", darkify);
- })();