如何避免多页面间重复触发加载动画(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布局继承用法