// ==UserScript== // @name Mobile WebTool // @namespace howardzhangdqs // @version 1.0.0 // @author HowardZhangdqs // @description 手机网页工具:全屏切换、页面缩放 // @license WTFPL // @icon https://vitejs.dev/logo.svg // @match *://*/* // @run-at document-idle // @downloadURL none // ==/UserScript== (function () { 'use strict'; const styles = ":host{all:initial;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.mwt-container{position:fixed;top:8px;left:8px;z-index:2147483647;user-select:none;-webkit-user-select:none;transition:opacity .3s}.mwt-btn{width:38px;height:38px;border-radius:10px;border:none;background:#0000008c;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 2px 8px #0000004d;transition:background .2s,transform .15s;-webkit-tap-highlight-color:transparent;padding:0;line-height:1}.mwt-btn svg{width:20px;height:20px}.mwt-btn:active{background:#000000bf;transform:scale(.92)}.mwt-menu{margin-top:6px;background:#1e1e1eeb;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-radius:10px;padding:4px 0;min-width:120px;box-shadow:0 4px 16px #0006;overflow:hidden;opacity:0;transform:translateY(-8px) scale(.95);transition:opacity .2s,transform .2s;pointer-events:none}.mwt-menu.mwt-open{opacity:1;transform:translateY(0) scale(1);pointer-events:auto}.mwt-zoom-display{padding:6px 14px;text-align:center;font-size:12px;color:#ffffff80;border-bottom:1px solid rgba(255,255,255,.08);font-variant-numeric:tabular-nums}.mwt-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:9px 14px;border:none;background:none;color:#fff;font-size:14px;cursor:pointer;text-align:left;transition:background .15s;-webkit-tap-highlight-color:transparent;font-family:inherit}.mwt-menu-item:active{background:#ffffff1a}.mwt-menu-item+.mwt-menu-item{border-top:1px solid rgba(255,255,255,.06)}.mwt-menu-icon{width:18px;height:18px;flex-shrink:0;display:flex;align-items:center;justify-content:center}.mwt-menu-icon svg{width:100%;height:100%}"; const svgTool = ''; const svgFullscreen = ''; const svgZoomIn = ''; const svgZoomOut = ''; const svgReset = ''; const ZOOM_STEP = 10; const ZOOM_MIN = 30; const ZOOM_MAX = 200; const AUTO_HIDE_MS = 1e4; (() => { let currentZoom = 100; let menuOpen = false; let hideTimer; const host = document.createElement("div"); host.id = "mwt-root"; document.body.appendChild(host); const shadow = host.attachShadow({ mode: "closed" }); const styleEl = document.createElement("style"); styleEl.textContent = styles; shadow.appendChild(styleEl); const container = document.createElement("div"); container.className = "mwt-container"; shadow.appendChild(container); const btn = document.createElement("button"); btn.className = "mwt-btn"; btn.innerHTML = svgTool; container.appendChild(btn); const menu = document.createElement("div"); menu.className = "mwt-menu"; container.appendChild(menu); const zoomDisplay = document.createElement("div"); zoomDisplay.className = "mwt-zoom-display"; zoomDisplay.textContent = `${currentZoom}%`; menu.appendChild(zoomDisplay); function createMenuItem(icon, label, onClick) { const item = document.createElement("button"); item.className = "mwt-menu-item"; item.innerHTML = `${icon}${label}`; item.addEventListener("click", (e) => { e.stopPropagation(); resetHideTimer(); onClick(); }); menu.appendChild(item); return item; } const fullscreenItem = createMenuItem(svgFullscreen, "全屏", toggleFullscreen); createMenuItem(svgZoomIn, "放大", zoomIn); createMenuItem(svgZoomOut, "缩小", zoomOut); createMenuItem(svgReset, "重置缩放", zoomReset); function resetHideTimer() { clearTimeout(hideTimer); hideTimer = setTimeout(() => { container.style.opacity = "0"; container.style.pointerEvents = "none"; setTimeout(() => host.remove(), 300); }, AUTO_HIDE_MS); } resetHideTimer(); function updateZoomDisplay() { zoomDisplay.textContent = `${currentZoom}%`; document.documentElement.style.zoom = `${currentZoom}%`; } function toggleFullscreen() { if (document.fullscreenElement) { document.exitFullscreen(); } else { document.documentElement.requestFullscreen(); } toggleMenu(); } function updateFullscreenIcon() { fullscreenItem.querySelector(".mwt-menu-icon").innerHTML = svgFullscreen; } function zoomIn() { currentZoom = Math.min(currentZoom + ZOOM_STEP, ZOOM_MAX); updateZoomDisplay(); } function zoomOut() { currentZoom = Math.max(currentZoom - ZOOM_STEP, ZOOM_MIN); updateZoomDisplay(); } function zoomReset() { currentZoom = 100; updateZoomDisplay(); } function toggleMenu() { menuOpen = !menuOpen; menu.classList.toggle("mwt-open", menuOpen); } btn.addEventListener("click", (e) => { e.stopPropagation(); toggleMenu(); resetHideTimer(); }); document.addEventListener("click", () => { if (menuOpen) { menuOpen = false; menu.classList.remove("mwt-open"); } }); document.addEventListener("fullscreenchange", () => { updateFullscreenIcon(); }); })(); })();