You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何动态设置动画时长以匹配页面加载时间?

实现预加载动画与页面加载时长同步的方案

这个需求我太熟了!之前做电商项目的时候,产品就要求预加载动画必须完整走完,哪怕页面秒开也不能跳帧,折腾了几次终于摸出了靠谱的实现方式,给你拆解下:

核心逻辑

本质就是先记录页面加载的起始时间,等页面完全加载完成后计算总耗时,再把这个耗时动态设置为动画的时长,让动画刚好和页面加载同步结束。如果加载太快或太慢,还可以加个最小/最大时长限制,保证用户体验。

具体实现步骤

  1. 精准记录加载起始时间
    要在页面最开始的位置(比如<head>的最顶部)就记录时间,用performance.now()Date.now()更靠谱——它是高精度时间戳,不受系统时间调整的影响,能准确计算页面从开始加载到完成的真实耗时。

  2. 用CSS变量控制动画时长
    别给动画写死固定时长,改用CSS变量来动态控制,这样后面JS可以随时修改,不用硬改CSS代码。

  3. 页面加载完成后计算并设置动画时长
    window.load事件(等所有资源包括图片、字体都加载完)里,计算总加载时间,然后把这个时间转成CSS能识别的单位(秒/毫秒),赋值给CSS变量,再触发动画完成的状态。

  4. 处理边界情况

    • 如果页面加载太快(比如小于1.5秒),动画会一闪而过,用户根本没看清,所以要设置最小动画时长
    • 如果页面加载太慢(比如超过8秒),动画拖得太久会让用户烦躁,所以要设置最大动画时长,超过这个时间就直接结束动画。

完整代码示例

HTML

<!-- 预加载容器 -->
<div class="preloader">
  <div class="loader-bar"></div>
</div>

CSS

.preloader {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #ffffff;
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 9999;
  /* 隐藏时的过渡效果 */
  transition: opacity 0.3s ease, visibility 0s 0.3s;
}

/* 预加载器隐藏状态 */
.preloader.hidden {
  opacity: 0;
  visibility: hidden;
}

.loader-bar {
  width: 0;
  height: 4px;
  background-color: #2563eb;
  /* 用CSS变量控制过渡时长,默认0秒 */
  transition: width var(--animation-duration, 0s) linear;
}

JS(jQuery版本)

// 页面加载的第一时间记录起始时间,放在<head>最顶部
const startTime = performance.now();

$(window).load(function() {
  // 计算页面总加载耗时(毫秒)
  const totalLoadTime = performance.now() - startTime;
  
  // 设置最小/最大动画时长(根据需求调整)
  const minDuration = 1500; // 最少1.5秒
  const maxDuration = 8000; // 最多8秒
  
  // 确定最终动画时长:取加载时间和最小/最大值的中间值
  const finalDuration = Math.max(minDuration, Math.min(totalLoadTime, maxDuration));
  
  // 把毫秒转成秒,赋值给CSS变量
  $('.loader-bar').css('--animation-duration', `${finalDuration / 1000}s`);
  
  // 确保CSS变量生效后,触发加载条到100%的动画
  requestAnimationFrame(() => {
    $('.loader-bar').width('100%');
  });
  
  // 动画完成后,隐藏预加载器
  setTimeout(() => {
    $('.preloader').addClass('hidden');
  }, finalDuration);
});

额外提示

  • 如果不用jQuery,换成原生JS也很简单:把$(window).load()改成window.addEventListener('load', function() {...}),选择元素用document.querySelector('.loader-bar')就行;
  • 要是你的加载动画不是进度条,而是旋转动画或者其他效果,原理一样——把CSS变量用到动画的animation-duration属性上就行;
  • 测试的时候可以用浏览器的网络限速功能(比如Chrome的DevTools里设成Slow 3G),看看加载慢的时候动画会不会被限制在最大时长里。

内容的提问来源于stack exchange,提问作者Toki

火山引擎 最新活动