btn }); function showPanel(){ if(!iframe.getAttribute('src')) iframe.src = iframe.dataset.src; // 懒加载 positionPanel(panel, btn); } function hidePanel(){ panel.style.display = 'none'; } btn.addEventListener('mouseenter', showPanel); btn.addEventListener('mouseleave', function(e){ var r = e.relatedTarget; if(r === panel || (r && panel.contains(r))) return; // 移向面板,不关闭 hidePanel(); }); panel.addEventListener('mouseleave', function(e){ var r = e.relatedTarget; if(r !== btn && (!r || !btn.contains(r))) hidePanel(); }); // 移动端触摸切换 btn.addEventListener('touchstart', function(e){ e.preventDefault(); if(panel.style.display !== 'none') hidePanel(); else showPanel(); }, { passive: false }); // 点击面板外部关闭 document.addEventListener('mousedown', function(e){ if(panel.style.display !== 'none' && !panel.contains(e.target) && !btn.contains(e.target)){ hidePanel(); } }); }); // 窗口缩放时重定位已展开面板 window.addEventListener('resize', function(){ panels.forEach(function(p){ if(p.panel.style.display !== 'none') positionPanel(p.panel, p.btn); }); }); } if(document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', init); } else { init(); } })();