MediaWiki:Citizen.js:修订间差异
MediaWiki界面页面
更多操作
无编辑摘要 |
无编辑摘要 |
||
| 第4行: | 第4行: | ||
mw.loader.using( [], function() { | mw.loader.using( [], function() { | ||
const ptr = document.createElement('div'); | const ptr = document.createElement('div'); | ||
ptr.className = 'magnetic-true-corner'; | ptr.className = 'magnetic-true-corner'; | ||
| 第10行: | 第9行: | ||
document.body.appendChild(ptr); | document.body.appendChild(ptr); | ||
// | // 核心:明暗模式自动变色CSS | ||
const css = document.createElement('style'); | const css = document.createElement('style'); | ||
css.textContent = ` | css.textContent = ` | ||
/* 默认白天亮色:原版荧光绿 */ | |||
.magnetic-true-corner i{ | |||
position:absolute; | |||
width:14px;height:14px; | |||
border:2px solid #17f700; | |||
background:transparent!important; | |||
box-shadow:none!important; | |||
} | |||
/* Citizen深色/暗夜模式 自动变色 */ | |||
body.skin-citizen--dark .magnetic-true-corner i, | |||
body.theme-dark .magnetic-true-corner i, | |||
html[data-theme="dark"] .magnetic-true-corner i{ | |||
border-color: #4fc3f7 !important; | |||
} | |||
.magnetic-true-corner{ | .magnetic-true-corner{ | ||
position:fixed; | position:fixed; | ||
| 第20行: | 第34行: | ||
z-index:999999!important; | z-index:999999!important; | ||
} | } | ||
.magnetic-true-corner i:nth-child(1){top:-2px;left:-2px;border-right:none;border-bottom:none;} | .magnetic-true-corner i:nth-child(1){top:-2px;left:-2px;border-right:none;border-bottom:none;} | ||
.magnetic-true-corner i:nth-child(2){top:-2px;right:-2px;border-left:none;border-bottom:none;} | .magnetic-true-corner i:nth-child(2){top:-2px;right:-2px;border-left:none;border-bottom:none;} | ||
| 第37行: | 第43行: | ||
let hoverEl = null; | let hoverEl = null; | ||
let mx = 0, my = 0; | let mx = 0, my = 0; | ||
let smoothX = 0, smoothY = 0; | let smoothX = 0, smoothY = 0; | ||
let curW = 40, curH = 40; | let curW = 40, curH = 40; | ||
document.addEventListener('mousemove', e => { | document.addEventListener('mousemove', e => { | ||
mx = e.clientX; | mx = e.clientX; | ||
| 第47行: | 第51行: | ||
}); | }); | ||
// | // 顺滑磁吸动画保留 | ||
function loop(){ | function loop(){ | ||
const ease = 0.15; | const ease = 0.15; | ||
if(hoverEl){ | if(hoverEl){ | ||
const r = hoverEl.getBoundingClientRect(); | const r = hoverEl.getBoundingClientRect(); | ||
const targetX = r.left + r.width / 2; | const targetX = r.left + r.width / 2; | ||
| 第60行: | 第63行: | ||
curH = r.height; | curH = r.height; | ||
ptr.style.left = (smoothX - curW / 2) + 'px'; | ptr.style.left = (smoothX - curW / 2) + 'px'; | ||
ptr.style.top = (smoothY - curH / 2) + 'px'; | ptr.style.top = (smoothY - curH / 2) + 'px'; | ||
| 第66行: | 第68行: | ||
ptr.style.height = curH + 'px'; | ptr.style.height = curH + 'px'; | ||
}else{ | }else{ | ||
curW = 40; | curW = 40; | ||
curH = 40; | curH = 40; | ||
| 第81行: | 第82行: | ||
loop(); | loop(); | ||
// | // 全覆盖:Citizen原生 + 你的自定义按钮 + Commentstreams插件 | ||
const sel = [ | const sel = [ | ||
'.citizen-nav a', | |||
'.citizen-menu a', | |||
'.citizen-button', | |||
'.citizen-action-button', | |||
'.cdx-button', | |||
'.mw-editsection a', | |||
'#citizen-header__nav a', | |||
'.citizen-sidebar a', | |||
'._target', | |||
'.commentstreams-button', | |||
'.commentstreams-submit', | |||
'.commentstreams-header button', | |||
'.commentstreams-box button', | |||
'.mw-ui-button', | |||
'button', | |||
'a[role="button"]' | |||
].join(','); | ].join(','); | ||
2026年3月31日 (二) 16:08的版本
(function() {
if( window.magneticCursorInit ) return;
window.magneticCursorInit = true;
mw.loader.using( [], function() {
const ptr = document.createElement('div');
ptr.className = 'magnetic-true-corner';
ptr.innerHTML = `<i></i><i></i><i></i><i></i>`;
document.body.appendChild(ptr);
// 核心:明暗模式自动变色CSS
const css = document.createElement('style');
css.textContent = `
/* 默认白天亮色:原版荧光绿 */
.magnetic-true-corner i{
position:absolute;
width:14px;height:14px;
border:2px solid #17f700;
background:transparent!important;
box-shadow:none!important;
}
/* Citizen深色/暗夜模式 自动变色 */
body.skin-citizen--dark .magnetic-true-corner i,
body.theme-dark .magnetic-true-corner i,
html[data-theme="dark"] .magnetic-true-corner i{
border-color: #4fc3f7 !important;
}
.magnetic-true-corner{
position:fixed;
left:0;top:0;
width:0;height:0;
pointer-events:none;
z-index:999999!important;
}
.magnetic-true-corner i:nth-child(1){top:-2px;left:-2px;border-right:none;border-bottom:none;}
.magnetic-true-corner i:nth-child(2){top:-2px;right:-2px;border-left:none;border-bottom:none;}
.magnetic-true-corner i:nth-child(3){bottom:-2px;left:-2px;border-right:none;border-top:none;}
.magnetic-true-corner i:nth-child(4){bottom:-2px;right:-2px;border-left:none;border-top:none;}
`;
document.head.appendChild(css);
let hoverEl = null;
let mx = 0, my = 0;
let smoothX = 0, smoothY = 0;
let curW = 40, curH = 40;
document.addEventListener('mousemove', e => {
mx = e.clientX;
my = e.clientY;
});
// 顺滑磁吸动画保留
function loop(){
const ease = 0.15;
if(hoverEl){
const r = hoverEl.getBoundingClientRect();
const targetX = r.left + r.width / 2;
const targetY = r.top + r.height / 2;
smoothX += (targetX - smoothX) * ease;
smoothY += (targetY - smoothY) * ease;
curW = r.width;
curH = r.height;
ptr.style.left = (smoothX - curW / 2) + 'px';
ptr.style.top = (smoothY - curH / 2) + 'px';
ptr.style.width = curW + 'px';
ptr.style.height = curH + 'px';
}else{
curW = 40;
curH = 40;
smoothX += (mx - smoothX) * ease;
smoothY += (my - smoothY) * ease;
ptr.style.left = (smoothX - 20) + 'px';
ptr.style.top = (smoothY - 20) + 'px';
ptr.style.width = curW + 'px';
ptr.style.height = curH + 'px';
}
requestAnimationFrame(loop);
}
loop();
// 全覆盖:Citizen原生 + 你的自定义按钮 + Commentstreams插件
const sel = [
'.citizen-nav a',
'.citizen-menu a',
'.citizen-button',
'.citizen-action-button',
'.cdx-button',
'.mw-editsection a',
'#citizen-header__nav a',
'.citizen-sidebar a',
'._target',
'.commentstreams-button',
'.commentstreams-submit',
'.commentstreams-header button',
'.commentstreams-box button',
'.mw-ui-button',
'button',
'a[role="button"]'
].join(',');
function bind(){
document.querySelectorAll(sel).forEach(el=>{
if(el._magBind)return;
el._magBind = 1;
el.addEventListener('mouseenter', ()=> hoverEl = el);
el.addEventListener('mouseleave', ()=> hoverEl = null);
});
}
bind();
new MutationObserver(bind).observe(document.body,{childList:true,subtree:true});
});
})();