您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
在密码输入框右侧插入 iOS 风格小眼睛,只有聚焦时才显示,点击可切换显示/隐藏密码。支持动态加载,Chrome内核浏览器可用。
// ==UserScript== // @name iOS风格密码小眼睛显示/隐藏(聚焦才显示) // @namespace http://tampermonkey.net/ // @version 1.2 // @description 在密码输入框右侧插入 iOS 风格小眼睛,只有聚焦时才显示,点击可切换显示/隐藏密码。支持动态加载,Chrome内核浏览器可用。 // @author 佳佳张 // @match *://*/* // @grant none // @run-at document-end // @license MIT // ==/UserScript== (function () { "use strict"; // 小眼睛图标(SVG) const eyeSVG = { show: ` <svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M1 12s4-7 11-7 11 7 11 7-4 7-11 7-11-7-11-7z"></path> <circle cx="12" cy="12" r="3"></circle> </svg> `, hide: ` <svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M17.94 17.94A10.06 10.06 0 0 1 12 20c-7 0-11-8-11-8a20.56 20.56 0 0 1 5.06-6.94"></path> <path d="M1 1l22 22"></path> </svg> ` }; // 注入样式 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 }); })();