如何避免多页面间重复触发加载动画(0%→100%)
发布时间 - 2026-01-30 00:00:00 点击率:次本文教你通过 localstorage 持久化记录加载状态,使网站在用户跳转至 about.html 或返回 index.html 时不再重复执行加载动画,仅首次访问触发一次,提升用户体验与性能。
你遇到的问题本质是:每个 HTML 页面(如 index.html 和 about.html)都是独立加载的,JavaScript 在每次页面刷新/跳转后都会重新执行 counter() 函数,导致加载动画反复播放。而真正的目标并非“禁用动画”,而是 “只在用户首次访问网站时执行一次加载流程,后续页面跳转跳过该过程”。
解决思路非常清晰:利用浏览器的 localStorage 存储一个标记(例如 'loadedOnce': 'true'),在动画完成时写入;每次页面加载时先检查该标记——若已存在,则直接跳过计数器,立即应用动画类;否则执行完整加载逻辑。
以下是优化后的完整实现方案:
✅ 正确做法:基于 localStorage 的单次加载控制
0

// 加载动画主函数(带持久化判断)
function initLoadingAnimation() {
const loadNo = document.getElementById('load-no');
const load = document.getElementById('load');
// ✅ 关键:检查是否已加载过
if (localStorage.getItem('loadedOnce') === 'true') {
// 已加载 → 立即隐藏加载屏并应用动画类(模拟已完成状态)
load.classList.add('loaded'); // 可配合 CSS 过渡
applyAnimations();
return;
}
// ❌ 首次访问 → 执行计数动画
let number = 0;
const counts = setInterval(() => {
number++;
loadNo.textContent = number;
if (number === 100) {
clearInterval(counts);
localStorage.setItem('loadedOnce', 'true'); // ✅ 标记已加载
applyAnimations();
}
}, 30); // 每30ms +1%,全程约3秒(100×30ms)
}
// ✅ 提取动画逻辑为独立函数,便于复用
function applyAnimations() {
const load = document.getElementById('load');
const ev_logo = document.getElementById('ev-logo');
const nav_a_select = document.querySelectorAll('.nav-a');
const fb_icon = document.querySelector('.fb-icon');
const github_icon = document.querySelector('.github-icon');
const line_h = document.querySelector('.line-h');
const line_v = document.querySelector('.line-v');
const copyright_icon = document.querySelector('.copyright-icon');
const year = document.querySelector('.year');
const name = document.querySelector('.name');
const earl_villarias = document.querySelector('.earl-villarias');
const slogan_text = document.querySelector('.slogan-text');
const slogan_line_select = document.querySelectorAll('.slogan-line');
// 隐藏加载层(可配合 CSS transition)
load.style.pointerEvents = 'none';
load.style.opacity = '0';
load.style.transition = 'opacity 0.5s ease-out';
// 触发各类元素动画类
if (ev_logo) ev_logo.style.transform = 'translate3d(0, 0, 0)';
if (fb_icon) fb_icon.classList.add('fb-icon-s');
if (github_icon) github_icon.classList.add('github-icon-s');
if (line_h) line_h.classList.add('line-expand-h');
if (line_v) line_v.classList.add('line-expand-v');
if (copyright_icon) copyright_icon.classList.add('icon-year-s');
if (year) year.classList.add('icon-year-s');
if (name) name.classList.add('name-s');
if (earl_villarias) earl_villarias.classList.add('name-show');
if (slogan_text) slogan_text.classList.add('slogan-show');
nav_a_select.forEach(el => el.classList.add('s-d'));
slogan_line_select.forEach(el => el.classList.add('slogan-line-expand'));
}
// 启动加载逻辑
document.addEventListener('DOMContentLoaded', initLoadingAnimation);⚠️ 注意事项 & 最佳实践
- 不要用 location.href 跳转替代 SPA 导航:如果你使用纯 HTML 多页(),浏览器必然刷新页面,此时 localStorage 是唯一可靠的跨页状态方案。若追求更流畅体验,建议未来升级为 SPA(单页应用),用 history.pushState() + 动态内容替换,彻底规避重复加载。
- 清除测试缓存:开发时若修改了 localStorage 逻辑,记得在浏览器控制台执行 localStorage.removeItem('loadedOnce') 或按 Ctrl+Shift+Del 清除站点数据,避免误判。
-
CSS 配合建议:
#load { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: #000; z-index: 9999; display: flex; justify-content: center; align-items: center; transition: opacity 0.5s; } #load.loaded { opacity: 0; pointer-events: none; } #load-wrapper { text-align: center; } #load-no { font-size: 4rem; color: #fff; font-weight: bold; }
✅ 总结
你不需要删除任何页面中的 #load 结构,也不必放弃多页架构。只需引入两行关键逻辑:
① 读取 localStorage 判断是否首次访问;
② 动画完成时写入 'loadedOnce': 'true'。
从此,无论用户从首页跳转到关于页,还是从外部链接直达任一子页,加载动画都只会优雅地执行一次——专业、轻量、兼容性好,完美匹配新手进阶需求。
# css
# javascript
# java
# html
# git
# go
# github
# 浏览器
# app
# ssl
# 架构
# location
# history
# href
# 加载
# 首次
# 跳转
# 跳过
# 都是
# 进阶
# 多页
# 如果你
# 只需
# 是从
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
如何在企业微信快速生成手机电脑官网?
Laravel怎么调用外部API_Laravel Http Client客户端使用
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
公司门户网站制作流程,华为官网怎么做?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
如何彻底卸载建站之星软件?
如何在Windows 2008云服务器安全搭建网站?
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Python文件异常处理策略_健壮性说明【指导】
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
高端建站如何打造兼具美学与转化的品牌官网?
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
详解Oracle修改字段类型方法总结
如何挑选优质建站一级代理提升网站排名?
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
如何将凡科建站内容保存为本地文件?
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
怎么用AI帮你设计一套个性化的手机App图标?
如何快速配置高效服务器建站软件?
js实现点击每个li节点,都弹出其文本值及修改
PythonWeb开发入门教程_Flask快速构建Web应用
JavaScript Ajax实现异步通信
Laravel怎么判断请求类型_Laravel Request isMethod用法
电商网站制作价格怎么算,网上拍卖流程以及规则?
如何在橙子建站中快速调整背景颜色?
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
如何快速上传建站程序避免常见错误?
jQuery validate插件功能与用法详解
网站制作报价单模板图片,小松挖机官方网站报价?
javascript中的try catch异常捕获机制用法分析
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
音响网站制作视频教程,隆霸音响官方网站?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
如何正确选择百度移动适配建站域名?
Python文件流缓冲机制_IO性能解析【教程】
JS弹性运动实现方法分析
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何在IIS中配置站点IP、端口及主机头?
bootstrap日历插件datetimepicker使用方法
Laravel Blade模板引擎语法_Laravel Blade布局继承用法


