init local code
This commit is contained in:
@@ -0,0 +1,190 @@
|
||||
/* 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();
|
||||
})();
|
||||
Reference in New Issue
Block a user