MediaWiki:Common.js:修订间差异
小 移除上传文件、固定链接、引用此页 |
小 尝试增加针对移动端的紧凑模式识别 标签:已被回退 |
||
| 第31行: | 第31行: | ||
// logo 切换逻辑 | // logo 切换逻辑 | ||
// Common.js - footer logo 切换逻辑 | |||
$(function () { | $(function () { | ||
// | // ====================== | ||
// 工具函数 | |||
// ====================== | |||
// 判断当前主题:dark / light | |||
function getEffectiveTheme() { | function getEffectiveTheme() { | ||
var cls = document.documentElement.classList; | var cls = document.documentElement.classList; | ||
| 第43行: | 第48行: | ||
return 'light'; | return 'light'; | ||
} | } | ||
// | // 兜底:系统偏好 | ||
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { | if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { | ||
return 'dark'; | return 'dark'; | ||
| 第50行: | 第55行: | ||
} | } | ||
// 如果元素存在就设置 | // 判断是否为移动端 compact 模式(小图) | ||
function isCompactMode() { | |||
return window.matchMedia && window.matchMedia('(max-width: 500px)').matches; | |||
} | |||
// 如果元素存在就设置 src | |||
function setSrcIfExists(selector, src) { | function setSrcIfExists(selector, src) { | ||
var $el = $(selector); | var $el = $(selector); | ||
| 第56行: | 第66行: | ||
$el.attr('src', src); | $el.attr('src', src); | ||
console.log('[logo-switch] set', selector, '->', src); | console.log('[logo-switch] set', selector, '->', src); | ||
} | } | ||
} | } | ||
// | // ====================== | ||
// 主更新逻辑 | |||
// ====================== | |||
function updateLogos() { | function updateLogos() { | ||
var theme = getEffectiveTheme(); | var theme = getEffectiveTheme(); | ||
var compact = isCompactMode(); | |||
// 文件名后缀 | |||
var suffix = ''; | |||
if (compact) { | |||
suffix += '-compact'; | |||
} | |||
if (theme === 'dark') { | if (theme === 'dark') { | ||
setSrcIfExists('#footer-copyrightico img', '/resources/assets/cc-by-nc-sa | suffix += '-dark'; | ||
} | |||
// 公共 logo(所有皮肤都显示) | |||
setSrcIfExists('#footer-copyrightico img', '/resources/assets/cc-by-nc-sa' + suffix + '.svg'); | |||
setSrcIfExists('#footer- | setSrcIfExists('#footer-poweredbyico img', '/resources/assets/poweredby-mediawiki' + suffix + '.svg'); | ||
setSrcIfExists('#footer-poweredbysmwico img', '/resources/assets/poweredby-smw' + suffix + '.svg'); | |||
// Citizen 专属(仅当元素存在时才切换) | |||
if (document.body.classList.contains('skin-Citizen')) { | |||
setSrcIfExists('#footer-poweredbycitizenico img', '/resources/assets/poweredby-citizen' + suffix + '.svg'); | |||
} | } | ||
} | } | ||
// ====================== | |||
// 触发时机 | |||
// ====================== | |||
// 首次运行 | // 首次运行 | ||
updateLogos(); | updateLogos(); | ||
// 监听 <html> class | // 监听 <html> class 变化(主题切换) | ||
var htmlObserver = new MutationObserver(function (mutations) { | var htmlObserver = new MutationObserver(function (mutations) { | ||
for (var i = 0; i < mutations.length; i++) { | for (var i = 0; i < mutations.length; i++) { | ||
| 第89行: | 第114行: | ||
htmlObserver.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] }); | htmlObserver.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] }); | ||
// 监听 body | // 监听 body DOM 变动,防止 footer 异步插入 | ||
var bodyObserver = new MutationObserver(function () { | var bodyObserver = new MutationObserver(function () { | ||
updateLogos(); | updateLogos(); | ||
| 第95行: | 第120行: | ||
bodyObserver.observe(document.body, { childList: true, subtree: true }); | bodyObserver.observe(document.body, { childList: true, subtree: true }); | ||
// | // 监听系统主题变化 | ||
if (window.matchMedia) { | if (window.matchMedia) { | ||
var | var mqDark = window.matchMedia('(prefers-color-scheme: dark)'); | ||
if (typeof | if (typeof mqDark.addEventListener === 'function') { | ||
mqDark.addEventListener('change', updateLogos); | |||
} else if (typeof | } else if (typeof mqDark.addListener === 'function') { | ||
// | mqDark.addListener(updateLogos); | ||
} | |||
// 监听屏幕宽度变化(compact <-> normal) | |||
var mqCompact = window.matchMedia('(max-width: 500px)'); | |||
if (typeof mqCompact.addEventListener === 'function') { | |||
mqCompact.addEventListener('change', updateLogos); | |||
} else if (typeof mqCompact.addListener === 'function') { | |||
mqCompact.addListener(updateLogos); | |||
} | } | ||
} | } | ||
// | // MediaWiki hook | ||
if (window.mw && mw.hook) { | if (window.mw && mw.hook) { | ||
mw.hook('user.preferencesSaved').add(updateLogos); | mw.hook('user.preferencesSaved').add(updateLogos); | ||
} | } | ||
// 兜底:页面 load | // 兜底:页面 load 后、延迟再执行一次 | ||
$(window).on('load', updateLogos); | $(window).on('load', updateLogos); | ||
setTimeout(updateLogos, 1500); | setTimeout(updateLogos, 1500); | ||
}); | }); | ||