// ==UserScript== // @name iOS风格密码小眼睛显示/隐藏(聚焦才显示) // @namespace http://tampermonkey.net/ // @version 1.2 // @description 在密码输入框右侧插入 iOS 风格小眼睛,只有聚焦时才显示,点击可切换显示/隐藏密码。支持动态加载,Chrome内核浏览器可用。 // @author 佳佳张 // @match *://*/* // @grant none // @run-at document-end // @license MIT // @downloadURL https://update.greasyfork.icu/scripts/551138/iOS%E9%A3%8E%E6%A0%BC%E5%AF%86%E7%A0%81%E5%B0%8F%E7%9C%BC%E7%9D%9B%E6%98%BE%E7%A4%BA%E9%9A%90%E8%97%8F%EF%BC%88%E8%81%9A%E7%84%A6%E6%89%8D%E6%98%BE%E7%A4%BA%EF%BC%89.user.js // @updateURL https://update.greasyfork.icu/scripts/551138/iOS%E9%A3%8E%E6%A0%BC%E5%AF%86%E7%A0%81%E5%B0%8F%E7%9C%BC%E7%9D%9B%E6%98%BE%E7%A4%BA%E9%9A%90%E8%97%8F%EF%BC%88%E8%81%9A%E7%84%A6%E6%89%8D%E6%98%BE%E7%A4%BA%EF%BC%89.meta.js // ==/UserScript== (function () { "use strict"; // 小眼睛图标(SVG) const eyeSVG = { show: ` `, hide: ` ` }; // 注入样式 const style = document.createElement("style"); style.textContent = ` .tm-eye-btn { position: absolute; right: 6px; top: 50%; transform: translateY(-50%); cursor: pointer; color: rgba(60, 60, 67, 0.6); /* iOS 灰色半透明 */ background: rgba(118, 118, 128, 0.12); /* iOS 输入框按钮背景 */ border-radius: 50%; padding: 4px; display: none; /* 默认隐藏 */ align-items: center; justify-content: center; transition: color 0.2s ease, background 0.2s ease; } .tm-eye-btn:hover { color: rgba(60, 60, 67, 0.9); background: rgba(118, 118, 128, 0.2); } .tm-eye-wrapper { position: relative; display: inline-block; width: 100%; } input.tm-eye-added { padding-right: 34px !important; /* 给按钮留出空间 */ } input.tm-eye-focus + .tm-eye-btn { display: flex !important; /* 聚焦时显示 */ } `; document.head.appendChild(style); // 给单个密码框添加小眼睛 function addEye(input) { if (!(input instanceof HTMLInputElement)) return; if (input.type !== "password") return; if (input.classList.contains("tm-eye-added")) return; input.classList.add("tm-eye-added"); const wrapper = document.createElement("div"); wrapper.className = "tm-eye-wrapper"; input.parentNode.insertBefore(wrapper, input); wrapper.appendChild(input); const btn = document.createElement("div"); btn.className = "tm-eye-btn"; btn.innerHTML = eyeSVG.show; wrapper.appendChild(btn); btn.addEventListener("click", () => { if (input.type === "password") { input.type = "text"; btn.innerHTML = eyeSVG.hide; } else { input.type = "password"; btn.innerHTML = eyeSVG.show; } input.focus(); // 点击后保持光标 }); // 聚焦时显示按钮 input.addEventListener("focus", () => { input.classList.add("tm-eye-focus"); }); // 失焦时隐藏按钮 input.addEventListener("blur", () => { input.classList.remove("tm-eye-focus"); }); } // 扫描页面 function scan() { document.querySelectorAll('input[type="password"]').forEach(addEye); } // 初始执行 scan(); // 监听 DOM 动态变化 const observer = new MutationObserver(() => scan()); observer.observe(document.body, { childList: true, subtree: true }); })();