// ==UserScript== // @name QQ邮箱换肤助手 // @namespace http://tampermonkey.net/ // @version 2026.8.29 // @description 在页面右上角增加"换肤"按钮 // @author AN drew // @match https://*.mail.qq.com/* // @grant GM_getValue // @grant GM_setValue // @grant GM_addStyle // @grant GM_xmlhttpRequest // @grant unsafeWindow // @connect bing.com // ==/UserScript== (function() { 'use strict'; // ---------- 皮肤配置(包含背景图)---------- const SKINS = [ { name: '默认', bodyClass: '', previewClass: 'setting-theme-default', bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_default.2x.1cab96d.png)' }, { name: 'Bing每日壁纸', bodyClass: 'page-theme-bing', previewClass: 'setting-theme-bing', bgImage: 'url(data:image/png;base64,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)' }, { name: '自定义壁纸', bodyClass: 'page-theme-custom', previewClass: 'setting-theme-custom', bgImage: 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAawAAADSCAYAAAAWl/SpAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABElSURBVHhe7dwvu+40t8Xh802RSCQW9TokBoVDYDAYHJ7vtN8zONc8O1cYmUmfJl3P3PsnbrOatGnTZPTfev7n77///gQAwLsjsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUYf/7556e//vrLLsO6P/74w/59F/WT+zu+TARWQb///vuQK/8ONLG49oZ3m3h++umnT998882nH3744dPPP//8TxtduYwm634/w+mJ/GkKd+2XjtWPP/74z3HT8ZPffvvN1tlB2/nuu+/+2e47nUME6RkE1mEnrtJjInBc+XegCcW1N2i5q/dRvv/++3+18dtvv/30n//8Z7lPVb5fRzi9v31A3jWbgLP+1TFzde5Sm9y2Tgak04a1AjT6ndDaj8A6RCerBo9O3t1X0/0gbbny76BSYGkCcm0UXc27Oj31uasfNMG5eru4bd4x6x8XHq0TF25xF+z88ssvts5d6rdff/31/8NJ54Pbvqh9bh14HYG1mQZmPznran3ngG3X3XPl30GlwNKE5Nooetzl6vSydYirs5Pb5h3RP3HH5bSPAXuq7+qEV8bH6A529aLCUTvUHt2lqc3xeDMLphG170RQf80IrI00SY1ObDfRxeC4yq0/uPIr+rbtVimw1FeujbJ6rLJ1aAJ0dXZy270j+sct2+Hq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)' }, { name: '晴空', bodyClass: 'page-theme-sky', previewClass: 'setting-theme-sky', bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_sky.44bff10.svg)' }, { name: '青竹', bodyClass: 'page-theme-bamboo', previewClass: 'setting-theme-bamboo', bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_bamboo.c6be1ed.svg)' }, { name: '松石', bodyClass: 'page-theme-turquoise', previewClass: 'setting-theme-turquoise', bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_turquoise.f10f940.svg)' }, { name: '花火', bodyClass: 'page-theme-firework', previewClass: 'setting-theme-firework', bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_fireworks.727f25b.svg)' }, { name: '沉墨', bodyClass: 'page-theme-ink', previewClass: 'setting-theme-ink', bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_ink.ab3a2fe.svg)' }, { name: '菖蒲', bodyClass: 'page-theme-calamus', previewClass: 'setting-theme-calamus', bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_calamus.c93ef81.svg)' }, { name: '水的旅程', bodyClass: 'page-theme-waterjourney', previewClass: 'setting-theme-waterjourney', bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_waterjourney.2x.667be27.png)' }, { name: '东方青绿', bodyClass: 'page-theme-orientalgreen page-color-theme', previewClass: 'setting-theme-orientalgreen', bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_orientalgreen.2x.c0bc943.png)' }, { name: '竹林情风', bodyClass: 'page-theme-bambooforest', previewClass: 'setting-theme-bambooforest', bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_bambooforest.2x.b8cc170.png)' }, { name: '桃花微雨', bodyClass: 'page-theme-blossomrain', previewClass: 'setting-theme-blossomrain', bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme-blossomrain.2x.2040932.png)' } ]; // 所有可能的 body 皮肤类(用于清除) const ALL_BODY_CLASSES = [ 'page-theme-default', 'page-theme-bing', 'page-theme-custom', 'page-theme-sky', 'page-theme-bamboo', 'page-theme-turquoise', 'page-theme-firework', 'page-theme-ink', 'page-theme-calamus', 'page-theme-waterjourney', 'page-theme-bambooforest', 'page-theme-blossomrain', 'page-theme-orientalgreen', 'page-color-theme', ]; const SKIN_CLASSES_KEY = 'qqmail_skin_classes'; const STYLE_SETTINGS_KEY = 'qqmail_style_settings'; const DEFAULT_STYLE_SETTINGS = { header: { opacity: 0.35, blur: 0, opacityEnabled: false, blurEnabled: false }, sidebar: { opacity: 0.35, blur: 0, opacityEnabled: false, blurEnabled: false }, route: { opacity: 0.85, blur: 5, opacityEnabled: false, blurEnabled: false } }; // ===== Bing每日壁纸 ===== const BING_STORAGE_KEY_IMAGE = 'bing_bg_image_base64'; const BING_STORAGE_KEY_DATE = 'bing_bg_image_date'; const BING_API_URL = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1'; // ===== Bing 预览翻转持久化:0=不持久化,1=持久化 ---- const BING_FLIP_PERSIST = 0; // 1 开启持久化,0 关闭 const BING_FLIP_STATE_KEY = 'bing_flip_state'; // 存储值:'real' 或 'placeholder' // ===== 自定义壁纸 ===== const CUSTOM_WALLPAPER_KEY = 'custom_wallpaper_base64'; // ===== 壁纸锁定状态 ===== const BING_LOCKED_KEY = 'bing_locked'; const CUSTOM_LOCKED_KEY = 'custom_locked'; // ---- 锁定样式配置:1=黄锁图标,2=黄黑条纹 ---- const LOCK_STYLE = 1; // 默认黄锁图标,若想切换黄黑条纹则改为 2 // 自定义壁纸平铺模式(上传后使用 repeat) const CUSTOM_WALLPAPER_MODE_KEY = 'custom_wallpaper_mode'; // 'cover' 或 'repeat' // ---------- 使用 GM_addStyle 注入动态生成的 CSS ---------- function injectStyles() { let cssRules = ''; // 基础样式 cssRules += ` /* ---- 弹窗遮罩 ---- */ .skin-panel-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.3); z-index: 2147483647; align-items: center; justify-content: center; backdrop-filter: blur(2px); /* display 由 JS 控制 flex/none */ } /* ---- 弹窗容器 ---- */ .skin-panel-container { background: #ffffff; border-radius: 16px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2); padding: 20px 24px; width: 840px; max-width: 90vw; max-height: 80vh; overflow-y: auto; pointer-events: auto; } /* ---- 弹窗头部 ---- */ .skin-panel-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; font-size: 16px; font-weight: 500; color: #1f1f1f; } .skin-panel-title { font-weight: bold; font-size: 19px; } /* ---- 卡片容器 ---- */ .skin-cards-wrapper { display: flex; flex-direction: column; gap: 12px; margin-top: 0; } .skin-cards-group { display: grid; grid-template-columns: repeat(3, 1fr); justify-items: center; gap: 12px; } .skin-cards-divider { width: 100%; height: 1px; background: #e0e0e0; margin: 4px 0; } /* ---- 单个卡片 ---- */ .skin-card { width: 160px; cursor: pointer; border-radius: 12px; overflow: hidden; border: 2px solid transparent; transition: border-color 0.2s, box-shadow 0.2s; background: #fff; } .skin-card-hover { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); } .skin-card-selected { border-color: #0066ff; box-shadow: 0 4px 12px rgba(0, 102, 255, 0.2); } /* ---- 卡片预览区 ---- */ .skin-card-preview { height: 90px; border-radius: 8px 8px 0 0; overflow: hidden; position: relative; /* 新增,使内部绝对定位按钮相对于此定位 */ } .skin-card-preview-inner { width: 100%; height: 100%; /* 背景图片由皮肤类单独定义 */ } .skin-panel-overlay .skin-panel-container .skin-cards-wrapper .skin-card-preview-inner { position: relative; display: flex; align-items: center; height: 100%; overflow: hidden; background-repeat: no-repeat; background-size: cover; background-position: center; } /* ---- 卡片底部单选区 ---- */ .skin-card-radio { display: flex; align-items: center; padding: 8px 10px; background: #fafafa; border-radius: 0 0 8px 8px; } .skin-card-radio-icon { width: 16px; height: 16px; border-radius: 50%; border: 2px solid #d9d9d9; margin-right: 8px; transition: all 0.2s; flex-shrink: 0; } .skin-card-radio-icon.selected { border-color: #0066ff; background-color: #0066ff; box-shadow: inset 0 0 0 3px white; } .skin-card-radio-text { flex: 1; font-size: 14px; color: #333; } /* ---- 换肤按钮 ---- */ .skin-switch-btn { display: inline-flex; align-items: center; margin-right: 8px; cursor: pointer; } .skin-switch-btn .skin-icon { width: 20px; height: 20px; margin-right: 4px; } .skin-switch-btn:hover { color: #0066ff; } .frame-header-setting-btn:hover{ color: #0066ff; } /* ---- 自定义壁纸上传按钮(预留) ---- */ .skin-card-upload-btn { position: absolute; top: 6px; right: 6px; width: 28px; height: 28px; border-radius: 50%; background: rgba(0, 0, 0, 0.5); color: #fff; font-size: 20px; line-height: 28px; text-align: center; cursor: pointer; z-index: 2; border: none; display: none; /* 默认隐藏,自定义卡片时显示 */ } .skin-card-upload-btn:hover { background: rgba(0, 0, 0, 0.7); } .skin-card-upload-btn.show { display: block; } `; // 根据 SKINS 生成每个预览类的背景图 SKINS.forEach(skin => { cssRules += ` .skin-panel-overlay .skin-panel-container .skin-cards-wrapper .skin-card-preview-inner.${skin.previewClass} { background-image: ${skin.bgImage}; } `; }); // 其他辅助样式(红点、NEW标签等,保持精简) cssRules += ` .skin-panel-overlay .skin-panel-container .setting-theme-red-dot { width: 16px; height: 16px; background-size: 100% 100%; background-image: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/red-dot.2d1631b.svg); margin: 2px 0 0 4px; } .skin-panel-overlay .skin-panel-container .setting-theme-card-group-title { font-size: 14px; line-height: 20px; font-weight: initial; display: flex; align-items: center; color: var(--base_gray_100, #1f1f1f); } .skin-panel-overlay .skin-panel-container .skin-cards-wrapper .skin-card-preview-inner .setting-theme-new-tag { font-size: 10px; line-height: 14px; font-weight: 700; position: absolute; top: 0; right: 0; display: flex; align-items: center; height: 16px; color: #fff; padding: 0 4px; box-sizing: border-box; background: #e54545; border-bottom-left-radius: 5px; } .skin-panel-overlay .skin-panel-container .skin-cards-wrapper .skin-card-preview-inner .setting-theme-new-tag::before { content: 'NEW'; } .skin-panel-overlay .skin-panel-container .setting-theme-count-down-text { font-size: 13px; line-height: 18px; font-weight: 700; color: #d4a56a; font-family: "Microsoft Yahei UI", "Segoe UI", "Helvetica Neue", -apple-system, "system-ui", sans-serif, Roboto; padding: 0 4px; box-sizing: border-box; background: transparent; } `; // 列表邮件区域半透明 cssRules += ` /* 邮件列表工具栏背景透明 */ .mail-list-page-toolbar { background: transparent !important; } /* 让邮件列表区域子项背景透明,以显示父级半透明背景 */ .mail-list-page-items, .mail-list-page-reader, .mail-list-body { background: transparent !important; } /* 邮件正文翻译提示背景透明 */ .mail-detail-alert-bar { background: transparent !important; } /* 邮件正文区域背景透明 */ .qmbox table { background: transparent !important; } .qmbox table tr{ background: transparent !important; } .qmbox table td{ background: transparent !important; } .qmbox div { background: transparent !important; } `; // 样式面板 cssRules += ` /* ---- 样式面板 ---- */ .style-panel-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.2); z-index: 2147483646; /* 略低于换肤弹窗(2147483647),避免遮挡 */ display: none; align-items: center; justify-content: center; } .style-panel-container { background: #ffffff; border-radius: 16px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2); padding: 20px 24px; width: 420px; max-width: 90vw; max-height: 80vh; overflow-y: auto; pointer-events: auto; } .style-panel-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; } .style-panel-title { font-size: 19px; font-weight: bold; color: #1f1f1f; } .style-panel-title .badge { background: #e8f5e9; color: #2e7d32; padding: 2px 10px; border-radius: 12px; font-size: 12px; font-weight: 500; margin-left: 8px; vertical-align: top; border: 1px solid #a5d6a7; } .style-group { margin-bottom: 16px; border-bottom: 1px solid #e8e8e8; padding-bottom: 12px; } .style-group:last-child { border-bottom: none; margin-bottom: 0; } .style-group-label { font-weight: 600; margin-bottom: 8px; font-size: 14px; color: #1f1f1f; } .style-row { display: flex; align-items: center; gap: 10px; margin-top: 6px; } .style-row input[type="checkbox"] { margin: 0; flex-shrink: 0; width: 16px; height: 16px; cursor: pointer; } .style-row input[type="range"] { flex: 1; min-width: 60px; cursor: pointer; } /* ---- 滑块状态 ---- */ .style-row input[type="range"] { flex: 1; min-width: 60px; cursor: pointer; transition: opacity 0.2s; } /* 未激活(checkbox未勾选):滑块变灰 */ .style-row input[type="range"].slider-inactive { opacity: 0.4; cursor: pointer; } /* 激活(checkbox已勾选):正常颜色 */ .style-row input[type="range"].slider-active { opacity: 1; cursor: pointer; } /* ---- checkbox 未勾选时稍微变灰 ---- */ .style-row input[type="checkbox"]:not(:checked) { opacity: 0.5; } .style-row input[type="checkbox"]:checked { opacity: 1; } .style-value { min-width: 42px; font-size: 12px; color: #666; text-align: right; font-variant-numeric: tabular-nums; } /* ---- 样式按钮 ---- */ .style-switch-btn { display: inline-flex; align-items: center; gap: 4px; } .style-switch-btn .style-icon { display: inline-flex; align-items: center; line-height: 1; } .style-switch-btn .style-icon svg { display: block; } /* ---- 统一 hover 颜色(与设置按钮一致) ---- */ .frame-header-setting-btn:hover, .style-switch-btn:hover, .skin-switch-btn:hover { color: #0066ff; } /* ---- 底部按钮:确定 + 恢复默认 ---- */ .style-panel-footer { display: flex; justify-content: center; align-items: center; gap: 50px; margin-top: 16px; padding-top: 12px; border-top: 1px solid #e8e8e8; } /* 按钮本身的尺寸保持一致(可选,但建议统一) */ .style-panel-confirm-btn, .style-panel-reset-btn{ padding: 6px 20px; border-radius: 6px; border: none; font-size: 14px; cursor: pointer; transition: background 0.2s; min-width: 80px; /* 两个按钮宽度一致,视觉更平衡 */ } .style-panel-confirm-btn { background: #0066ff; color: #fff; } .style-panel-confirm-btn:hover { background: #0052cc; } .style-panel-reset-btn { background: #f5f5f5; border: 1px solid #d9d9d9; color: #333; } .style-panel-reset-btn:hover { background: #e8e8e8; } `; // 面板关闭按钮 cssRules += ` /* ---- 关闭按钮(换肤 & 样式面板统一) ---- */ .skin-panel-close, .style-panel-close { width: 32px; height: 32px; border-radius: 50%; background: #e54545; /* 醒目红色 */ color: #ffffff; display: flex; align-items: center; justify-content: center; font-size: 20px; font-weight: 700; border: none; cursor: pointer; transition: background 0.2s, transform 0.15s; line-height: 1; flex-shrink: 0; /* 去掉之前可能存在的内联样式干扰 */ padding: 0; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .skin-panel-close:hover, .style-panel-close:hover { background: #c0392b; /* 悬停变暗 */ transform: scale(1.05); } .skin-panel-close:active, .style-panel-close:active { transform: scale(0.95); } `; // 确认框 cssRules += ` /* ---- 自定义确认对话框 ---- */ .confirm-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.3); z-index: 2147483647; /* 与换肤弹窗同级 */ display: none; align-items: center; justify-content: center; backdrop-filter: blur(2px); } .confirm-container { background: #ffffff; border-radius: 16px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2); padding: 24px 28px; width: 400px; max-width: 90vw; pointer-events: auto; } .confirm-title { font-size: 18px; font-weight: 700; color: #1f1f1f; margin-bottom: 8px; } .confirm-message { font-size: 14px; color: #555; line-height: 1.6; margin-bottom: 20px; } .confirm-actions { display: flex; justify-content: center; align-items: center; gap: 50px; } .confirm-actions button { padding: 6px 20px; border-radius: 6px; border: none; font-size: 14px; cursor: pointer; transition: background 0.2s; min-width: 80px; /* 两个按钮宽度一致,视觉更平衡 */ } .confirm-actions .confirm-btn-primary { background: #0066ff; color: #fff; } .confirm-actions .confirm-btn-primary:hover { background: #0052cc; } .confirm-actions .confirm-btn-secondary { background: #f5f5f5; border: 1px solid #d9d9d9; color: #333; } .confirm-actions .confirm-btn-secondary:hover { background: #e8e8e8; } `; // Toast提示 cssRules += ` /* ---- Toast 提示(绿底白字对勾 + 上滑/下滑动画) ---- */ .style-toast { position: fixed; bottom: -60px; /* 初始在屏幕外(下方) */ left: 50%; transform: translateX(-50%); background: #4caf50; /* 绿色背景 */ color: #fff; padding: 12px 24px; border-radius: 20px; font-size: 18px; font-weight: 600; z-index: 2147483647 !important; box-shadow: 0 4px 12px rgba(0,0,0,0.15); display: flex; align-items: center; gap: 8px; opacity: 0; transition: opacity 0.3s ease, bottom 0.4s cubic-bezier(0.22, 1, 0.36, 1); pointer-events: none; white-space: nowrap; } .style-toast.show { opacity: 1; bottom: 100px; /* 上滑到可见位置 */ } .style-toast svg { flex-shrink: 0; /* 防止图标被压缩 */ } `; // 卡片操作按钮组 cssRules += ` /* ---- 卡片操作按钮组 ---- */ .skin-card-actions { position: absolute; bottom: 0px; left: 0; right: 0; display: flex; justify-content: center; gap: 6px; background: rgba(0, 0, 0, 0.7); /* 统一深色 */ padding: 5px 6px; border-radius: 0 0 8px 8px; backdrop-filter: blur(4px); /* 加强模糊,增加层次感 */ opacity: 0; transition: opacity 0.2s; z-index: 2; /* 新增:确保位于锁定遮罩之上 */ } .skin-card:hover .skin-card-actions { opacity: 1; } .skin-card-action-btn { background: rgba(255, 255, 255, 0.2); /* 更明显 */ border: 1px solid rgba(255, 255, 255, 0.2); /* 加边框 */ color: #fff; padding: 2px 8px; /* 稍微增加内边距 */ border-radius: 4px; cursor: pointer; display: flex; align-items: center; gap: 4px; font-size: 11px; /* 略大一点 */ font-weight: 500; /* 加粗 */ line-height: 1.4; transition: background 0.2s, border-color 0.2s; white-space: nowrap; } .skin-card-action-btn:hover { background: rgba(255, 255, 255, 0.4); border-color: rgba(255, 255, 255, 0.4); } .skin-card-action-btn svg { display: block; width: 14px; height: 14px; stroke: white; } .skin-card-action-btn span { font-weight: 500; color: white; text-shadow: 0 1px 2px rgba(0,0,0,0.3); } `; if (LOCK_STYLE === 1) { // 卡片锁定警示效果1(黄锁图标) cssRules += ` /* ---- 卡片锁定警示效果(仅作用于 Bing 和自定义壁纸卡片) ---- */ .skin-card.skin-card-locked { position: relative; } /* 半透明遮罩覆盖整个预览区(不含底部 radio 区域) */ .skin-card.skin-card-locked .skin-card-preview::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); border-radius: 8px 8px 0 0; z-index: 1; pointer-events: none; } /* 锁图标由 JS 动态添加,这里只控制样式 */ .skin-card.skin-card-locked .lock-icon { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 2; pointer-events: none; color: #ffcc00; font-size: 28px; filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.6)); } /* 底部 radio 区域轻微变暗,保持视觉连贯 */ .skin-card.skin-card-locked .skin-card-radio { background: rgba(250, 250, 250, 0.7); } `; } if (LOCK_STYLE === 2) { // 卡片锁定警示效果2(黄黑条纹) cssRules += ` /* ---- 卡片锁定警示效果 ---- */ .skin-card.skin-card-locked { position: relative; } .skin-card.skin-card-locked .skin-card-preview::after { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; pointer-events: none; /* 不阻挡点击 */ z-index: 1; /* 黄黑斜条纹,半透明 */ background: repeating-linear-gradient( 45deg, rgba(255, 204, 0, 0.4) 0px, rgba(255, 204, 0, 0.4) 8px, rgba(0, 0, 0, 0.25) 8px, rgba(0, 0, 0, 0.25) 16px ); border-radius: 8px 8px 0 0; /* 增加边框效果增强视觉提示 */ box-shadow: inset 0 0 0 2px rgba(255, 204, 0, 0.4); } /* 确保卡片底部 radio 区域也被覆盖 */ .skin-card.skin-card-locked .skin-card-radio { /* 保持背景半透明以显示条纹,但为了不影响文字,保留背景透明 */ background: rgba(250, 250, 250, 0.6); } `; } // 上传按钮 cssRules += ` /* ---- 自定义壁纸上传遮罩 ---- */ .custom-upload-overlay { position: absolute; top: 0; left: 0; right: 0; bottom: 30px; /* 预留底部按钮区域 */ visibility: hidden; /* 隐藏但占位 */ opacity: 0; /* 透明 */ align-items: flex-start; /* 靠上对齐 */ justify-content: center; padding-top: 12px; /* 调整垂直位置 */ background: rgba(0, 0, 0, 0.6); /* 更深半透明,确保图标清晰 */ border-radius: 8px 8px 0 0; /* 保持顶部圆角 */ z-index: 2; cursor: pointer; pointer-events: none; /* 隐藏时不可点击 */ transition: background 0.2s; } /* 激活状态 */ .skin-card:not(.skin-card-locked) .custom-upload-overlay.active { visibility: visible; opacity: 1; pointer-events: auto; } .custom-upload-overlay svg { display: block; width: 40px; height: 40px; color: #5b9bd5; filter: drop-shadow(0 2px 4px rgba(0,0,0,0.1)); } /* 当卡片未被锁定且鼠标悬浮时显示遮罩(由 JS 控制类名) */ .skin-card:not(.skin-card-locked) .custom-upload-overlay.active { display: flex; }`; //Bing预览图翻转按钮 cssRules += ` /* ---- Bing 翻转按钮(预览图右上角,hover 显示) ---- */ .bing-flip-btn { position: absolute; top: 6px; right: 6px; width: 20px; height: 20px; border-radius: 4px; background: rgba(0, 0, 0, 0.5); /* 深色半透明,确保可见 */ border: 1px solid rgba(255, 255, 255, 0.3); color: #fff; cursor: pointer; z-index: 3; transition: background 0.2s, transform 0.2s; backdrop-filter: blur(2px); display: none; /* 默认隐藏 */ align-items: center; justify-content: center; user-select: none; } .skin-card:hover .bing-flip-btn { display: flex; /* 卡片悬停时显示 */ } .bing-flip-btn:hover { background: rgba(0, 0, 0, 0.7); /* 悬停加深,与白色按钮变亮形成对称 */ } .bing-flip-btn svg { display: block; width: 14px; height: 14px; fill: currentColor; stroke: none; } /* ---- 翻转动画(点击时触发,水平镜像翻转) ---- */ .bing-flip-btn.flipping svg{ animation: flipHorizontal 0.35s cubic-bezier(0.34, 1.56, 0.64, 1); } @keyframes flipHorizontal { 0% { transform: scaleX(1); } 50% { transform: scaleX(0); } 100% { transform: scaleX(1); } } `; //自定义壁纸(适应/平铺)切换按钮 cssRules += ` /* ---- 自定义壁纸模式切换按钮(右上角,hover 显示) ---- */ .custom-mode-toggle-btn { position: absolute; top: 6px; right: 6px; width: 20px; height: 20px; border-radius: 4px; background: rgba(0, 0, 0, 0.5); border: 1px solid rgba(255, 255, 255, 0.3); color: #fff; cursor: pointer; z-index: 3; display: none; /* 默认隐藏 */ align-items: center; justify-content: center; backdrop-filter: blur(2px); transition: background 0.2s, transform 0.2s; user-select: none; } .skin-card:hover .custom-mode-toggle-btn { display: flex; /* 卡片悬停时显示 */ } .custom-mode-toggle-btn:hover { background: rgba(0, 0, 0, 0.7); } .custom-mode-toggle-btn svg { display: block; width: 14px; height: 14px; fill: currentColor; stroke: none; } `; GM_addStyle(cssRules); } // 立即注入样式 injectStyles(); // ---------- Bing 背景功能 ---------- function getToday() { const now = new Date(); return now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0') + '-' + String(now.getDate()).padStart(2, '0'); } function setBingBackgroundStyle(base64) { // 移除旧的 Bing 样式 const oldStyle = document.getElementById('bing-bg-style'); if (oldStyle) oldStyle.remove(); const style = document.createElement('style'); style.id = 'bing-bg-style'; style.textContent = ` /* ---- 背景图片 ---- */ html, body { background: url("${base64}") center / cover no-repeat fixed !important; background-color: transparent !important; min-height: 100vh !important; } `; document.head.appendChild(style); } function fetchBingImageBase64() { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: 'GET', url: BING_API_URL, onload: function(res) { try { const data = JSON.parse(res.responseText); if (!data.images || data.images.length === 0) { reject('未获取到图片信息'); return; } const imageUrl = 'https://www.bing.com' + data.images[0].url; GM_xmlhttpRequest({ method: 'GET', url: imageUrl, responseType: 'blob', onload: function(imgRes) { const blob = imgRes.response; const reader = new FileReader(); reader.onload = function() { resolve(reader.result); }; reader.onerror = function() { reject('Base64 转换失败'); }; reader.readAsDataURL(blob); }, onerror: function() { reject('图片下载失败'); } }); } catch (e) { reject('解析图片信息失败: ' + e.message); } }, onerror: function() { reject('请求图片信息失败(网络或跨域)'); } }); }); } function applyBingSkin() { // 检查锁定状态 const locked = GM_getValue(BING_LOCKED_KEY, false); if (locked) { console.log('[Bing皮肤] 已锁定,不更新壁纸'); // 但仍然要确保背景显示(可能缓存存在) const cachedImage = GM_getValue(BING_STORAGE_KEY_IMAGE, null); if (cachedImage) { setBingBackgroundStyle(cachedImage); } return; } const today = getToday(); const cachedDate = GM_getValue(BING_STORAGE_KEY_DATE, null); const cachedImage = GM_getValue(BING_STORAGE_KEY_IMAGE, null); // 有缓存立即显示 if (cachedImage) { setBingBackgroundStyle(cachedImage); } // 如果缓存过期或无缓存,异步获取最新 if (cachedDate !== today || !cachedImage) { console.log('[Bing皮肤] 正在获取今日图片...'); fetchBingImageBase64().then(base64 => { GM_setValue(BING_STORAGE_KEY_IMAGE, base64); GM_setValue(BING_STORAGE_KEY_DATE, today); setBingBackgroundStyle(base64); }).catch(err => { console.warn('[Bing皮肤] 获取失败,使用缓存(如有)', err); }); } } function getCustomWallpaper() { return GM_getValue(CUSTOM_WALLPAPER_KEY, null); } function setCustomWallpaper(base64) { GM_setValue(CUSTOM_WALLPAPER_KEY, base64); } function applyCustomWallpaper() { const base64 = getCustomWallpaper(); if (!base64) return false; // 读取模式,默认为 cover const mode = GM_getValue(CUSTOM_WALLPAPER_MODE_KEY, 'cover'); // 移除 Bing 样式 const bingStyle = document.getElementById('bing-bg-style'); if (bingStyle) bingStyle.remove(); let style = document.getElementById('custom-bg-style'); if (!style) { style = document.createElement('style'); style.id = 'custom-bg-style'; document.head.appendChild(style); } // 根据模式设置背景 if (mode === 'repeat') { style.textContent = ` html, body { background: url("${base64}") repeat !important; background-size: auto !important; background-color: transparent !important; min-height: 100vh !important; } `; } else { style.textContent = ` html, body { background: url("${base64}") center / cover no-repeat fixed !important; background-color: transparent !important; min-height: 100vh !important; } `; } return true; } //更新自定义壁纸预览图 function updateCustomCardPreviews() { const base64 = getCustomWallpaper(); if (!base64) return; // 查找所有自定义壁纸卡片的预览内层 const previews = document.querySelectorAll('.skin-card[data-skin-class="page-theme-custom"] .skin-card-preview-inner'); previews.forEach(preview => { preview.style.backgroundImage = `url(${base64})`; preview.style.backgroundSize = 'cover'; preview.style.backgroundRepeat = 'no-repeat'; }); } function removeCustomWallpaper() { const style = document.getElementById('custom-bg-style'); if (style) style.remove(); } // 下载 base64 为图片文件 function downloadBase64(base64, filename = 'wallpaper.png') { const link = document.createElement('a'); link.href = base64; link.download = filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); } // 获取当前壁纸数据(根据当前皮肤) function getCurrentWallpaperData() { const currentSkin = getCurrentSkinValue(); if (currentSkin.includes('page-theme-bing')) { const base64 = GM_getValue(BING_STORAGE_KEY_IMAGE, null); return { base64, type: 'bing' }; } else if (currentSkin.includes('page-theme-custom')) { const base64 = getCustomWallpaper(); return { base64, type: 'custom' }; } return null; } // 切换锁定状态(Bing 或 Custom) function toggleLock(type) { const key = type === 'bing' ? BING_LOCKED_KEY : CUSTOM_LOCKED_KEY; const current = GM_getValue(key, false); const newState = !current; GM_setValue(key, newState); // 仅当解锁 Bing 且当前皮肤正是 Bing 时,才刷新壁纸(获取今日图片) if (type === 'bing' && !newState && document.body.classList.contains('page-theme-bing')) { applyBingSkin(); } // 刷新面板以更新按钮状态 updateSelectedCardInSkinPanel(); return newState; } // ---------- 应用皮肤 ---------- function applySkin(bodyClassValue) { const body = document.body; ALL_BODY_CLASSES.forEach(cls => body.classList.remove(cls)); if (bodyClassValue && bodyClassValue.trim()) { const classArray = bodyClassValue.trim().split(/\s+/); classArray.forEach(cls => body.classList.add(cls)); } GM_setValue(SKIN_CLASSES_KEY, bodyClassValue || ''); console.log('[换肤助手] 皮肤已切换:', bodyClassValue || '默认'); updateSelectedCardInSkinPanel(); // ===== 背景皮肤处理:Bing 或自定义壁纸 ===== if (bodyClassValue && bodyClassValue.includes('page-theme-bing')) { applyBingSkin(); removeCustomWallpaper(); // 切换到 Bing 时移除自定义背景 } else if (bodyClassValue && bodyClassValue.includes('page-theme-custom')) { const hasCustom = applyCustomWallpaper(); if (!hasCustom) { // 无缓存,提示并切换回默认皮肤 showToast('请先上传一张壁纸', '#ff9800'); // 为了避免循环,直接操作 body 类,不触发 applySkin document.body.classList.remove('page-theme-custom'); GM_setValue(SKIN_CLASSES_KEY, ''); console.log('[换肤助手] 无自定义壁纸,已切换回默认'); return; // 退出 applySkin,避免后续 save 覆盖 } // 移除 Bing 样式(如果有) const bingStyle = document.getElementById('bing-bg-style'); if (bingStyle) bingStyle.remove(); // ---- 新增:更新卡片预览图 ---- updateCustomCardPreviews(); } else { // 其他皮肤:移除 Bing 和自定义背景 const bingStyle = document.getElementById('bing-bg-style'); if (bingStyle) bingStyle.remove(); removeCustomWallpaper(); } // ===== 应用样式面板设置(统一控制透明度/模糊) ===== applyStyleOverrides(); // 新增 } function restoreSkin() { const saved = GM_getValue(SKIN_CLASSES_KEY, null); if (saved !== null) applySkin(saved); } function getCurrentSkinValue() { return GM_getValue(SKIN_CLASSES_KEY, ''); } // ---------- UI 元素 ---------- // 换肤面板相关变量 let skinBtn = null; let skinPanelOverlay = null; let skinPanelContainer = null; // 样式面板相关变量 let styleBtn = null; let stylePanelOverlay = null; let stylePanelContainer = null; // 等待元素 function waitForElement(selector, timeout = 10000) { return new Promise((resolve, reject) => { const start = Date.now(); const check = () => { const el = document.querySelector(selector); if (el) resolve(el); else if (Date.now() - start > timeout) reject(new Error(`等待超时: ${selector}`)); else setTimeout(check, 200); }; check(); }); } // 创建皮肤弹窗 function createSkinPanel() { if (skinPanelOverlay) return; // 弹窗遮罩 skinPanelOverlay = document.createElement('div'); skinPanelOverlay.className = 'skin-panel-overlay'; /* skinPanelOverlay.style.cssText = ` position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.3); z-index: 2147483647; display: flex; align-items: center; justify-content: center; backdrop-filter: blur(2px); `; */ // 弹窗容器 skinPanelContainer = document.createElement('div'); skinPanelContainer.className = 'skin-panel-container'; /* skinPanelContainer.style.cssText = ` background: #ffffff; border-radius: 16px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2); padding: 20px 24px; width: 840px; max-width: 90vw; max-height: 80vh; overflow-y: auto; pointer-events: auto; `; */ // 弹窗头部 const header = document.createElement('div'); header.className = 'skin-panel-header'; /* header.style.cssText = ` display: flex; align-items: center; justify-content: space-between; margin-bottom: 20px; font-size: 16px; font-weight: 500; color: #1f1f1f; `; */ // 弹窗标题 const title = document.createElement('span'); title.className = 'skin-panel-title'; title.textContent = '选择皮肤'; /* title.style.cssText = 'font-weight:bold; font-size:19px'; */ // 关闭按钮 const closeBtn = document.createElement('div'); closeBtn.className = 'skin-panel-close'; closeBtn.innerHTML = ` `; closeBtn.addEventListener('click', hideSkinPanel); /* closeBtn.style.cssText = 'cursor: pointer; color: #8c8c8c; display: flex; align-items: center;'; */ header.appendChild(title); header.appendChild(closeBtn); skinPanelContainer.appendChild(header); // 卡片容器 - 改用两组+分隔线 const cardsWrapper = document.createElement('div'); cardsWrapper.className = 'skin-cards-wrapper'; /* cardsWrapper.style.cssText = ` display: flex; flex-direction: column; gap: 12px; margin-top: 0; `; */ // 固定卡片组 (前三个) const fixedGroup = document.createElement('div'); fixedGroup.className = 'skin-cards-group'; /* fixedGroup.style.cssText = ` display: grid; grid-template-columns: repeat(3, 1fr); justify-items: center; gap: 12px; `; */ // 剩余卡片组 const restGroup = document.createElement('div'); restGroup.className = 'skin-cards-group'; /* restGroup.style.cssText = ` display: grid; grid-template-columns: repeat(3, 1fr); justify-items: center; gap: 12px; `; */ // 分隔线 const divider = document.createElement('div'); divider.className = 'skin-cards-divider'; /* divider.style.cssText = ` width: 100%; height: 1px; background: #e0e0e0; margin: 4px 0; `; */ SKINS.forEach((skin, index) => { const card = createSkinCard(skin); if (index < 3) { fixedGroup.appendChild(card); } else { restGroup.appendChild(card); } }); cardsWrapper.appendChild(fixedGroup); cardsWrapper.appendChild(divider); cardsWrapper.appendChild(restGroup); skinPanelContainer.appendChild(cardsWrapper); skinPanelOverlay.appendChild(skinPanelContainer); document.body.appendChild(skinPanelOverlay); skinPanelOverlay.addEventListener('click', (e) => { if (e.target === skinPanelOverlay) hideSkinPanel(); }); updateSelectedCardInSkinPanel(); } function triggerCustomUpload(card) { // 检查锁定(调用前已判断,但再加一次) if (GM_getValue(CUSTOM_LOCKED_KEY, false)) { showToast('壁纸已锁定,请先解锁', '#ff9800', 'wrong'); return; } const input = document.createElement('input'); input.type = 'file'; input.accept = 'image/*'; input.style.display = 'none'; document.body.appendChild(input); input.click(); input.addEventListener('change', function() { const file = this.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = function(ev) { const base64 = ev.target.result; GM_setValue(CUSTOM_WALLPAPER_KEY, base64); GM_setValue(CUSTOM_WALLPAPER_MODE_KEY, 'cover'); //默认适应屏幕 // 更新所有自定义卡片预览 updateCustomCardPreviews(); applySkin('page-theme-custom'); showToast('壁纸上传成功(适应模式)', '#4caf50', 'right'); }; reader.readAsDataURL(file); this.remove(); }); input.addEventListener('cancel', function() { this.remove(); }); } // 更新自定义壁纸模式切换按钮的图标和标题 function updateCustomModeBtn(btn, card) { const mode = GM_getValue(CUSTOM_WALLPAPER_MODE_KEY, 'cover'); if (mode === 'cover') { btn.innerHTML = ` `; btn.setAttribute('title', '当前:适应,点击切换为平铺'); } else { btn.innerHTML = ` `; btn.setAttribute('title', '当前:平铺,点击切换为适应'); } } // 切换自定义壁纸模式 function toggleCustomMode(btn) { const card = btn.closest('.skin-card'); if (!card) return; // 如果有自定义壁纸缓存 const base64 = GM_getValue(CUSTOM_WALLPAPER_KEY, null); if (!base64) { showToast('请先上传一张壁纸', '#ff9800', 'wrong'); return; } const current = GM_getValue(CUSTOM_WALLPAPER_MODE_KEY, 'cover'); const newMode = current === 'cover' ? 'repeat' : 'cover'; GM_setValue(CUSTOM_WALLPAPER_MODE_KEY, newMode); // 更新按钮显示 updateCustomModeBtn(btn, card); // 如果当前皮肤正是自定义壁纸,立即应用新模式 if (getCurrentSkinValue().includes('page-theme-custom')) { applySkin('page-theme-custom'); } else { // 否则只更新卡片预览效果(方便用户预览) updateCustomCardPreviews(); } showToast(`壁纸已切换为:${newMode === 'cover' ? '适应模式' : '平铺模式'}`, '#4caf50'); } // 更新翻转按钮的 title function updateFlipBtnTitle(flipBtn, card) { const state = card.dataset.bingState || 'placeholder'; if (state === 'real') { flipBtn.setAttribute('title', '当前显示:实际壁纸,点击切换为占位图'); } else { flipBtn.setAttribute('title', '当前显示:占位图,点击切换为实际壁纸'); } } // 切换 Bing 卡片的预览图(占位图 ↔ 实际壁纸) function toggleBingPreview(flipBtn) { // ---- 强制重新触发动画(解决动画中断残留问题) ---- flipBtn.classList.remove('flipping'); // 强制回流,确保移除生效 void flipBtn.offsetWidth; flipBtn.classList.add('flipping'); // 移除旧的 animationend 监听(避免重复绑定) const oldHandler = flipBtn._animEndHandler; if (oldHandler) { flipBtn.removeEventListener('animationend', oldHandler); delete flipBtn._animEndHandler; } // 清除之前的后备定时器 if (flipBtn._animTimeout) { clearTimeout(flipBtn._animTimeout); delete flipBtn._animTimeout; } // 动画结束后移除类,避免残留 // 动画结束后清除类 const handler = function() { flipBtn.classList.remove('flipping'); flipBtn.removeEventListener('animationend', handler); if (flipBtn._animTimeout) { clearTimeout(flipBtn._animTimeout); delete flipBtn._animTimeout; } delete flipBtn._animEndHandler; }; flipBtn.addEventListener('animationend', handler); flipBtn._animEndHandler = handler; // 后备定时器:如果 animationend 未触发(如元素隐藏),400ms 后强制清除 flipBtn._animTimeout = setTimeout(() => { flipBtn.classList.remove('flipping'); if (flipBtn._animEndHandler) { flipBtn.removeEventListener('animationend', flipBtn._animEndHandler); delete flipBtn._animEndHandler; } delete flipBtn._animTimeout; }, 400); const card = flipBtn.closest('.skin-card'); if (!card) return; const previewInner = card.querySelector('.skin-card-preview-inner'); if (!previewInner) return; const cached = GM_getValue(BING_STORAGE_KEY_IMAGE, null); if (!cached) { showToast('今日壁纸尚未加载,请先选择 Bing每日壁纸 卡片以获取', '#ff9800', 'wrong'); return; } // 获取当前状态('placeholder' 或 'real') const currentState = card.dataset.bingState || 'placeholder'; let newState; if (currentState === 'placeholder') { // 切换到实际壁纸 previewInner.style.backgroundImage = `url("${cached}")`; newState = 'real'; } else { // 切回占位图(清空内联样式,让 CSS 背景生效) previewInner.style.backgroundImage = ''; newState = 'placeholder'; } // 更新 dataset card.dataset.bingState = newState; // 更新按钮的 title updateFlipBtnTitle(flipBtn, card); // 如果开启了持久化,保存状态 if (BING_FLIP_PERSIST === 1) { GM_setValue(BING_FLIP_STATE_KEY, newState); } // ---- 新增 Toast 提示 ---- if (newState === 'real') { showToast('预览图已切换为:实际壁纸', '#4caf50'); } else { showToast('预览图已切换为:占位图', '#4caf50'); } } /** * 统一处理锁定/解锁的 UI 更新和 Toast 提示 * @param {string} type - 'bing' 或 'custom' * @param {HTMLElement} btn - 锁定按钮元素 * @param {HTMLElement} card - 卡片元素 */ function handleLockToggle(type, btn, card) { const newState = toggleLock(type); // 切换存储状态,返回新状态 // 1. 更新按钮图标和文字 btn.innerHTML = newState ? `已锁定` : `未锁定`; // 2. 更新按钮 title(根据类型区分说明) if (type === 'bing') { btn.title = newState ? '已锁定(点击后解锁,立即更新为今日壁纸)' : '未锁定(点击后锁定,不再更新壁纸)'; } else { btn.title = newState ? '已锁定(点击后解锁,可以上传新壁纸)' : '未锁定(点击后锁定,无法上传新壁纸)'; } // 3. 切换卡片锁定类(影响遮罩/条纹显示) card.classList.toggle('skin-card-locked', newState); // 4. 同步锁图标(LOCK_STYLE=1 时存在) if (card._lockIcon) { card._lockIcon.style.display = newState ? 'block' : 'none'; } // 5. 自定义壁纸特殊:控制上传遮罩的显示 if (type === 'custom') { const overlay = card.querySelector('.custom-upload-overlay'); if (overlay) { if (newState) { overlay.classList.remove('active'); // 锁定强制隐藏 } else if (card.matches(':hover')) { overlay.classList.add('active'); // 解锁且悬停时显示 } } } // 6. 如果解锁的是 Bing 且当前皮肤正是 Bing,立即刷新壁纸 if (type === 'bing' && !newState && getCurrentSkinValue().includes('page-theme-bing')) { applyBingSkin(); } // 7. 显示 Toast(锁定用橙色,解锁用绿色) if (type === 'bing') { showToast( newState ? '已锁定今日壁纸,将不再自动更新' : '已解锁,正在更新今日壁纸', newState ? '#ff9800' : '#4caf50' ); } else { showToast( newState ? '自定义壁纸已锁定,无法上传新壁纸' : '自定义壁纸已解锁,可以上传新壁纸', newState ? '#ff9800' : '#4caf50' ); } // 8. 刷新面板选中状态(保证其他卡片同步) updateSelectedCardInSkinPanel(); } function createSkinCard(skin) { const card = document.createElement('div'); card.className = 'skin-card'; card.dataset.skinClass = skin.bodyClass; /* card.style.cssText = ` width: 160px; cursor: pointer; border-radius: 12px; overflow: hidden; border: 2px solid transparent; transition: border-color 0.2s, box-shadow 0.2s; background: #fff; `; */ // 根据锁定状态添加警示类(仅 Bing 和自定义壁纸支持锁定) let lockedKey = null; if (skin.name === 'Bing每日壁纸') { lockedKey = BING_LOCKED_KEY; } else if (skin.name === '自定义壁纸') { lockedKey = CUSTOM_LOCKED_KEY; } const isLocked = lockedKey ? GM_getValue(lockedKey, false) : false; if (isLocked) { card.classList.add('skin-card-locked'); } card.addEventListener('mouseenter', () => { card.classList.add('skin-card-hover'); }); card.addEventListener('mouseleave', () => { card.classList.remove('skin-card-hover'); }); // ---- 新增:清理翻转按钮动画状态(仅针对 Bing 卡片) ---- card.addEventListener('mouseleave', function() { const flipBtn = this.querySelector('.bing-flip-btn'); if (flipBtn) { flipBtn.classList.remove('flipping'); // 清除可能残留的内联 transform,确保下次显示初始状态 flipBtn.style.transform = ''; } }); card.addEventListener('click', function(e) { // 如果点击的是上传按钮,已经阻止冒泡,所以不会触发这里 if (skin.name === '自定义壁纸') { const cached = getCustomWallpaper(); if (cached) { applySkin('page-theme-custom'); setTimeout(hideSkinPanel, 150); } else { showToast('请先上传一张壁纸', '#ff9800'); } } else { applySkin(skin.bodyClass); setTimeout(hideSkinPanel, 150); } }); const previewContent = document.createElement('div'); previewContent.className = 'skin-card-preview'; /* previewContent.style.cssText = ` height: 90px; border-radius: 8px 8px 0 0; overflow: hidden; `; */ const previewInner = document.createElement('div'); previewInner.className = 'skin-card-preview-inner ' + skin.previewClass; /* previewInner.style.cssText = ` width: 100%; height: 100%; `; */ previewContent.appendChild(previewInner); // 如果是自定义壁纸卡片且存在缓存,立即设置预览 if (skin.name === '自定义壁纸') { const cached = getCustomWallpaper(); if (cached) { previewInner.style.backgroundImage = `url(${cached})`; previewInner.style.backgroundSize = 'cover'; previewInner.style.backgroundRepeat = 'no-repeat'; } } // ---- 为 Bing 卡片添加翻转按钮(预览图右上角) ---- if (skin.name === 'Bing每日壁纸') { // 确定初始状态 let initialIsReal = false; if (BING_FLIP_PERSIST === 1) { const savedState = GM_getValue(BING_FLIP_STATE_KEY, 'placeholder'); initialIsReal = (savedState === 'real'); } const cached = GM_getValue(BING_STORAGE_KEY_IMAGE, null); // 根据状态设置预览背景 if (initialIsReal && cached) { previewInner.style.backgroundImage = `url("${cached}")`; card.dataset.bingState = 'real'; } else { // 占位图(清空内联,让 CSS 背景生效) previewInner.style.backgroundImage = ''; card.dataset.bingState = 'placeholder'; } // 创建翻转按钮 const flipBtn = document.createElement('div'); flipBtn.className = 'bing-flip-btn'; flipBtn.innerHTML = ` `; // 设置初始 title updateFlipBtnTitle(flipBtn, card); flipBtn.addEventListener('click', function(e) { e.stopPropagation(); toggleBingPreview(this); // 传递按钮自身 }); previewContent.style.position = 'relative'; previewContent.appendChild(flipBtn); } // ---- 仅当配置为黄锁时,才创建锁图标 ---- if (LOCK_STYLE === 1 && lockedKey) { const lockIcon = document.createElement('div'); lockIcon.className = 'lock-icon'; // 默认根据锁定状态决定显示/隐藏 lockIcon.style.display = isLocked ? 'block' : 'none'; // 使用 SVG 锁图标(黄色) lockIcon.innerHTML = ` `; // 将锁图标添加到 previewContent(预览区容器) previewContent.style.position = 'relative'; previewContent.appendChild(lockIcon); // 保存引用到卡片对象,供锁定切换时使用 card._lockIcon = lockIcon; } // ---- 为 Bing 和自定义壁纸添加操作按钮 ---- if (skin.name === 'Bing每日壁纸' || skin.name === '自定义壁纸') { const actionsDiv = document.createElement('div'); actionsDiv.className = 'skin-card-actions'; // 按钮组样式(通过CSS控制) // ----- 锁定/解锁按钮 ----- const lockBtn = document.createElement('button'); lockBtn.className = 'skin-card-action-btn'; // 初始状态 const isLocked = GM_getValue( skin.name === 'Bing每日壁纸' ? BING_LOCKED_KEY : CUSTOM_LOCKED_KEY, false ); // 修正后:锁定显示带钥匙孔,未锁定显示不带 lockBtn.innerHTML = isLocked ? `已锁定` : `未锁定`; // ---- 这里根据皮肤设置不同的 title ---- let lockTitle; if (skin.name === 'Bing每日壁纸') { lockTitle = isLocked ? '已锁定(点击后解锁,立即更新为今日壁纸)' : '未锁定(点击后锁定,不再更新壁纸)'; } else { lockTitle = isLocked ? '已锁定(点击后解锁,可以上传新壁纸)' : '未锁定(点击后锁定,无法上传新壁纸)'; } lockBtn.title = lockTitle; lockBtn.addEventListener('click', function(e) { e.stopPropagation(); const type = skin.name === 'Bing每日壁纸' ? 'bing' : 'custom'; // --- 前置条件检查 --- if (type === 'custom' && !getCustomWallpaper()) { showToast('请先上传一张壁纸', '#ff9800', 'wrong'); return; } if (type === 'bing') { const cached = GM_getValue(BING_STORAGE_KEY_IMAGE, null); if (!cached) { showToast('今日壁纸尚未加载,请先选择 Bing每日壁纸 卡片以获取', '#ff9800', 'wrong'); return; } } // 调用统一处理函数 handleLockToggle(type, this, card); }); actionsDiv.appendChild(lockBtn); // ----- 下载按钮 ----- const downloadBtn = document.createElement('button'); downloadBtn.className = 'skin-card-action-btn'; downloadBtn.innerHTML = `下载`; if (skin.name === 'Bing每日壁纸') { downloadBtn.title = '下载今日壁纸'; } else { downloadBtn.title = '下载当前自定义壁纸'; } downloadBtn.addEventListener('click', function(e) { e.stopPropagation(); // 如果是自定义壁纸卡片,且没有缓存壁纸,则提示并返回 if (skin.name === '自定义壁纸' && !getCustomWallpaper()) { showToast('请先上传一张壁纸', '#ff9800', 'wrong'); return; } // ---- 新增:针对 Bing 壁纸的缓存检查 ---- if (skin.name === 'Bing每日壁纸') { const cached = GM_getValue(BING_STORAGE_KEY_IMAGE, null); if (!cached) { showToast('今日壁纸尚未加载,请先选择 Bing每日壁纸 卡片以获取', '#ff9800', 'wrong'); return; } } let data = null; // 直接根据当前卡片的皮肤类型获取数据 if (skin.name === 'Bing每日壁纸') { const base64 = GM_getValue(BING_STORAGE_KEY_IMAGE, null); if (base64) data = { base64, type: 'bing' }; } else if (skin.name === '自定义壁纸') { const base64 = getCustomWallpaper(); if (base64) data = { base64, type: 'custom' }; } if (!data || !data.base64) { showToast('没有可下载的壁纸', '#ff9800', 'wrong', 2000); return; } // 提取扩展名 const mimeMatch = data.base64.match(/^data:image\/(\w+);base64,/); const ext = mimeMatch ? mimeMatch[1] : 'png'; const filename = `wallpaper_${Date.now()}.${ext}`; downloadBase64(data.base64, filename); showToast('壁纸已下载', '#4caf50', 'right'); }); actionsDiv.appendChild(downloadBtn); // ----- 上传按钮(仅自定义壁纸) ----- if (skin.name === '自定义壁纸') { // ---- 1. 创建上传遮罩(独立于底部 actions) ---- const uploadOverlay = document.createElement('div'); uploadOverlay.className = 'custom-upload-overlay'; uploadOverlay.innerHTML = ` `; // 点击触发上传 uploadOverlay.addEventListener('click', function(e) { e.stopPropagation(); // 检查锁定状态(双重保险) if (GM_getValue(CUSTOM_LOCKED_KEY, false)) { showToast('壁纸已锁定,请先解锁', '#ff9800', 'wrong'); return; } // 调用独立的上传函数(见下文) const currentCard = this.closest('.skin-card'); // 保存卡片 triggerCustomUpload(currentCard); // 传入卡片 }); // ----- 自定义壁纸模式切换按钮(右上角) ----- const modeToggleBtn = document.createElement('div'); modeToggleBtn.className = 'custom-mode-toggle-btn'; // 初始化图标和标题 updateCustomModeBtn(modeToggleBtn, card); modeToggleBtn.addEventListener('click', function(e) { e.stopPropagation(); // 防止触发卡片点击 toggleCustomMode(this); }); // 将按钮添加到 previewContent(预览区容器) previewContent.style.position = 'relative'; previewContent.appendChild(modeToggleBtn); // 将遮罩添加到预览区(注意 previewContent 已定义) previewContent.style.position = 'relative'; // 确保遮罩基于此定位 previewContent.appendChild(uploadOverlay); // ---- 2. 控制 hover 显示(利用卡片 mouseenter/mouseleave) ---- card.addEventListener('mouseenter', function() { const locked = GM_getValue(CUSTOM_LOCKED_KEY, false); if (!locked) { uploadOverlay.classList.add('active'); } else { uploadOverlay.classList.remove('active'); } }); card.addEventListener('mouseleave', function() { uploadOverlay.classList.remove('active'); }); // ---- 3. 当锁定状态切换时,同步刷新(如果在锁定期间鼠标仍悬停) ---- // 这部分我们放在锁定按钮的点击回调里做,见下文 } previewContent.appendChild(actionsDiv); } const radioDiv = document.createElement('div'); radioDiv.className = 'skin-card-radio'; /* radioDiv.style.cssText = ` display: flex; align-items: center; padding: 8px 10px; background: #fafafa; border-radius: 0 0 8px 8px; `; */ const radioIcon = document.createElement('div'); radioIcon.className = 'skin-card-radio-icon'; /* radioIcon.style.cssText = ` width: 16px; height: 16px; border-radius: 50%; border: 2px solid #d9d9d9; margin-right: 8px; transition: all 0.2s; `; */ const radioText = document.createElement('div'); radioText.className = 'skin-card-radio-text'; radioText.textContent = skin.name; /* radioText.style.cssText = ` flex: 1; font-size: 14px; color: #333; `; */ radioDiv.appendChild(radioIcon); radioDiv.appendChild(radioText); card.appendChild(previewContent); card.appendChild(radioDiv); return card; } function updateSelectedCardInSkinPanel() { if (!skinPanelContainer) return; const currentClass = getCurrentSkinValue(); const cards = skinPanelContainer.querySelectorAll('.skin-card'); cards.forEach(card => { const cardClass = card.dataset.skinClass; const radioIcon = card.querySelector('.skin-card-radio-icon'); const isSelected = (cardClass === currentClass); card.classList.toggle('skin-card-selected', isSelected); if (radioIcon) { radioIcon.classList.toggle('selected', isSelected); } }); } function showSkinPanel() { if (!skinPanelOverlay) createSkinPanel(); /* // ---- 如果关闭持久化,每次打开弹窗重置 Bing 卡片为占位图 ---- if (BING_FLIP_PERSIST === 0) { const bingCards = skinPanelContainer.querySelectorAll('.skin-card[data-skin-class="page-theme-bing"]'); bingCards.forEach(card => { const previewInner = card.querySelector('.skin-card-preview-inner'); const flipBtn = card.querySelector('.bing-flip-btn'); if (previewInner) { // 清空内联样式,让 CSS 背景(占位图)生效 previewInner.style.backgroundImage = ''; } // 重置状态标记 card.dataset.bingState = 'placeholder'; if (flipBtn) { updateFlipBtnTitle(flipBtn, card); } }); } */ skinPanelOverlay.style.display = 'flex'; updateSelectedCardInSkinPanel(); updateCustomCardPreviews(); // 新增 console.log('[换肤助手] 弹窗已显示'); } function hideSkinPanel() { if (skinPanelOverlay) { skinPanelOverlay.style.display = 'none'; console.log('[换肤助手] 弹窗已关闭'); } } function toggleSkinPanel(e) { e.stopPropagation(); if (skinPanelOverlay && skinPanelOverlay.style.display === 'flex') { hideSkinPanel(); } else { showSkinPanel(); } } // 创建换肤按钮 function createSkinButton() { const btn = document.createElement('div'); btn.className = 'frame-header-setting-btn skin-switch-btn'; btn.setAttribute('title', '切换皮肤'); /* btn.style.cssText = ` display: inline-flex; align-items: center; margin-right: 8px; cursor: pointer; `; */ const iconDiv = document.createElement('div'); iconDiv.className = 'skin-icon'; /* iconDiv.style.cssText = 'width: 20px; height: 20px; margin-right: 4px;'; */ const svgNS = 'http://www.w3.org/2000/svg'; const svg = document.createElementNS(svgNS, 'svg'); svg.setAttribute('viewBox', '0 0 1246 1024'); svg.setAttribute('width', '20'); svg.setAttribute('height', '20'); svg.setAttribute('fill', 'currentColor'); const path = document.createElementNS(svgNS, 'path'); path.setAttribute('d', 'M958.769399 0.006678v78.802965l209.918631 198.877311-117.314017 112.194051a83.299631 83.299631 0 0 0-55.562768-19.67848c-47.3263 0-84.368145 35.483595-84.368146 80.761908v415.518681c0 43.31937-37.041845 78.758443-82.36468 78.758443H417.522147c-45.278313 0-82.320159-35.439073-82.320159-78.802964V451.008954c0-45.278313-37.041845-80.761908-84.368146-80.761908-20.568909 0-41.18234 7.880296-55.562768 19.723002L77.912535 277.686954l207.870645-198.921833h51.466794l2.047987 1.958944C396.908716 163.444917 505.986265 216.603526 623.300283 216.603526c117.314018 0 226.391567-51.199666 284.046843-135.879461 0-1.958944 2.003465-1.958944 2.003465-1.958944h49.418808V0.006678M341.256905 0.006678h-44.966663c-28.58277 0-48.973594 7.880296-63.309501 23.596368L24.486797 222.569401c-32.723265 31.521186-32.723265 80.761908 0 110.279628l120.564083 116.200982c14.291385 13.801649 34.72673 21.637424 53.114088 21.637424 18.43188 0 38.867225-7.880296 53.15861-21.637424h2.047987c2.047987 0 2.047987 0 2.047987 1.958943v415.518682C255.464073 953.121854 329.013506 1024 418.946833 1024h408.7069c89.933327 0 163.48276-70.878146 163.48276-157.516886v-415.518681c0-1.958944 0-1.958944 2.047986-1.958944h2.047987c14.291385 13.801649 34.72673 21.637424 53.15861 21.637424 20.435345 0 38.822703-7.880296 53.114088-21.637424l120.564083-116.200981c32.723265-31.521186 32.723265-80.717387 0-110.279629L1015.667811 23.647568A83.433195 83.433195 0 0 0 956.409763 0.006678h-51.110624c-28.58277 0-53.114088 13.801649-69.45346 37.398017-42.918677 61.083428-122.61207 100.440388-214.593383 100.440389-91.936792 0-171.674706-41.360426-214.593383-100.440389C394.460036 13.808327 367.83621 0.006678 341.301426 0.006678z'); svg.appendChild(path); iconDiv.appendChild(svg); const textSpan = document.createElement('span'); textSpan.textContent = '换肤'; btn.appendChild(iconDiv); btn.appendChild(textSpan); btn.addEventListener('click', toggleSkinPanel); return btn; } /** * 读取样式设置,若存储不存在或结构不完整则返回默认值 */ function getStyleSettings() { const saved = GM_getValue(STYLE_SETTINGS_KEY, null); if (saved) { try { const parsed = JSON.parse(saved); const defaults = JSON.parse(JSON.stringify(DEFAULT_STYLE_SETTINGS)); for (const group of ['header', 'sidebar', 'route']) { if (!parsed[group]) parsed[group] = {}; for (const key of ['opacity', 'blur', 'opacityEnabled', 'blurEnabled']) { if (parsed[group][key] === undefined) { parsed[group][key] = defaults[group][key]; } } } return parsed; } catch (e) { console.warn('[样式面板] 读取存储失败,使用默认值', e); } } // ---- 首次使用:根据默认值自动启用 checkbox ---- const defaultSettings = JSON.parse(JSON.stringify(DEFAULT_STYLE_SETTINGS)); for (const group of ['header', 'sidebar', 'route']) { if (defaultSettings[group].opacity !== 1) { defaultSettings[group].opacityEnabled = true; } if (defaultSettings[group].blur !== 0) { defaultSettings[group].blurEnabled = true; } } // 保存到存储,避免每次刷新都重新初始化 saveStyleSettings(defaultSettings); return defaultSettings; } /** * 保存样式设置 */ function saveStyleSettings(settings) { GM_setValue(STYLE_SETTINGS_KEY, JSON.stringify(settings)); } /** * 根据当前设置生成并注入 CSS 覆盖规则 * 仅当复选框启用时才输出对应的属性 */ /** * 根据当前设置生成并注入 CSS 覆盖规则 * 仅当复选框启用时才输出对应的属性 * 当复选框未启用时,主动清除原生样式(如 blur),确保面板设置完全生效 */ function applyStyleOverrides() { const settings = getStyleSettings(); const rules = []; // ---- 顶部栏 ---- if (settings.header.opacityEnabled) { rules.push(`.frame-header { background: rgba(255, 255, 255, ${settings.header.opacity}) !important; }`); } if (settings.header.blurEnabled) { rules.push( `.frame-header { ` + `backdrop-filter: blur(${settings.header.blur}px) !important; ` + `-webkit-backdrop-filter: blur(${settings.header.blur}px) !important; ` + `}` ); } else { // 清除可能存在的原生模糊 rules.push( `.frame-header { ` + `backdrop-filter: none !important; ` + `-webkit-backdrop-filter: none !important; ` + `}` ); } // ---- 侧边栏 ---- if (settings.sidebar.opacityEnabled) { rules.push(`.frame-sidebar { background: rgba(255, 255, 255, ${settings.sidebar.opacity}) !important; }`); // 子元素背景透明,让父级半透明白色背景显示 rules.push( `.frame-sidebar .sidebar-header { background: transparent !important; }`, `.frame-sidebar .sidebar-menus { background: transparent !important; }` ); } if (settings.sidebar.blurEnabled) { rules.push( `.frame-sidebar { ` + `backdrop-filter: blur(${settings.sidebar.blur}px) !important; ` + `-webkit-backdrop-filter: blur(${settings.sidebar.blur}px) !important; ` + `}` ); } else { // 清除可能存在的原生模糊 rules.push( `.frame-sidebar { ` + `backdrop-filter: none !important; ` + `-webkit-backdrop-filter: none !important; ` + `}` ); } // ---- 正文区 ---- if (settings.route.opacityEnabled) { rules.push(`.frame-route-wrap { background: rgba(255, 255, 255, ${settings.route.opacity}) !important; }`); } if (settings.route.blurEnabled) { rules.push( `.frame-route-wrap::before { ` + `backdrop-filter: blur(${settings.route.blur}px) !important; ` + `-webkit-backdrop-filter: blur(${settings.route.blur}px) !important; ` + `}` ); } else { // 清除原生模糊(东方青绿等皮肤自带 blur) rules.push( `.frame-route-wrap::before { ` + `backdrop-filter: none !important; ` + `-webkit-backdrop-filter: none !important; ` + `}` ); } // 仅当启用不透明度时,才将 ::before 背景设为透明,让父级背景显示 if (settings.route.opacityEnabled) { rules.push(`.frame-route-wrap::before { background: transparent !important; }`); } // 注意:如果两者都未启用,则不添加 background 规则,让原生 ::before 背景恢复(如东方青绿的半透明白色) // ---- 注入或更新样式 ---- let style = document.getElementById('qqmail-style-override'); if (!style) { style = document.createElement('style'); style.id = 'qqmail-style-override'; document.head.appendChild(style); } style.textContent = rules.join('\n'); } function createStyleButton() { const btn = document.createElement('div'); btn.className = 'frame-header-setting-btn style-switch-btn'; btn.setAttribute('title', '样式设置'); // 图标:使用 SVG 调色板,与换肤按钮风格统一 const iconSpan = document.createElement('span'); iconSpan.className = 'style-icon'; iconSpan.innerHTML = ` `; const textSpan = document.createElement('span'); textSpan.textContent = '样式'; btn.appendChild(iconSpan); btn.appendChild(textSpan); btn.addEventListener('click', toggleStylePanel); return btn; } function createStylePanel() { if (stylePanelOverlay) return; // ---- 遮罩 ---- stylePanelOverlay = document.createElement('div'); stylePanelOverlay.className = 'style-panel-overlay'; stylePanelOverlay.addEventListener('click', (e) => { if (e.target === stylePanelOverlay) hideStylePanel(); }); // ---- 面板容器 ---- stylePanelContainer = document.createElement('div'); stylePanelContainer.className = 'style-panel-container'; // ---- 标题栏 ---- const header = document.createElement('div'); header.className = 'style-panel-header'; const title = document.createElement('span'); title.className = 'style-panel-title'; title.innerHTML = `样式自定义实时响应`; const closeBtn = document.createElement('div'); closeBtn.className = 'style-panel-close'; closeBtn.innerHTML = ` `; closeBtn.addEventListener('click', hideStylePanel); header.appendChild(title); header.appendChild(closeBtn); stylePanelContainer.appendChild(header); // ---- 三组控件 ---- const groups = ['header', 'sidebar', 'route']; const groupLabels = { header: '顶部栏', sidebar: '侧边栏', route: '正文区' }; const settings = getStyleSettings(); groups.forEach(group => { const groupDiv = document.createElement('div'); groupDiv.className = 'style-group'; groupDiv.dataset.group = group; // 用于 showStylePanel 定位 // 组标题 const label = document.createElement('div'); label.className = 'style-group-label'; label.textContent = groupLabels[group]; groupDiv.appendChild(label); // ---- 不透明度行 ---- const opacityRow = document.createElement('div'); opacityRow.className = 'style-row'; const opacityCheck = document.createElement('input'); opacityCheck.type = 'checkbox'; opacityCheck.checked = settings[group].opacityEnabled; const opacitySlider = document.createElement('input'); opacitySlider.type = 'range'; opacitySlider.min = 0; opacitySlider.max = 1; opacitySlider.step = 0.05; opacitySlider.value = settings[group].opacity; // 根据 checkbox 状态设置初始 class opacitySlider.className = settings[group].opacityEnabled ? 'slider-active' : 'slider-inactive'; // 滑块始终可拖动,不再受复选框禁用 //opacitySlider.disabled = !settings[group].opacityEnabled; const opacityValue = document.createElement('span'); opacityValue.className = 'style-value'; opacityValue.textContent = settings[group].opacity.toFixed(2); opacityRow.appendChild(opacityCheck); opacityRow.appendChild(document.createTextNode('不透明度')); opacityRow.appendChild(opacitySlider); opacityRow.appendChild(opacityValue); groupDiv.appendChild(opacityRow); // ---- 背景模糊行 ---- const blurRow = document.createElement('div'); blurRow.className = 'style-row'; const blurCheck = document.createElement('input'); blurCheck.type = 'checkbox'; blurCheck.checked = settings[group].blurEnabled; const blurSlider = document.createElement('input'); blurSlider.type = 'range'; blurSlider.min = 0; blurSlider.max = 30; blurSlider.step = 1; blurSlider.value = settings[group].blur; blurSlider.className = settings[group].blurEnabled ? 'slider-active' : 'slider-inactive'; // 滑块始终可拖动,不再受复选框禁用 //blurSlider.disabled = !settings[group].blurEnabled; const blurValue = document.createElement('span'); blurValue.className = 'style-value'; blurValue.textContent = settings[group].blur + 'px'; blurRow.appendChild(blurCheck); blurRow.appendChild(document.createTextNode('背景模糊')); blurRow.appendChild(blurSlider); blurRow.appendChild(blurValue); groupDiv.appendChild(blurRow); // ---- 事件绑定 ---- // 不透明度复选框:控制滑块启用/禁用,保存状态,应用样式 opacityCheck.addEventListener('change', () => { //opacitySlider.disabled = !opacityCheck.checked; const s = getStyleSettings(); s[group].opacityEnabled = opacityCheck.checked; saveStyleSettings(s); // 更新滑块 class if (opacityCheck.checked) { opacitySlider.className = 'slider-active'; } else { opacitySlider.className = 'slider-inactive'; } applyStyleOverrides(); }); // 背景模糊复选框:同上 blurCheck.addEventListener('change', () => { //blurSlider.disabled = !blurCheck.checked; const s = getStyleSettings(); s[group].blurEnabled = blurCheck.checked; saveStyleSettings(s); // 更新滑块 class if (blurCheck.checked) { blurSlider.className = 'slider-active'; } else { blurSlider.className = 'slider-inactive'; } applyStyleOverrides(); }); // 不透明度滑块:实时更新显示值,保存,应用样式 opacitySlider.addEventListener('input', () => { // 如果复选框未勾选,自动勾选并保存状态 if (!opacityCheck.checked) { opacityCheck.checked = true; opacitySlider.className = 'slider-active'; const s = getStyleSettings(); s[group].opacityEnabled = true; saveStyleSettings(s); } // 更新值并应用 const val = parseFloat(opacitySlider.value); opacityValue.textContent = val.toFixed(2); const s = getStyleSettings(); s[group].opacity = val; saveStyleSettings(s); applyStyleOverrides(); }); // 背景模糊滑块:同上 blurSlider.addEventListener('input', () => { // 如果复选框未勾选,自动勾选并保存状态 if (!blurCheck.checked) { blurCheck.checked = true; blurSlider.className = 'slider-active'; const s = getStyleSettings(); s[group].blurEnabled = true; saveStyleSettings(s); } // 更新值并应用 const val = parseInt(blurSlider.value, 10); blurValue.textContent = val + 'px'; const s = getStyleSettings(); s[group].blur = val; saveStyleSettings(s); applyStyleOverrides(); }); stylePanelContainer.appendChild(groupDiv); }); // ---- 底部按钮:确定(左) + 恢复默认(右) ---- const footerDiv = document.createElement('div'); footerDiv.className = 'style-panel-footer'; // 确定按钮(左) const confirmBtn = document.createElement('button'); confirmBtn.className = 'style-panel-confirm-btn'; confirmBtn.textContent = '确定'; confirmBtn.addEventListener('click', hideStylePanel); // 恢复默认按钮(右) const resetBtn = document.createElement('button'); resetBtn.className = 'style-panel-reset-btn'; resetBtn.textContent = '恢复默认'; resetBtn.addEventListener('click', function() { showConfirmDialog( '恢复默认设置', '确定要恢复所有样式设置为默认值吗?', function() { const defaultSettings = JSON.parse(JSON.stringify(DEFAULT_STYLE_SETTINGS)); for (const group of ['header', 'sidebar', 'route']) { if (defaultSettings[group].opacity !== 1) { defaultSettings[group].opacityEnabled = true; } if (defaultSettings[group].blur !== 0) { defaultSettings[group].blurEnabled = true; } } saveStyleSettings(defaultSettings); applyStyleOverrides(); updateStylePanelControls(); showToast('已恢复默认设置', '#4caf50', 'right'); console.log('[样式面板] 已恢复默认设置'); } ); }); footerDiv.appendChild(confirmBtn); footerDiv.appendChild(resetBtn); stylePanelContainer.appendChild(footerDiv); stylePanelOverlay.appendChild(stylePanelContainer); document.body.appendChild(stylePanelOverlay); } function showToast(message, color = '#4caf50', icon = null, duration = 3500) { // 移除已有 toast const old = document.querySelector('.style-toast'); if (old) old.remove(); const toast = document.createElement('div'); toast.className = 'style-toast'; toast.style.background = color; // 动态背景色 // ---- 创建图标 ---- const iconContainer = document.createElement('span'); iconContainer.style.cssText = 'display:inline-flex; align-items:center; justify-content:center; flex-shrink:0;'; if (icon === 'right') { // 对勾 SVG(白色) const svgNS = 'http://www.w3.org/2000/svg'; const svg = document.createElementNS(svgNS, 'svg'); svg.setAttribute('viewBox', '0 0 24 24'); svg.setAttribute('width', '20'); svg.setAttribute('height', '20'); svg.setAttribute('fill', 'none'); svg.setAttribute('stroke', 'white'); svg.setAttribute('stroke-width', '3'); svg.setAttribute('stroke-linecap', 'round'); svg.setAttribute('stroke-linejoin', 'round'); const polyline = document.createElementNS(svgNS, 'polyline'); polyline.setAttribute('points', '20 6 9 17 4 12'); svg.appendChild(polyline); iconContainer.appendChild(svg); } else if (icon === 'wrong') { // 错误 X SVG(白色) const svgNS = 'http://www.w3.org/2000/svg'; const svg = document.createElementNS(svgNS, 'svg'); svg.setAttribute('viewBox', '0 0 24 24'); svg.setAttribute('width', '20'); svg.setAttribute('height', '20'); svg.setAttribute('fill', 'none'); svg.setAttribute('stroke', 'white'); svg.setAttribute('stroke-width', '3'); svg.setAttribute('stroke-linecap', 'round'); svg.setAttribute('stroke-linejoin', 'round'); const line1 = document.createElementNS(svgNS, 'line'); line1.setAttribute('x1', '18'); line1.setAttribute('y1', '6'); line1.setAttribute('x2', '6'); line1.setAttribute('y2', '18'); const line2 = document.createElementNS(svgNS, 'line'); line2.setAttribute('x1', '6'); line2.setAttribute('y1', '6'); line2.setAttribute('x2', '18'); line2.setAttribute('y2', '18'); svg.appendChild(line1); svg.appendChild(line2); iconContainer.appendChild(svg); } else if (icon && typeof icon === 'string' && icon.startsWith(' { toast.classList.add('show'); }); // 自动隐藏(下滑消失) setTimeout(() => { toast.classList.remove('show'); setTimeout(() => toast.remove(), 400); }, duration); } function updateStylePanelControls() { if (!stylePanelContainer) return; // 从存储读取最新设置,同步到控件 const settings = getStyleSettings(); const groups = ['header', 'sidebar', 'route']; groups.forEach(group => { const groupDiv = stylePanelContainer.querySelector(`.style-group[data-group="${group}"]`); if (!groupDiv) return; const checkboxes = groupDiv.querySelectorAll('input[type="checkbox"]'); const sliders = groupDiv.querySelectorAll('input[type="range"]'); const values = groupDiv.querySelectorAll('.style-value'); // 顺序:不透明度复选框、不透明度滑块、不透明度值、模糊复选框、模糊滑块、模糊值 if (checkboxes.length >= 2 && sliders.length >= 2 && values.length >= 2) { // 不透明度 checkboxes[0].checked = settings[group].opacityEnabled; //sliders[0].disabled = !settings[group].opacityEnabled; sliders[0].value = settings[group].opacity; sliders[0].className = settings[group].opacityEnabled ? 'slider-active' : 'slider-inactive'; values[0].textContent = settings[group].opacity.toFixed(2); // 背景模糊 checkboxes[1].checked = settings[group].blurEnabled; //sliders[1].disabled = !settings[group].blurEnabled; sliders[1].value = settings[group].blur; sliders[1].className = settings[group].blurEnabled ? 'slider-active' : 'slider-inactive'; values[1].textContent = settings[group].blur + 'px'; } }); } function showStylePanel() { if (!stylePanelOverlay) createStylePanel(); updateStylePanelControls(); stylePanelOverlay.style.display = 'flex'; } function hideStylePanel() { if (stylePanelOverlay) { stylePanelOverlay.style.display = 'none'; } } function toggleStylePanel(e) { e.stopPropagation(); if (stylePanelOverlay && stylePanelOverlay.style.display === 'flex') { hideStylePanel(); } else { showStylePanel(); } } /** * 显示自定义确认对话框 * @param {string} title - 标题 * @param {string} message - 消息内容 * @param {Function} onConfirm - 点击“确定”的回调 * @param {Function} onCancel - 点击“取消”或遮罩的回调(可选) */ function showConfirmDialog(title, message, onConfirm, onCancel) { // 移除已存在的确认框(防止叠加) const existing = document.querySelector('.confirm-overlay'); if (existing) existing.remove(); // 创建遮罩 const overlay = document.createElement('div'); overlay.className = 'confirm-overlay'; // 创建容器 const container = document.createElement('div'); container.className = 'confirm-container'; // 标题 const titleEl = document.createElement('div'); titleEl.className = 'confirm-title'; titleEl.textContent = title; // 消息 const msgEl = document.createElement('div'); msgEl.className = 'confirm-message'; msgEl.textContent = message; // 按钮组 const actions = document.createElement('div'); actions.className = 'confirm-actions'; // 1. 确认按钮(左) const confirmBtn = document.createElement('button'); confirmBtn.className = 'confirm-btn-primary'; confirmBtn.textContent = '确定'; confirmBtn.addEventListener('click', () => { if (onConfirm) onConfirm(); overlay.remove(); }); // 2. 取消按钮(右) const cancelBtn = document.createElement('button'); cancelBtn.className = 'confirm-btn-secondary'; cancelBtn.textContent = '取消'; cancelBtn.addEventListener('click', () => { if (onCancel) onCancel(); overlay.remove(); }); // 先添加确认,再添加取消 → 确认在左,取消在右 actions.appendChild(confirmBtn); actions.appendChild(cancelBtn); container.appendChild(titleEl); container.appendChild(msgEl); container.appendChild(actions); overlay.appendChild(container); // 点击遮罩也触发取消 overlay.addEventListener('click', (e) => { if (e.target === overlay) { if (onCancel) onCancel(); overlay.remove(); } }); document.body.appendChild(overlay); overlay.style.display = 'flex'; } // 插入按钮 async function insertButton() { try { const settingBtn = await waitForElement('.frame-header-setting-btn'); // 防止重复插入 if (document.querySelector('.skin-switch-btn')) return; const parent = settingBtn.parentNode; // 1. 创建样式按钮,插入到设置按钮前面 styleBtn = createStyleButton(); parent.insertBefore(styleBtn, settingBtn); // 2. 创建换肤按钮,插入到样式按钮前面 // 最终排列:换肤 → 样式 → 设置 skinBtn = createSkinButton(); parent.insertBefore(skinBtn, styleBtn); console.log('[换肤助手] 按钮已插入'); // 3. 恢复保存的皮肤 restoreSkin(); // 4. 应用样式面板设置(恢复用户之前保存的透明度/模糊) applyStyleOverrides(); } catch (e) { console.error('[换肤助手] 插入按钮失败:', e); } } function observeAndInsert() { const observer = new MutationObserver(() => { const settingBtn = document.querySelector('.frame-header-setting-btn'); if (settingBtn && !document.querySelector('.skin-switch-btn')) { insertButton(); } }); observer.observe(document.body, { childList: true, subtree: true }); if (document.querySelector('.frame-header-setting-btn') && !document.querySelector('.skin-switch-btn')) { insertButton(); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', observeAndInsert); } else { observeAndInsert(); } // ===== 调试工具:清除自定义壁纸缓存 ===== unsafeWindow.clearCustomWallpaper = function(shouldReload = true) { GM_setValue('custom_wallpaper_base64', null); GM_setValue('custom_wallpaper_mode', 'cover'); GM_setValue('custom_locked', false); // 重置所有自定义卡片预览为灰色占位图 document.querySelectorAll('.skin-card[data-skin-class="page-theme-custom"] .skin-card-preview-inner').forEach(el => { // 移除内联样式,恢复 CSS 背景(灰色 SVG) el.style.backgroundImage = ''; el.style.backgroundSize = ''; el.style.backgroundRepeat = ''; }); // 如果当前正在使用自定义壁纸皮肤,移除背景并切回默认 if (document.body.classList.contains('page-theme-custom')) { document.body.classList.remove('page-theme-custom'); GM_setValue('qqmail_skin_classes', ''); const customStyle = document.getElementById('custom-bg-style'); if (customStyle) customStyle.remove(); } console.log('✅ 自定义壁纸缓存已清除'); if (shouldReload) { location.reload(); } }; console.log('💡 调试提示:在控制台执行 clearCustomWallpaper() 可清除自定义壁纸缓存'); // ===== 调试工具:清除 Bing 壁纸缓存 ===== unsafeWindow.clearBingWallpaper = function(shouldReload = true) { // 清除缓存中的 Bing 图片和日期 GM_setValue(BING_STORAGE_KEY_IMAGE, null); GM_setValue(BING_STORAGE_KEY_DATE, null); // 重置锁定状态 GM_setValue(BING_LOCKED_KEY, false); // 移除 Bing 背景样式 const bingStyle = document.getElementById('bing-bg-style'); if (bingStyle) bingStyle.remove(); // 如果当前正在使用 Bing 皮肤,移除 body 类并切换回默认 if (document.body.classList.contains('page-theme-bing')) { document.body.classList.remove('page-theme-bing'); GM_setValue(SKIN_CLASSES_KEY, ''); // 清除可能残留的样式 const customStyle = document.getElementById('custom-bg-style'); if (customStyle) customStyle.remove(); } console.log('✅ Bing 壁纸缓存已清除'); if (shouldReload) { location.reload(); } }; console.log('💡 调试提示:在控制台执行 clearBingWallpaper() 可清除 Bing 壁纸缓存'); /* 各theme对应样式备份 .frame-theme-layer-base, .frame-theme-layer-overlay, .frame-theme-layer-festive { --page-bg: initial; --page-bg-img: none; --sidebar-bg-img: none; --sidebar-bg-position: initial; --content-bg-img: none; --page-right-bg-img: none; --header-height: 160px; --header-base-bg-img: none; --header-left-bg-img: none; --header-left-bg-width: 400px; --header-right-bg-img: none; --header-right-bg-width: 420px; position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: -1; pointer-events: none; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; min-width: 820px; background-color: var(--page-bg); background-image: var(--page-bg-img); background-repeat: repeat; background-size: 220px 60px; overflow: hidden; } .frame-theme-layer-base.frame-theme-layer-base, .frame-theme-layer-overlay.frame-theme-layer-base, .frame-theme-layer-festive.frame-theme-layer-base { --page-bg: var(--bg_gray_web_0); } .frame-theme-layer-base.frame-theme-layer-overlay, .frame-theme-layer-overlay.frame-theme-layer-overlay, .frame-theme-layer-festive.frame-theme-layer-overlay { display: none; } .frame-theme-layer-base.frame-theme-layer-festive, .frame-theme-layer-overlay.frame-theme-layer-festive, .frame-theme-layer-festive.frame-theme-layer-festive { --header-height: 200px; --header-left-bg-width: 320px; --header-left-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/layer-festive/bg.2x.44f97f1.png); display: none; } .frame-theme-layer-base .frame-theme-bg-header, .frame-theme-layer-overlay .frame-theme-bg-header, .frame-theme-layer-festive .frame-theme-bg-header { position: relative; height: var(--header-height); background-image: var(--header-base-bg-img); background-repeat: repeat; background-size: auto 100%; } .frame-theme-layer-base .frame-theme-bg-header::before, .frame-theme-layer-overlay .frame-theme-bg-header::before, .frame-theme-layer-festive .frame-theme-bg-header::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: var(--header-left-bg-width); background-image: var(--header-left-bg-img); background-repeat: no-repeat; background-size: 100% 100%; } .frame-theme-layer-base .frame-theme-bg-header::after, .frame-theme-layer-overlay .frame-theme-bg-header::after, .frame-theme-layer-festive .frame-theme-bg-header::after { content: ''; position: absolute; right: 0; top: 0; bottom: 0; width: var(--header-right-bg-width); background-image: var(--header-right-bg-img); background-repeat: no-repeat; background-size: 100% 100%; } .frame-theme-layer-base .frame-theme-bg-body, .frame-theme-layer-overlay .frame-theme-bg-body, .frame-theme-layer-festive .frame-theme-bg-body { -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; height: calc(100% - var(--header-height)); } .frame-theme-layer-base .frame-theme-bg-sidebar, .frame-theme-layer-overlay .frame-theme-bg-sidebar, .frame-theme-layer-festive .frame-theme-bg-sidebar { width: 220px; height: 100%; background-image: var(--sidebar-bg-img); background-position: var(--sidebar-bg-position); background-repeat: no-repeat; background-size: 100% auto; } .frame-theme-layer-base .frame-theme-bg-route-content, .frame-theme-layer-overlay .frame-theme-bg-route-content, .frame-theme-layer-festive .frame-theme-bg-route-content { -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1; height: 100%; background-image: var(--content-bg-img); background-repeat: repeat; } .frame-theme-layer-base .frame-theme-bg-right, .frame-theme-layer-overlay .frame-theme-bg-right, .frame-theme-layer-festive .frame-theme-bg-right { width: 16px; height: 100%; background-image: var(--page-right-bg-img); background-repeat: no-repeat; background-size: 100% auto; } @media print { .frame-theme-layer-base, .frame-theme-layer-overlay, .frame-theme-layer-festive { display: none; } } body.page-color-theme #mailMainApp::-webkit-scrollbar-thumb { --color-scroll-bar-bg: var(--base_white_030); --color-scroll-bar-hover-bg: var(--base_white_060); --color-scroll-bar-active-bg: var(--base_white_070); } body.page-theme-sky .frame-theme-layer-base { background: linear-gradient(128deg, #305BD2 0%, #B8C2E0 72.12%); } body.page-theme-bamboo .frame-theme-layer-base { background: linear-gradient(128deg, #687D56 0%, #B2C89E 72.12%); } body.page-theme-turquoise .frame-theme-layer-base { background: linear-gradient(128deg, #40BDA5 0%, #40BF97 36.06%, #40BF6C 72.12%); } body.page-theme-firework .frame-theme-layer-base { background: linear-gradient(128deg, #EB8499 0%, #EB8984 36.06%, #EBA384 72.12%); } body.page-theme-ink .frame-theme-layer-base { background: linear-gradient(128deg, #3D455C 0%, #858FAD 72.12%); } body.page-theme-calamus .frame-theme-layer-base { background: linear-gradient(128deg, #5A3F54 0%, #A58D9D 72.12%); } body.page-theme-waterjourney.page-theme-waterjourney-1 .frame-theme-layer-base { --sidebar-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/waterjourney/sidebar_bottom_1.2x.ec0a3f4.png); } body.page-theme-waterjourney.page-theme-waterjourney-2 .frame-theme-layer-base { --sidebar-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/waterjourney/sidebar_bottom_2.2x.3a47cb9.png); } body.page-theme-waterjourney.page-theme-waterjourney-3 .frame-theme-layer-base { --sidebar-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/waterjourney/sidebar_bottom_3.2x.978fb5d.png); } body.page-theme-waterjourney.page-theme-waterjourney-4 .frame-theme-layer-base { --sidebar-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/waterjourney/sidebar_bottom_4.2x.c799f01.png); } body.page-theme-waterjourney.page-theme-waterjourney-5 .frame-theme-layer-base { --sidebar-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/waterjourney/sidebar_bottom_5.2x.a96c246.png); } body.page-theme-waterjourney.page-theme-waterjourney-6 .frame-theme-layer-base { --sidebar-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/waterjourney/sidebar_bottom_6.2x.2007638.png); } body.page-theme-waterjourney .frame-theme-layer-base { --page-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/waterjourney/page-bg.2x.abab75b.png); --sidebar-bg-position: bottom; --header-left-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/waterjourney/header-left.2x.b1b2204.png); --header-left-bg-width: 340px; --header-right-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/waterjourney/header-right.2x.06d9ba5.png); --header-right-bg-width: 520px; } body.page-theme-waterjourney .frame-sidebar .sidebar-menus { padding-bottom: 140px; } body.page-theme-orientalgreen .frame-theme-layer-base::after, body.page-theme-orientalgreen .frame-theme-layer-overlay::after { content: ''; position: absolute; top: 0; bottom: 0; left: 0; width: 220px; background: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.16)), to(rgba(0, 0, 0, 0))); background: linear-gradient(90deg, rgba(0, 0, 0, 0.16) 0%, rgba(0, 0, 0, 0) 100%); } body.page-theme-orientalgreen .frame-theme-layer-base { --page-bg: var(--theme_alpha_080); --page-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/orientalgreen/page-bg.2x.6f3c97e.png); --sidebar-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/orientalgreen/sidebar.2x.ee11a58.png); --content-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/orientalgreen/content-bg.1x.d2fb96c.jpg); --page-right-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/orientalgreen/page-right.2x.ad2993d.png); --header-base-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/orientalgreen/header-base.2x.d42d98a.png); --header-left-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/orientalgreen/header-left.2x.81f642f.png); --header-right-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/orientalgreen/header-right.2x.782ecb0.png); } body.page-theme-orientalgreen .frame-theme-layer-overlay { --page-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/orientalgreen/page-bg-dark.2x.a8f2f6f.png); --sidebar-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/orientalgreen/sidebar-dark.2x.9f8fae2.png); --content-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/orientalgreen/content-bg-dark.1x.4541f7e.jpg); --page-right-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageTheme/orientalgreen/page-right-dark.2x.16cbc32.png); --header-base-bg-img: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/P… */ /* 夏日限定logo .frame-header-logo { --header-logo: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageHeader/Logo/logo-theme-default.eb00ccc.png); -ms-flex-negative: 0; flex-shrink: 0; display: -webkit-inline-box; display: -ms-inline-flexbox; display: inline-flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; width: 220px; } .frame-header-logo.header-logo-single .header-logo-icon { cursor: auto; } .frame-header-logo .header-logo-icon { cursor: pointer; width: 220px; height: 60px; background-image: var(--header-logo); background-repeat: no-repeat; background-size: 100% 100%; } body.page-color-theme .frame-header-logo { --header-logo: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageHeader/Logo/logo-theme-color.ff51564.png); } body.page-theme-orientalgreen .frame-header-logo { --header-logo: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageHeader/Logo/logo-theme-orientalgreen.134350c.png); } body.page-festive .frame-header-logo { --header-logo: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/PageHeader/Logo/logo-festive-gif/000.366a0da.png); } */ })();