Spaces:
Running
Running
// 加载页面控制函数 | |
function initLoadingScreen() { | |
const loadingScreen = document.querySelector('.loading-screen'); | |
const progressBar = document.querySelector('.progress-bar'); | |
const progressText = document.querySelector('.progress-text .digital-glitch'); | |
const loadingMessage = document.querySelector('.loading-message'); | |
if (!loadingScreen || !progressBar || !progressText) return; | |
// 检查是否是从站内导航回来的 | |
const referrer = document.referrer; | |
const currentHost = window.location.host; | |
// 如果是从同一站点的其他页面返回的,不显示加载动画 | |
if (referrer && referrer.includes(currentHost) && !isPageReload()) { | |
loadingScreen.classList.add('hidden'); | |
loadingScreen.style.display = 'none'; | |
return; | |
} | |
const messages = [ | |
"Initializing system components...", | |
"Connecting to neural network...", | |
"Loading AI modules...", | |
"Calibrating response patterns...", | |
"Starting quantum processors..." | |
]; | |
let progress = 0; | |
const totalDuration = 5000; // 5秒钟完成加载 | |
const interval = 30; // 每30ms更新一次 | |
const steps = totalDuration / interval; | |
const increment = 100 / steps; | |
// 随机更新消息 | |
let messageIndex = 0; | |
const updateProgress = () => { | |
progress += increment; | |
// 添加一些随机性,模拟真实加载 | |
const randomFactor = Math.random() * 0.5; | |
const adjustedProgress = Math.min(progress + randomFactor, 100); | |
// 更新进度条宽度 | |
progressBar.style.width = `${adjustedProgress}%`; | |
// 更新进度文本 | |
const displayProgress = Math.floor(adjustedProgress); | |
progressText.textContent = `${displayProgress}%`; | |
// 不同阶段显示不同消息 | |
if (displayProgress > messageIndex * 25 && messageIndex < messages.length) { | |
loadingMessage.textContent = messages[messageIndex]; | |
messageIndex++; | |
// 添加闪烁效果 | |
loadingScreen.style.filter = 'brightness(1.2)'; | |
setTimeout(() => { | |
loadingScreen.style.filter = 'brightness(1)'; | |
}, 100); | |
} | |
// 模拟网络加载的变化 | |
if (displayProgress >= 99.5) { | |
// 加载完成,隐藏加载屏幕 | |
setTimeout(() => { | |
loadingScreen.classList.add('hidden'); | |
// 完全隐藏后从DOM中移除 | |
setTimeout(() => { | |
loadingScreen.style.display = 'none'; | |
}, 500); | |
}, 200); | |
return; | |
} | |
// 添加随机故障效果 | |
if (Math.random() < 0.1) { | |
createGlitchEffect(); | |
} | |
requestAnimationFrame(updateProgress); | |
}; | |
// 创建故障效果 | |
const createGlitchEffect = () => { | |
// 屏幕抖动 | |
loadingScreen.style.transform = `translate(${(Math.random() - 0.5) * 10}px, ${(Math.random() - 0.5) * 5}px)`; | |
// 随机调整颜色和不透明度 | |
loadingScreen.style.filter = `hue-rotate(${Math.random() * 30}deg) brightness(${1 + Math.random() * 0.3})`; | |
// 恢复正常 | |
setTimeout(() => { | |
loadingScreen.style.transform = 'translate(0, 0)'; | |
loadingScreen.style.filter = 'none'; | |
}, 100); | |
}; | |
// 开始更新进度 | |
setTimeout(() => { | |
updateProgress(); | |
}, 300); | |
} | |
// 动态产生随机粒子 | |
function createRandomParticle() { | |
const container = document.querySelector('.particle-container'); | |
if (!container) return; | |
setInterval(() => { | |
const particle = document.createElement('div'); | |
particle.className = 'particle'; | |
// 随机位置 | |
particle.style.left = `${Math.random() * 100}%`; | |
particle.style.top = '100%'; | |
// 随机大小 | |
const size = Math.random() * 2 + 1; | |
particle.style.width = `${size}px`; | |
particle.style.height = `${size}px`; | |
// 获取CSS变量 | |
const styles = getComputedStyle(document.documentElement); | |
const colorOptions = [ | |
styles.getPropertyValue('--accent-green').trim(), | |
styles.getPropertyValue('--accent-color-5').trim(), | |
styles.getPropertyValue('--accent-blue').trim(), | |
styles.getPropertyValue('--accent-color-1').trim() | |
]; | |
// 随机颜色 | |
const randomColor = colorOptions[Math.floor(Math.random() * colorOptions.length)]; | |
particle.style.backgroundColor = randomColor; | |
particle.style.boxShadow = `0 0 5px ${randomColor}`; | |
// 随机透明度 | |
particle.style.opacity = (Math.random() * 0.5 + 0.3).toString(); | |
// 添加到容器 | |
container.appendChild(particle); | |
// 设置动画结束后移除元素 | |
setTimeout(() => { | |
particle.remove(); | |
}, 5000); | |
}, 600); // 每600ms创建一个新粒子 | |
} | |
// 添加主题选项动画效果 | |
function animateThemeOptions() { | |
const themeOptions = document.querySelectorAll('.theme-option'); | |
themeOptions.forEach((option, index) => { | |
// 直接显示元素,不使用动画过渡 | |
option.style.opacity = '1'; | |
}); | |
} | |
// 页面加载完成后初始化效果 | |
document.addEventListener('DOMContentLoaded', function() { | |
// 初始化加载页面 | |
initLoadingScreen(); | |
// 初始化粒子效果 | |
createRandomParticle(); | |
// 初始化主题选项动画 | |
animateThemeOptions(); | |
}); | |
// 仅用于开发环境 - 清除会话状态 | |
function resetVisitState() { | |
// 清除会话状态相关变量 | |
sessionStorage.clear(); | |
console.log('Visit state has been reset. This will simulate a first-time visit on the next navigation.'); | |
} | |
// 注释掉下面这行代码来禁用自动重置(仅开发环境使用) | |
// resetVisitState(); | |
// 判断页面是否为刷新 | |
function isPageReload() { | |
// 如果页面表现性能数据可用,检查导航类型 | |
if (window.performance && window.performance.navigation) { | |
return window.performance.navigation.type === 1; // 1表示页面刷新 | |
} | |
// 对较新的浏览器使用Navigation Timing API | |
if (window.performance && window.performance.getEntriesByType && window.performance.getEntriesByType('navigation').length) { | |
return window.performance.getEntriesByType('navigation')[0].type === 'reload'; | |
} | |
// 无法确定时,假设不是刷新 | |
return false; | |
} | |