Access 中实现 Web 风格的顶部加载进度条

Hi,大家好!

新的一周又开始了,好消息是再坚持两周就要过春节了,坏消息是神兽要放寒假了!

在现代 Web 开发中,页面顶部的细线进度条已经成为一种标准的用户体验设计模式。这种进度条最早由 Pace.js 库推广开来,后来被 YouTube、Medium、GitHub 等众多网站采用。

它的设计理念很简单:用最小的视觉干扰,告诉用户"系统正在工作"

相比传统的居中弹窗进度条,顶部细线进度条有几个明显优势:

  • 不遮挡页面内容

  • 视觉上更轻量

  • 动画流畅,体验更好

  • 接近 100% 时会"卡顿",符合用户对加载过程的心理预期

本文将详细讲解如何在 Access 中复刻这一效果。


01技术原理分析

Pace.js 的核心特征

通过分析 Pace.js 的行为,我们可以总结出以下特征:

特征 说明
位置 窗口最顶部,宽度占满
高度 2-4 像素的细线
颜色 默认蓝色 #2299dd
动画曲线 开始快、结束慢(ease-out)
完成效果 填满后短暂停留,然后淡出或向右滑出

0 2Access 中的实现思路

Access 没有原生的进度条动画支持,但我们可以通过以下方式模拟:

  1. 矩形控件 :作为进度条本体,通过修改 Width 属性实现增长

  2. Sleep API:控制动画帧间隔,实现平滑过渡

  3. 缓动算法:通过比例计算步长,模拟 ease-out 效果

  4. 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 风格的顶部进度条。核心技术点包括:

  1. 使用矩形控件作为进度条本体

  2. 通过 Sleep API 控制动画帧率

  3. 采用比例步长算法实现缓动效果

  4. 通过修改 Left 属性实现滑出动画

完整代码约 120 行,可以直接复制到任意 Access 窗体中使用。


测试环境:Access 2016/2019/365,Windows 10/11

Access 开发」 专注于 Microsoft Access 开发与企业级应用,提供以下服务:

📚 技术培训

  • Access VBA 从入门到精通(线上/线下)

  • Access + SQL Server 企业级开发实战

  • Access 系统性能优化与架构设计

💼 定制开发

  • 企业 ERP/CRM/进销存等系统开发

  • 旧系统升级与性能优化

🔧 技术支持

  • 代码审查与重构建议

  • 疑难问题远程诊断

  • 一对一技术辅导

技术改变业务,专注创造价值。

好文!必须点赞

相关推荐
一起养小猫2 小时前
Flutter for OpenHarmony 实战:打造功能完整的记账助手应用
android·前端·flutter·游戏·harmonyos
野犬寒鸦2 小时前
从零起步学习并发编程 || 第二章:多线程与死锁在项目中的应用示例
java·开发语言·数据库·后端·学习
定偶2 小时前
事务、触发器、存储过程与视图全解析
数据库·oracle
hbstream海之滨视频网络技术2 小时前
Google正式上线Gemini In Chrome,国内环境怎样开启。
前端·chrome
Lisson 32 小时前
VF01修改实际开票数量增强
java·服务器·前端·abap
范纹杉想快点毕业2 小时前
STM32单片机与ZYNQ PS端 中断+状态机+FIFO 综合应用实战文档(初学者版)
linux·数据结构·数据库·算法·mongodb
拓云者也2 小时前
常用的生物信息学数据库以及处理工具
数据库·python·oracle·r语言·bash
Henry Zhu1232 小时前
数据库(二):数据模型
数据库
曹牧2 小时前
Java:将字符串转换为整数
java·数据库