javascript怎样实现进度条_它有哪些动画效果?

发布时间 - 2026-01-12 00:00:00    点击率:
JavaScript实现进度条核心是动态更新width或transform: scaleX(),用requestAnimationFrame配合缓动函数实现60fps平滑动画,需校验计算安全、同步ARIA属性并兼顾无障碍与移动端适配。

JavaScript 实现进度条的核心是控制 widthtransform: scaleX()

原生 JS 实现进度条不需要框架,关键在于动态更新 DOM 元素的宽度或缩放比例。最常用的是修改一个子容器(如 )的 style.width,配合父容器的 overflow: hidden 实现视觉填充效果。
transform: scaleX() 更适合动画性能——它触发的是合成层,不触发重排(layout),尤其在频繁更新时更流畅。

requestAnimationFrame 做平滑动画,别用 setTimeoutsetInterval

进度变化如果靠定时器硬推,容易卡顿、跳帧,尤其在页面负载高时。正确做法是用 requestAnimationFrame 驱动每一帧更新,配合缓动函数(easing)模拟真实感。

function animateProgress(el, targetWidth, current = 0, startTime = null) {
  const easeOutCubic = t => --t * t * t + 1;
  const duration = 300; // ms

function step(timestamp) { if (!startTime) startTime = timestamp; const progress = Math.min((timestamp - startTime) / duration, 1); const eased = easeOutCubic(progress); const width = current + (targetWidth - current) * eased;

el.style.width = width + '%';

if (progress < 1) requestAnimationFrame(step);

} requestAnimationFrame(step); }

// 调用:animateProgress(document.querySelector('.bar'), 75);

  • requestAnimationFrame 与屏幕刷新率同步,通常 60fps,比 setTimeout(..., 16) 更可靠
  • 缓动函数决定“加速/减速”节奏;easeOutCubic 是常见收尾减速效果
  • 直接操作 style.width 时注意单位('%''px'),漏写会失效

CSS 动画仅适用于固定起止值,JS 控制更适合动态场景

CSS @keyframes 可以实现脉冲、流动、渐变色等效果,但前提是进度值已知且不常变。比如加载中状态用「骨架动画」:background: linear-gradient(90deg, transparent, #e0e0e0, transparent) 配合 animation 横向移动,这和 JS 更新的「确定性进度条」用途不同,二者常共存。

立即学习“Java免费学习笔记(深入)”;

  • 纯 CSS 方案适合「加载中」占位符,不适合显示 0→83% 这类实时反馈
  • 若用 CSS transition 控制 width,需确保初始状态有 transition: width 0.3s ease-out,否则无动画
  • IE11 不支持 transform: scaleX() 的 transition,老项目慎用

常见坑:百分比计算错误、未处理小数、忽略无障碍

进度值常来自异步请求的 loaded / total,直接相除可能得 NaNInfinity;显示时若保留过多小数(如 99.999999%),CSS 渲染会抖动;另外,缺少 aria-valuenow 等属性会让读屏软件无法识别进度。

  • 务必校验分母是否为 0:const percent = total ? Math.round((loaded / total) * 100) : 0
  • Math.min(Math.max(percent, 0), 100) 防止超限(如网络波动导致 loaded > total)
  • 同步更新 ARIA 属性:el.setAttribute('aria-valuenow', percent)
  • 移动端要注意 touch-action: none 防止拖拽进度条时触发页面滚动

实际项目里,进度条的「动起来」只是表象,真正难的是和业务逻辑对齐:上传中断后如何恢复?多阶段任务怎么嵌套?这些不在动画本身,而在状态管理的设计里。


# css  # javascript  # java  # js  # seo  # 移动端适配  # overflow 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 公司网站制作需要多少钱,找人做公司网站需要多少钱?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  北京网站制作的公司有哪些,北京白云观官方网站?  PHP 500报错的快速解决方法  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  深入理解Android中的xmlns:tools属性  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  个人网站制作流程图片大全,个人网站如何注销?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  移动端脚本框架Hammer.js  Linux系统命令中tree命令详解  网易LOFTER官网链接 老福特网页版登录地址  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  如何快速搭建高效WAP手机网站?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Laravel如何生成API文档?(Swagger/OpenAPI教程)  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  如何在云虚拟主机上快速搭建个人网站?  如何用景安虚拟主机手机版绑定域名建站?  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  python中快速进行多个字符替换的方法小结  网站制作企业,网站的banner和导航栏是指什么?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  创业网站制作流程,创业网站可靠吗?  Python数据仓库与ETL构建实战_Airflow调度流程详解  Laravel如何实现用户密码重置功能?(完整流程代码)  免费视频制作网站,更新又快又好的免费电影网站?  Laravel如何实现文件上传和存储?(本地与S3配置)  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  高端建站如何打造兼具美学与转化的品牌官网?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  如何在万网自助建站平台快速创建网站?  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  高性能网站服务器配置指南:安全稳定与高效建站核心方案  教你用AI将一段旋律扩展成一首完整的曲子  大型企业网站制作流程,做网站需要注册公司吗?  魔毅自助建站系统:模板定制与SEO优化一键生成指南