// ==UserScript== // @name 视频控制栏0.2秒消失 // @namespace http://tampermonkey.net/ // @version 5.0 // @description 视频控制栏加快消失,鼠标静止0.2秒和移开视频区域生效。 // @author you // @match *://*/* // @grant none // @run-at document-start // ==/UserScript== (() => { const IDLE = 200; // 静止多久后锁死 let timer = null; let lastMv = 0; /* 通用选择器 */ const SEL = [ '.bilibili-player-control-wrap','.bpx-player-control-wrap','.txp_controls', '.prism-controlbar','.ytp-chrome-bottom','.vjs-control-bar','.dplayer-controller', '.control-bar','.controls','.video-controls' ].join(','); /* 遍历 shadowRoot */ const eachBar = (fn, root=document) => { root.querySelectorAll(SEL).forEach(fn); root.querySelectorAll('*').forEach(el=>{ if(el.shadowRoot) eachBar(fn, el.shadowRoot); }); }; /* 锁/解锁函数 */ function lock() { eachBar(bar => { bar.dataset.locked = 1; bar.style.opacity = '0'; bar.style.pointerEvents = 'none'; }); } function unlock() { eachBar(bar => { delete bar.dataset.locked; bar.style.opacity = ''; bar.style.pointerEvents = ''; }); } /* 监听鼠标 */ function onMove() { lastMv = Date.now(); clearTimeout(timer); unlock(); timer = setTimeout(lock, IDLE); } document.addEventListener('mousemove', onMove, {passive:true}); document.addEventListener('mouseleave', ()=>{clearTimeout(timer); lock();}, {passive:true}); /* 样式写入保护:只要 locked=1 就强制改回 0 */ setInterval(()=>{ eachBar(bar=>{ if(bar.dataset.locked && bar.style.opacity!=='0'){ bar.style.opacity='0'; bar.style.pointerEvents='none'; } }); }, 50); // 50ms 一次,足够快 /* 初始 */ onMove(); })();