Greasy Fork

Greasy Fork is available in English.

旋转水印(网址定制)

在左上角显示旋转 45° 的文字水印,可定制梯形背景、透明度、颜色、大小等

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         旋转水印(网址定制)
// @namespace    http://tampermonkey.net/
// @version      1.8
// @description  在左上角显示旋转 45° 的文字水印,可定制梯形背景、透明度、颜色、大小等
// @author       aotmd
// @match        *://*/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // ✅ 网址配置(不同网站不同样式)
    const config = {
        "example.com": {
            text: "示例网站",
            fontSize: 24,
            textColor: "#000000",
            backgroundColor: "#ffcccc",
            opacity: 0.6,
            trapezoidHeight: 30,  // 梯形高度
            strokeColor: "#ff0000"
        },
        "10.80.20.111": {
            text: "测试环境",
            fontSize: 30,
            textColor: "#ffffff",
            backgroundColor: "blue",
            opacity: 0.7,
            trapezoidHeight: 35,
            strokeColor: "#ffffff"
        },
        "10.97.192.86": {
            text: "开发环境",
            fontSize: 30,
            textColor: "#ffffff",
            backgroundColor: "#ff0000",
            opacity: 0.7,
            trapezoidHeight: 35,
            strokeColor: "#ffffff"
        }
    };

    // 获取当前网站的 host
    const host = window.location.hostname;
    let siteConfig = null;
    for (const site in config) {
        if (host.includes(site)) {
            siteConfig = config[site];
            break;
        }
    }

    // 如果当前网址有匹配的配置,则生成水印
    if (siteConfig) {
        const { text, fontSize, textColor, backgroundColor, opacity, trapezoidHeight, strokeColor } = siteConfig;

        const canvas = document.createElement("canvas");
        const ctx = canvas.getContext("2d");

        // 计算文字尺寸
        ctx.font = `${fontSize}px Arial`;
        const textWidth = fontSize * 3.11;
        const textHeight = fontSize * 1.5; // 文字高度

        // 计算旋转后画布大小
        const canvasSize = Math.ceil(Math.sqrt((textWidth + trapezoidHeight * 2) ** 2 + (textHeight + trapezoidHeight * 2) ** 2));
        canvas.width = canvasSize;
        canvas.height = canvasSize;

        // 旋转画布
        ctx.translate(canvasSize / 2, canvasSize / 2);
        ctx.rotate(-Math.PI / 4); // 逆时针旋转 45°
        ctx.translate(-canvasSize / 2, -canvasSize / 2);

        // ✅ 绘制“底边 45° 的梯形”背景
        ctx.globalAlpha = opacity;
        ctx.fillStyle = backgroundColor;
        ctx.beginPath();

        // 根据梯形高度计算底边的基线长度
        const diagonalLength = Math.sqrt(Math.pow(canvasSize, 2) * 2); // 画布的对角线
        const bottomWidth = diagonalLength;  // 底边等于对角线

        // 设置梯形的高度(垂直方向增加)
        const topWidth = textWidth * 999;  // 上边较短
        const centerX = canvasSize / 2;
        const bottomY = fontSize+trapezoidHeight;  // 梯形底边的基线在画布的底部基线位置
        const topY = bottomY - fontSize-trapezoidHeight; // 高度垂直向上增加
        debugger

        // 计算梯形的四个顶点
        ctx.moveTo(centerX - topWidth / 2, topY);  // 顶边左侧
        ctx.lineTo(centerX + topWidth / 2, topY);  // 顶边右侧
        ctx.lineTo(centerX + bottomWidth / 2, bottomY); // 底边右侧
        ctx.lineTo(centerX - bottomWidth / 2, bottomY); // 底边左侧
        ctx.closePath();
        ctx.fill();

        // ✅ 绘制边框
        ctx.strokeStyle = strokeColor;
        ctx.lineWidth = 2;
        ctx.stroke();

        // ✅ 绘制文字
        ctx.fillStyle = textColor;
        ctx.globalAlpha = 1; // 文字不透明
        ctx.textAlign = "center";  // 水平居中
        ctx.textBaseline = "middle"; // 垂直居中
        ctx.font = `${fontSize}px Arial`; // 设置文字大小
        ctx.fillText(text, centerX, (topY + bottomY) / 2);  // 文字垂直居中

        // ✅ 生成图片并插入页面
        const img = document.createElement("img");
        img.src = canvas.toDataURL();
        img.style.position = "fixed";
        img.style.top = "0px";
        img.style.left = "0px";
        img.style.zIndex = "9999";
        img.style.pointerEvents = "none"; // 让鼠标事件穿透
        document.body.appendChild(img);
    }
})();