Hi,大家好!
新的一周又开始了,好消息是再坚持两周就要过春节了,坏消息是神兽要放寒假了!
在现代 Web 开发中,页面顶部的细线进度条已经成为一种标准的用户体验设计模式。这种进度条最早由 Pace.js 库推广开来,后来被 YouTube、Medium、GitHub 等众多网站采用。
它的设计理念很简单:用最小的视觉干扰,告诉用户"系统正在工作"。
相比传统的居中弹窗进度条,顶部细线进度条有几个明显优势:
-
不遮挡页面内容
-
视觉上更轻量
-
动画流畅,体验更好
-
接近 100% 时会"卡顿",符合用户对加载过程的心理预期
本文将详细讲解如何在 Access 中复刻这一效果。
01技术原理分析
Pace.js 的核心特征
通过分析 Pace.js 的行为,我们可以总结出以下特征:
| 特征 | 说明 |
|---|---|
| 位置 | 窗口最顶部,宽度占满 |
| 高度 | 2-4 像素的细线 |
| 颜色 | 默认蓝色 #2299dd |
| 动画曲线 | 开始快、结束慢(ease-out) |
| 完成效果 | 填满后短暂停留,然后淡出或向右滑出 |
0 2Access 中的实现思路
Access 没有原生的进度条动画支持,但我们可以通过以下方式模拟:
-
矩形控件 :作为进度条本体,通过修改
Width属性实现增长 -
Sleep API:控制动画帧间隔,实现平滑过渡
-
缓动算法:通过比例计算步长,模拟 ease-out 效果
-
DoEvents:保持界面响应,避免假死
实现步骤
创建窗体控件
在窗体设计视图中,添加一个矩形控件,设置以下属性:
名称:rectProgressBar Top:0 Left:0 Height:45(单位 twip,约等于 3 像素) Width:0 背景色:16744489(即 RGB(41,128,255)) 边框样式:0(透明) 特殊效果:0(平面)

0 3核心代码实现
以下是完整的 VBA 模块代码:
vbscript
' filepath: 窗体模块(例如 frmMain)
Option Compare Database
Option Explicit
' ============================================
' Pace.js 风格顶部进度条 - Access VBA 实现
' ============================================
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If
' 进度条配置
Private Const PACE_COLOR As Long = 16744489 ' RGB(41, 128, 255) 蓝色
Private Const PACE_HEIGHT As Long = 45 ' 约 3px
Private Const PACE_SPEED_FAST As Long = 15 ' 快速动画间隔(ms)
Private Const PACE_SPEED_SLOW As Long = 80 ' 慢速动画间隔(ms)
Private mTargetWidth As Long ' 目标宽度
Private mCurrentProgress As Double ' 当前进度 0-100
Private mIsRunning As Boolean ' 是否运行中
' ============================================
' 窗体事件
' ============================================
Private Sub Form_Load()
InitProgressBar
End Sub
' ============================================
' 初始化进度条
' ============================================
Private Sub InitProgressBar()
With Me.rectProgressBar
.Top = 0
.Left = 0
.Height = PACE_HEIGHT
.Width = 0
.BackColor = PACE_COLOR
.BorderStyle = 0 ' 透明边框
.SpecialEffect = 0 ' 平面效果
.Visible = True
End With
mTargetWidth = Me.InsideWidth
mCurrentProgress = 0
mIsRunning = False
End Sub
' ============================================
' 启动进度条(模拟 Pace.start())
' ============================================
Public Sub PaceStart()
If mIsRunning Then Exit Sub
mIsRunning = True
mCurrentProgress = 0
Me.rectProgressBar.Width = 0
Me.rectProgressBar.Visible = True
End Sub
' ============================================
' 更新进度(0-100)
' ============================================
Public Sub PaceSet(ByVal pct As Double)
If pct < 0 Then pct = 0
If pct > 100 Then pct = 100
mCurrentProgress = pct
AnimateToProgress pct
End Sub
' ============================================
' 完成进度条(模拟 Pace.stop())
' ============================================
Public Sub PaceFinish()
AnimateToProgress 100
Sleep 150
FadeOut
mIsRunning = False
End Sub
' ============================================
' 重置进度条
' ============================================
Public Sub PaceReset()
Me.rectProgressBar.Width = 0
Me.rectProgressBar.Visible = False
mCurrentProgress = 0
mIsRunning = False
End Sub
' ============================================
' 动画过渡到指定进度
' ============================================
Private Sub AnimateToProgress(ByVal targetPct As Double)
Dim targetW As Long
Dim stepW As Long
Dim currentW As Long
targetW = CLng((targetPct / 100) * mTargetWidth)
currentW = Me.rectProgressBar.Width
' Pace.js 特色:开始快,接近100%时变慢
Do While currentW < targetW
If targetPct >= 90 Then
stepW = CLng((targetW - currentW) * 0.1) ' 慢速
If stepW < 5 Then stepW = 5
Sleep PACE_SPEED_SLOW
Else
stepW = CLng((targetW - currentW) * 0.3) ' 快速
If stepW < 10 Then stepW = 10
Sleep PACE_SPEED_FAST
End If
currentW = currentW + stepW
If currentW > targetW Then currentW = targetW
Me.rectProgressBar.Width = currentW
DoEvents
Loop
End Sub
' ============================================
' 淡出效果(宽度收缩到右侧消失)
' ============================================
Private Sub FadeOut()
Dim i As Integer
For i = 1 To 5
Me.rectProgressBar.Left = Me.rectProgressBar.Left + (mTargetWidth \ 10)
Sleep 30
DoEvents
Next i
Me.rectProgressBar.Visible = False
Me.rectProgressBar.Left = 0
Me.rectProgressBar.Width = 0
End Sub
' ============================================
' 示例:模拟加载任务(按钮调用)
' ============================================
Public Sub DemoLoading()
PaceStart
' 模拟分段加载
PaceSet 15: Sleep 200
PaceSet 35: Sleep 300
PaceSet 50: Sleep 250
PaceSet 70: Sleep 400
PaceSet 85: Sleep 500
PaceSet 95: Sleep 600 ' 接近100%时会变慢(Pace.js特色)
PaceFinish
End Sub
按钮单击事件:
vbscript
Private Sub Command1_Click()
DemoLoading
End Sub
0 4缓动算法详解
Pace.js 的视觉特征之一是"开始快、结束慢"的动画曲线。这在动画领域称为 ease-out。
本文采用的实现方式是比例步长算法:
步长 = (目标值 - 当前值) × 系数
以系数 0.3 为例,假设目标宽度为 1000:
| 当前宽度 | 剩余距离 | 步长 | 下一宽度 |
|---|---|---|---|
| 0 | 1000 | 300 | 300 |
| 300 | 700 | 210 | 510 |
| 510 | 490 | 147 | 657 |
| 657 | 343 | 103 | 760 |
| ... | ... | ... | ... |
可以看到,随着接近目标,步长自然减小,产生减速效果。
为了模拟 Pace.js 在 90% 以上时的"卡顿"感,代码中将系数从 0.3 降低到 0.1,同时增加帧间隔。
0 5自定义配置
通过修改顶部常量,可以调整进度条的外观和行为:
' 颜色(可选值)Private Const PACE_COLOR As Long = 16744489 ' 蓝色(默认)Private Const PACE_COLOR As Long = 65280 ' 绿色Private Const PACE_COLOR As Long = 255 ' 红色' 高度Private Const PACE_HEIGHT As Long = 45 ' 3px(默认)Private Const PACE_HEIGHT As Long = 75 ' 5px' 动画速度Private Const FRAME_DELAY_FAST As Long = 15 ' 越小越快Private Const EASE_FACTOR_FAST As Double = 0.3 ' 越大越快
0 6运行效果
我们来看一下效果:

0 7总结
本文介绍了如何在 Access 中实现 Pace.js 风格的顶部进度条。核心技术点包括:
-
使用矩形控件作为进度条本体
-
通过 Sleep API 控制动画帧率
-
采用比例步长算法实现缓动效果
-
通过修改 Left 属性实现滑出动画
完整代码约 120 行,可以直接复制到任意 Access 窗体中使用。
测试环境:Access 2016/2019/365,Windows 10/11
Access 开发」 专注于 Microsoft Access 开发与企业级应用,提供以下服务:
📚 技术培训
-
Access VBA 从入门到精通(线上/线下)
-
Access + SQL Server 企业级开发实战
-
Access 系统性能优化与架构设计
💼 定制开发
-
企业 ERP/CRM/进销存等系统开发
-
旧系统升级与性能优化
🔧 技术支持
-
代码审查与重构建议
-
疑难问题远程诊断
-
一对一技术辅导
技术改变业务,专注创造价值。
好文!必须点赞