MediaWiki:Common.js:修订间差异
MediaWiki界面页面
更多操作
无编辑摘要 标签:已被回退 |
无编辑摘要 标签:已被回退 |
||
| 第111行: | 第111行: | ||
})(); | })(); | ||
(function() { | (function() { | ||
// | // 创建一个 style 标签用于存放动态 CSS | ||
const | const autoThemeStyle = document.createElement('style'); | ||
autoThemeStyle.id = 'dynamic-aero-theme'; | |||
document.head.appendChild(autoThemeStyle); | |||
function updateAutoTheme() { | |||
const storedTheme = localStorage.getItem('citizen-theme') || 'auto'; | |||
// | // 只有当用户选择“自动(auto)”或者从未设置过主题时才干预 | ||
if (storedTheme === 'auto') { | |||
const isDarkSystem = window.matchMedia('(prefers-color-scheme: dark)').matches; | |||
if (isDarkSystem) { | |||
// 如果系统是深色,注入 CSS 覆盖变量,模拟深色模式效果 | |||
autoThemeStyle.innerHTML = ` | |||
:root:not(.skin-theme-clientpref-day) { | |||
--color-surface-0: #1a1b1c !important; | |||
--color-surface-1: #242526 !important; | |||
--color-base-0: #eaecf0 !important; | |||
--color-heading: #ffffff !important; | |||
--background-color-base: #1a1b1c !important; | |||
} | |||
/* 确保菜单卡片也跟随变黑 */ | |||
.citizen-menu__card, #citizen-preferences__card { | |||
background-color: rgba(36, 37, 38, 0.85) !important; | |||
color: #ffffff !important; | |||
} | |||
`; | |||
} else { | |||
// 如果系统是浅色,清空注入的 CSS | |||
autoThemeStyle.innerHTML = ''; | |||
} | |||
} else { | |||
// 如果用户选了“深色”或“浅色”,清空注入,让 Citizen 原生逻辑接管 | |||
autoThemeStyle.innerHTML = ''; | |||
} | |||
} | } | ||
// 初始化并监听 | |||
updateAutoTheme(); | |||
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', updateAutoTheme); | |||
// | // 监听用户点击设置面板的操作,点击后立即重新判定 | ||
window.addEventListener('click', function(e) { | |||
if (e.target.closest('.citizen-preferences__card') || e.target.closest('#p-personal')) { | |||
setTimeout(updateAutoTheme, 100); | |||
} | |||
}); | |||
})(); | })(); | ||
2026年1月31日 (六) 09:36的版本
/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */
/**
* 搜索面板弹性动画逻辑
*/
(function() {
function handlePalette() {
const palette = document.querySelector('.citizen-command-palette');
if (palette) {
// 确保位置居中并触发动画类
if (!palette.classList.contains('glass-show')) {
palette.classList.add('glass-show');
}
} else {
// 当面板关闭时,移除所有带有 glass-show 的残留(虽然通常会被销毁)
const activePalettes = document.querySelectorAll('.glass-show');
activePalettes.forEach(p => p.classList.remove('glass-show'));
}
}
// 每 50ms 检查一次搜索框状态(保持和 V20 脚本逻辑一致)
setInterval(handlePalette, 50);
})();
// 在 MediaWiki:Common.js 中尝试
$(function() {
if ($('#p-navigation').length) {
var adHtml = '<div id="sidebar-ad"></div>';
$('#p-navigation').after(adHtml);
// 使用 API 获取解析后的模板内容并注入
$.get(mw.util.wikiScript('api'), {
action: 'parse',
text: '{{CitizenAd}}',
format: 'json'
}, function(data) {
$('#sidebar-ad').html(data.parse.text['*']);
});
}
});
/**
* Blockland Wiki Liquid Glass Lighting System
* 全局液态玻璃光影联动系统
*/
(function() {
'use strict';
// 1. 判定开关:检查是否开启了性能模式(Basic)
// 这里的类名对应你反馈的 citizen-feature-performance-mode-clientpref-1
const isPerformanceMode = () => {
return document.documentElement.classList.contains('citizen-feature-performance-mode-clientpref-1');
};
// 2. 目标选择器(包含目录 ID 和通用卡片类名)
const GLASS_SELECTORS = '#mw-panel-toc, #citizen-sidebar-lastmod, .citizen-menu__card, .citizen-toc-card, .citizen-command-palette, .infobox';
const syncLight = (e) => {
// 如果是性能模式,直接退出,不消耗任何 CPU
if (isPerformanceMode()) return;
const elements = document.querySelectorAll(GLASS_SELECTORS);
elements.forEach(el => {
const rect = el.getBoundingClientRect();
// 只有当元素在视口内且宽度不为 0 时才计算(性能优化)
if (rect.width > 0 && rect.top < window.innerHeight && rect.bottom > 0) {
const x = ((e.clientX - rect.left) / rect.width) * 100;
const y = ((e.clientY - rect.top) / rect.height) * 100;
// 注入坐标变量
el.style.setProperty('--mouse-x', x.toFixed(2) + '%');
el.style.setProperty('--mouse-y', y.toFixed(2) + '%');
}
});
};
// 3. 搜索面板 glass-show 逻辑整合
// 即使在性能模式,也可以保留简单的显示逻辑,或者一同禁用
const paletteCheck = setInterval(() => {
if (isPerformanceMode()) return;
const p = document.querySelector('.citizen-command-palette');
if (p && !p.classList.contains('glass-show')) {
p.classList.add('glass-show');
}
}, 100);
// 4. 事件监听(使用 requestAnimationFrame 保证丝滑)
let ticking = false;
document.addEventListener('mousemove', (e) => {
if (isPerformanceMode()) return;
if (!ticking) {
window.requestAnimationFrame(() => {
syncLight(e);
ticking = false;
});
ticking = true;
}
}, { passive: true });
// 5. 额外:当用户手动切换模式时清除变量(可选)
// 防止从 Aero 切换到 Basic 时光效残留在一半的位置
const observer = new MutationObserver(() => {
if (isPerformanceMode()) {
document.querySelectorAll(GLASS_SELECTORS).forEach(el => {
el.style.removeProperty('--mouse-x');
el.style.removeProperty('--mouse-y');
});
}
});
observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] });
})();
(function() {
// 创建一个 style 标签用于存放动态 CSS
const autoThemeStyle = document.createElement('style');
autoThemeStyle.id = 'dynamic-aero-theme';
document.head.appendChild(autoThemeStyle);
function updateAutoTheme() {
const storedTheme = localStorage.getItem('citizen-theme') || 'auto';
// 只有当用户选择“自动(auto)”或者从未设置过主题时才干预
if (storedTheme === 'auto') {
const isDarkSystem = window.matchMedia('(prefers-color-scheme: dark)').matches;
if (isDarkSystem) {
// 如果系统是深色,注入 CSS 覆盖变量,模拟深色模式效果
autoThemeStyle.innerHTML = `
:root:not(.skin-theme-clientpref-day) {
--color-surface-0: #1a1b1c !important;
--color-surface-1: #242526 !important;
--color-base-0: #eaecf0 !important;
--color-heading: #ffffff !important;
--background-color-base: #1a1b1c !important;
}
/* 确保菜单卡片也跟随变黑 */
.citizen-menu__card, #citizen-preferences__card {
background-color: rgba(36, 37, 38, 0.85) !important;
color: #ffffff !important;
}
`;
} else {
// 如果系统是浅色,清空注入的 CSS
autoThemeStyle.innerHTML = '';
}
} else {
// 如果用户选了“深色”或“浅色”,清空注入,让 Citizen 原生逻辑接管
autoThemeStyle.innerHTML = '';
}
}
// 初始化并监听
updateAutoTheme();
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', updateAutoTheme);
// 监听用户点击设置面板的操作,点击后立即重新判定
window.addEventListener('click', function(e) {
if (e.target.closest('.citizen-preferences__card') || e.target.closest('#p-personal')) {
setTimeout(updateAutoTheme, 100);
}
});
})();