/* scholar-blue 主题脚本:顶栏日期 + 轮播(圆点/箭头/触摸) + 导航吸顶反蓝 + 移动端抽屉与二级手风琴。 与 default 同源逻辑,无任何外部依赖。 */ (function () { 'use strict'; /* ---------- 顶栏日期(本地时间,YYYY年M月D日 星期X) ---------- */ var dateEl = document.getElementById('siteDate'); if (dateEl) { var now = new Date(); var week = ['日', '一', '二', '三', '四', '五', '六'][now.getDay()]; dateEl.textContent = now.getFullYear() + '年' + (now.getMonth() + 1) + '月' + now.getDate() + '日 星期' + week; } /* ---------- 导航吸顶反蓝(桌面端;≤768 不吸顶) ---------- */ var nav = document.getElementById('spNav'); var DESKTOP_MIN = 769; var navBaseTop = 0; var holder = null; function measureNavTop() { unlockNav(); navBaseTop = nav.getBoundingClientRect().top + window.pageYOffset; } function lockNav() { if (!nav.classList.contains('sp-nav--fixed')) { holder = document.createElement('div'); holder.className = 'sp-nav-holder'; holder.style.height = nav.offsetHeight + 'px'; nav.parentNode.insertBefore(holder, nav); nav.classList.add('sp-nav--fixed'); } else if (holder) { holder.style.height = nav.offsetHeight + 'px'; } } function unlockNav() { nav.classList.remove('sp-nav--fixed'); if (holder && holder.parentNode) { holder.parentNode.removeChild(holder); } holder = null; } function onScrollNav() { if (window.innerWidth < DESKTOP_MIN) { unlockNav(); return; } if (window.pageYOffset > navBaseTop) { lockNav(); } else { unlockNav(); } } if (nav) { measureNavTop(); window.addEventListener('scroll', onScrollNav, { passive: true }); var resizeTimer = null; window.addEventListener('resize', function () { if (resizeTimer) { window.clearTimeout(resizeTimer); } resizeTimer = window.setTimeout(function () { measureNavTop(); onScrollNav(); }, 150); }); } /* ---------- 移动端抽屉 + 二级手风琴 ---------- */ var navToggle = document.querySelector('.sp-nav-toggle'); var navList = document.querySelector('.sp-nav-list'); if (navToggle && navList) { navToggle.addEventListener('click', function () { var open = navList.classList.toggle('sp-open'); navToggle.setAttribute('aria-expanded', open ? 'true' : 'false'); }); } /* 窄屏下:点击带二级的项先展开面板,再点才跳转;宽屏交还给 CSS hover */ if (navList) { navList.addEventListener('click', function (e) { if (window.innerWidth >= DESKTOP_MIN) { return; } var link = e.target.closest ? e.target.closest('a') : null; if (!link) { return; } var li = link.parentElement; if (!li || !li.classList.contains('has-sub')) { return; } var sub = li.querySelector('.sp-sub'); if (!sub) { return; } if (!li.classList.contains('sp-sub-open')) { e.preventDefault(); li.classList.add('sp-sub-open'); } }); } /* ---------- 首页轮播 ---------- */ var root = document.querySelector('.sp-banner'); var slides = document.querySelectorAll('.sp-banner-slide'); var dots = document.querySelectorAll('.sp-banner-dots button'); var prevBtn = document.querySelector('.sp-banner-arrow.prev'); var nextBtn = document.querySelector('.sp-banner-arrow.next'); if (!slides.length || !root) { return; } var current = 0; var timer = null; var INTERVAL = 5000; function show(index) { slides[current].classList.remove('active'); if (dots[current]) { dots[current].classList.remove('active'); } current = (index + slides.length) % slides.length; slides[current].classList.add('active'); if (dots[current]) { dots[current].classList.add('active'); } } function start() { stop(); if (slides.length > 1) { timer = window.setInterval(function () { show(current + 1); }, INTERVAL); } } function stop() { if (timer) { window.clearInterval(timer); timer = null; } } dots.forEach(function (dot, index) { dot.addEventListener('click', function () { show(index); start(); }); }); if (prevBtn) { prevBtn.addEventListener('click', function () { show(current - 1); start(); }); } if (nextBtn) { nextBtn.addEventListener('click', function () { show(current + 1); start(); }); } root.addEventListener('mouseenter', stop); root.addEventListener('mouseleave', start); root.addEventListener('focusin', stop); root.addEventListener('focusout', start); root.setAttribute('tabindex', '-1'); root.addEventListener('keydown', function (e) { if (e.key === 'ArrowLeft') { show(current - 1); start(); } else if (e.key === 'ArrowRight') { show(current + 1); start(); } }); /* 触摸滑动切页 */ var touchX = null; root.addEventListener('touchstart', function (e) { touchX = e.changedTouches[0].clientX; stop(); }, { passive: true }); root.addEventListener('touchend', function (e) { if (touchX === null) { return; } var dx = e.changedTouches[0].clientX - touchX; if (Math.abs(dx) > 40) { show(dx < 0 ? current + 1 : current - 1); } touchX = null; start(); }, { passive: true }); start(); })();