MediaWiki:Citizen.js
MediaWiki界面页面
更多操作
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
(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);
// 样式:原版亮绿 + 纯拐角无方块
const css = document.createElement('style');
css.textContent = `
.magnetic-true-corner{
position:fixed;
left:0;top:0;
width:0;height:0;
pointer-events:none;
z-index:999999!important;
}
.magnetic-true-corner i{
position:absolute;
width:14px;height:14px;
border:2px solid #17f700;
background:transparent!important;
box-shadow:none!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 精准按钮选择器
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'
].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});
});
})();