前言

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

OpenHarmony 跨平台开发中,进度条组件是用户界面中不可或缺的一部分。无论是文件上传、页面加载还是多步骤表单,进度条都能为用户提供直观的反馈。本文将详细介绍 VCordova v1.7.0 中进度条组件的适配过程,包括线性进度条圆形进度条步骤条等核心功能的实现与使用。

在前面的版本中,我们已经完成了数据展示、图表、弹窗、日期选择、下拉菜单、文件上传和标签等组件的适配。本次 v1.7.0 版本重点聚焦于进度展示类组件,为开发者提供一套完整的进度解决方案。

本文基于 VCordova 三方库适配 OpenHarmony 的实践经验撰写,适合有一定前端基础的开发者阅读。

📊 一、UI 展示效果

在这里插入图片描述

上图展示了进度条组件在 OpenHarmony 设备上的实际运行效果,包括线性进度条、圆形进度条和步骤条三种类型。

1.1 组件概览

进度条组件是 VCordova 三方库中的重要组成部分。v1.7.0 版本提供了以下核心功能:

  1. 线性进度条(Line Progress)
  2. 圆形进度条(Circle Progress)
  3. 步骤条(Steps)
  4. 多种进度状态支持
  5. 动画效果
  6. 自定义颜色与样式

1.2 组件特性对比

特性 线性进度条 圆形进度条 步骤条
进度展示 ✅ 水平条形 ✅ 圆形环状 ✅ 分步展示
百分比显示 ✅ 支持 ✅ 支持 ❌ 不适用
动画效果 ✅ 支持 ✅ 支持 ❌ 不支持
自定义颜色 ✅ 支持 ✅ 支持 ✅ 支持
状态切换 ✅ 四种状态 ✅ 四种状态 ✅ 三种状态
适用场景 文件上传、加载 仪表盘、卡片 表单流程、向导

提示:根据实际业务场景选择合适的进度条类型,线性进度条适合宽屏展示,圆形进度条适合紧凑布局。


二、快速上手

2.1 引入文件

使用进度条组件前,需要先引入对应的 CSS 和 JS 文件:

<link rel="stylesheet" href="components/progress/progress.css">
<script src="components/progress/progress.js"></script>

CSS 文件包含进度条组件的所有样式定义,JS 文件包含 Progress 类和 Steps 类的完整实现。

2.2 创建容器

进度条组件需要一个 HTML 容器元素来挂载:

<div id="progressContainer"></div>

容器可以是任何 HTML 元素,只需要设置一个唯一的 id 属性即可。组件会自动在容器内渲染进度条。

2.3 初始化进度条

通过创建 Progress 实例来初始化进度条组件:

const progress = new Progress({
    container: '#progressContainer',
    type: 'line',
    percent: 65,
    status: 'normal'
});

初始化配置参数说明:

参数 类型 默认值 说明
container String 必填 容器选择器,支持 CSS 选择器语法
type String ‘line’ 进度条类型,可选 ‘line’ 或 ‘circle’
percent Number 0 初始进度百分比,范围 0-100
status String ‘normal’ 进度状态,可选 normal/success/warning/error
animated Boolean false 是否启用动画效果
color String null 自定义颜色,支持 CSS 颜色值
showText Boolean true 是否显示百分比文字

2.4 快速上手示例

下面是一个完整的快速上手示例,展示如何在页面中创建一个基本的进度条:

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="components/progress/progress.css">
</head>
<body>
    <div id="myProgress"></div>
    <button onclick="updateProgress()">更新进度</button>

    <script src="components/progress/progress.js"></script>
    <script>
        const progress = new Progress({
            container: '#myProgress',
            type: 'line',
            percent: 0,
            status: 'normal',
            animated: true
        });

        function updateProgress() {
            const current = progress.getPercent();
            if (current < 100) {
                progress.setPercent(current + 10);
            }
            if (current + 10 >= 100) {
                progress.setStatus('success');
            }
        }
    </script>
</body>
</html>

上述代码创建了一个带动画效果的线性进度条,点击按钮每次增加 10% 的进度,当进度达到 100% 时自动切换为成功状态。


三、线性进度条详解

线性进度条是最常用的进度展示方式,以水平条形展示当前进度。

3.1 创建线性进度条

const lineProgress = new Progress({
    container: '#lineProgress',
    type: 'line',
    percent: 65,
    status: 'normal'
});

线性进度条会渲染一个水平的进度条,右侧显示当前百分比数值。进度条的宽度会根据容器自适应。

3.2 更新进度值

通过 API 方法可以动态更新进度:

// 设置进度为 80%
lineProgress.setPercent(80);

// 获取当前进度值
const currentPercent = lineProgress.getPercent();
console.log('当前进度:' + currentPercent + '%');

// 重置进度
lineProgress.setPercent(0);

setPercent() 方法接受 0-100 之间的数值。调用后进度条会平滑过渡到新的值,提供流畅的视觉体验。

3.3 线性进度条适用场景

线性进度条适合以下场景:

  • 文件上传/下载进度展示
  • 页面或资源加载进度
  • 表单填写完成度
  • 任务执行进度跟踪

注意:线性进度条在宽度较小的容器中可能显示不完整,建议容器最小宽度不低于 200px。


四、圆形进度条详解

圆形进度条以环形方式展示进度,适合在空间有限的区域使用。

4.1 创建圆形进度条

const circleProgress = new Progress({
    container: '#circleProgress',
    type: 'circle',
    percent: 75,
    status: 'success'
});

圆形进度条会渲染一个圆形的进度环,百分比数值显示在圆心位置。

4.2 圆形进度条与线性进度条对比

对比项 线性进度条 圆形进度条
占用空间 宽度大,高度小 等宽等高,较紧凑
视觉效果 直观,适合精确展示 美观,适合概览展示
适用布局 列表、表单 卡片、仪表盘
百分比位置 进度条右侧 圆心位置
渲染方式 CSS width SVG 或 Canvas

4.3 圆形进度条适用场景

圆形进度条特别适合以下场景:

  1. 仪表盘数据展示
  2. 用户头像旁的完成度指示
  3. 卡片式布局中的进度展示
  4. 移动端紧凑型界面

五、进度状态管理

进度条支持四种状态,每种状态对应不同的颜色和含义。

5.1 四种状态示例

// 正常状态 - 蓝色
const normalProgress = new Progress({
    container: '#normal',
    type: 'line',
    percent: 50,
    status: 'normal'
});

// 成功状态 - 绿色
const successProgress = new Progress({
    container: '#success',
    type: 'line',
    percent: 100,
    status: 'success'
});

// 警告状态 - 橙色
const warningProgress = new Progress({
    container: '#warning',
    type: 'line',
    percent: 75,
    status: 'warning'
});

// 错误状态 - 红色
const errorProgress = new Progress({
    container: '#error',
    type: 'line',
    percent: 30,
    status: 'error'
});

5.2 状态详细说明

每种状态都有明确的语义和视觉表现:

  • normal — 正常进行中状态,使用蓝色(#409EFF),表示任务正在执行
  • success — 成功完成状态,使用绿色(#67C23A),表示任务已完成
  • warning — 警告状态,使用橙色(#E6A23C),表示需要注意
  • error — 错误状态,使用红色(#F56C6C),表示任务失败

5.3 动态切换状态

可以通过 API 动态切换进度条的状态:

// 切换到成功状态
progress.setStatus('success');

// 切换到错误状态
progress.setStatus('error');

// 获取当前状态
const currentStatus = progress.getStatus();

提示:状态切换时进度条颜色会平滑过渡,不会出现突兀的颜色跳变。


六、动画效果配置

进度条支持丰富的动画效果,提升用户体验。

6.1 启用动画

const animatedProgress = new Progress({
    container: '#animatedProgress',
    type: 'line',
    percent: 50,
    animated: true
});

设置 animated: true 启用动画效果后,进度条会呈现呼吸效果,即进度条内部会有一个从左到右的流光动画。

6.2 禁用动画

const staticProgress = new Progress({
    container: '#staticProgress',
    type: 'line',
    percent: 50,
    animated: false
});

设置 animated: false 禁用动画效果,进度条将保持静态显示。在性能敏感的场景下建议禁用动画。

6.3 动画效果的 CSS 实现

进度条的动画效果通过 CSS 实现,核心代码如下:

/* 进度条动画效果 */
.progress-bar-inner {
    transition: width 0.3s ease;
    position: relative;
    overflow: hidden;
}

.progress-bar-inner.animated::after {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: linear-gradient(
        90deg,
        transparent,
        rgba(255, 255, 255, 0.3),
        transparent
    );
    animation: progress-flow 2s infinite;
}

@keyframes progress-flow {
    0% { transform: translateX(-100%); }
    100% { transform: translateX(100%); }
}

这段 CSS 代码实现了进度条的平滑过渡和流光动画效果。transition 属性确保进度值变化时的平滑过渡,@keyframes 定义了流光动画。


七、自定义颜色与样式

进度条支持高度自定义,满足不同设计需求。

7.1 设置自定义颜色

// 使用十六进制颜色
const customProgress1 = new Progress({
    container: '#custom1',
    type: 'line',
    percent: 65,
    color: '#ff6b6b'
});

// 使用 RGB 颜色
const customProgress2 = new Progress({
    container: '#custom2',
    type: 'circle',
    percent: 80,
    color: 'rgb(106, 90, 205)'
});

color 属性支持任何合法的 CSS 颜色值,包括十六进制、RGB、RGBA、HSL 等格式。

7.2 隐藏百分比文字

在某些设计场景下,可能不需要显示百分比数值:

const noTextProgress = new Progress({
    container: '#noText',
    type: 'line',
    percent: 65,
    showText: false
});

设置 showText: false 即可隐藏百分比文字,进度条将只显示进度条本身。

7.3 自定义样式覆盖

除了使用组件提供的配置项,还可以通过 CSS 覆盖默认样式:

/* 自定义进度条高度 */
.progress-bar {
    height: 20px;
    border-radius: 10px;
}

/* 自定义进度条背景色 */
.progress-bar-outer {
    background-color: #f0f0f0;
}

/* 自定义百分比文字样式 */
.progress-text {
    font-size: 14px;
    font-weight: bold;
    color: #333;
}

通过 CSS 覆盖可以实现更精细的样式控制,满足各种设计规范的要求。


八、步骤条组件

步骤条用于展示多步骤流程,是进度条组件的重要补充。

8.1 创建步骤条

const steps = new Steps({
    container: '#stepsContainer',
    steps: [
        { title: '第一步', description: '填写基本信息' },
        { title: '第二步', description: '确认订单详情' },
        { title: '第三步', description: '支付完成' }
    ],
    current: 1
});

步骤条会渲染多个步骤节点,当前步骤会高亮显示,已完成的步骤会显示对勾图标。

8.2 步骤对象属性

每个步骤是一个配置对象,支持以下属性:

属性 类型 是否必填 说明
title String 步骤标题,显示在步骤节点下方
description String 步骤描述,显示在标题下方
icon String 自定义图标类名
status String 单独设置步骤状态

8.3 步骤条适用场景

步骤条适合以下业务场景:

  1. 注册/登录流程引导
  2. 订单提交多步骤表单
  3. 新手引导向导
  4. 审批流程展示

九、步骤导航与交互

步骤条提供了丰富的导航 API,支持灵活的步骤切换。

9.1 步骤导航 API

// 设置当前步骤(从 0 开始计数)
steps.setCurrent(1);

// 前进到下一步
steps.next();

// 返回上一步
steps.prev();

// 获取当前步骤索引
const currentIndex = steps.getCurrent();
console.log('当前步骤:' + currentIndex);

9.2 步骤导航完整示例

下面是一个结合按钮的步骤导航完整示例:

<div id="stepsDemo"></div>
<div class="step-buttons">
    <button id="prevBtn" onclick="goPrev()">上一步</button>
    <button id="nextBtn" onclick="goNext()">下一步</button>
</div>

<script>
    const stepsDemo = new Steps({
        container: '#stepsDemo',
        steps: [
            { title: '选择商品', description: '浏览并选择商品' },
            { title: '填写地址', description: '填写收货地址' },
            { title: '确认支付', description: '选择支付方式' },
            { title: '完成', description: '订单提交成功' }
        ],
        current: 0
    });

    function goNext() {
        if (stepsDemo.getCurrent() < 3) {
            stepsDemo.next();
        }
    }

    function goPrev() {
        if (stepsDemo.getCurrent() > 0) {
            stepsDemo.prev();
        }
    }
</script>

用户可以通过点击"上一步"和"下一步"按钮在步骤之间导航,也可以直接点击步骤节点进行跳转。

9.3 步骤点击事件

步骤条支持点击事件回调:

const steps = new Steps({
    container: '#stepsContainer',
    steps: [...],
    current: 0,
    onChange: function(currentIndex, prevIndex) {
        console.log('从步骤 ' + prevIndex + ' 切换到步骤 ' + currentIndex);
    }
});

onChange 回调函数会在步骤切换时触发,接收当前步骤索引和上一步骤索引两个参数。


十、步骤状态与方向

步骤条支持多种状态和布局方向。

10.1 步骤状态类型

const steps = new Steps({
    container: '#stepsContainer',
    steps: [
        { title: '步骤一', description: '已完成' },
        { title: '步骤二', description: '进行中' },
        { title: '步骤三', description: '待处理' }
    ],
    current: 1,
    status: 'process'
});

步骤条支持三种状态:

  • process — 处理中,当前步骤显示加载动画
  • finish — 已完成,当前步骤显示对勾图标
  • error — 错误,当前步骤显示叉号图标

10.2 水平步骤条

const horizontalSteps = new Steps({
    container: '#horizontalSteps',
    steps: [
        { title: '开始', description: '项目启动' },
        { title: '开发', description: '功能开发' },
        { title: '测试', description: '质量验证' },
        { title: '上线', description: '正式发布' }
    ],
    direction: 'horizontal',
    current: 2
});

水平步骤条适合在宽屏设备上使用,步骤节点从左到右排列。

10.3 垂直步骤条

const verticalSteps = new Steps({
    container: '#verticalSteps',
    steps: [
        { title: '提交申请', description: '填写申请表单' },
        { title: '部门审批', description: '等待部门经理审批' },
        { title: 'HR审批', description: '等待HR审批' },
        { title: '完成', description: '审批通过' }
    ],
    direction: 'vertical',
    current: 1
});

垂直步骤条适合在窄屏或移动设备上使用,步骤节点从上到下排列。在侧边栏或移动端页面中效果更佳。


十一、OpenHarmony 适配要点

在将进度条组件适配到 OpenHarmony 平台时,需要注意以下关键点。

11.1 适配注意事项

在 OpenHarmony 环境下使用进度条组件,需要关注以下几个方面:

  1. CSS 动画兼容性:确保 @keyframestransition 在 OpenHarmony WebView 中正常工作
  2. SVG 渲染:圆形进度条依赖 SVG 渲染,需确认 WebView 的 SVG 支持
  3. 触摸事件:步骤条的点击交互需要适配触摸事件
  4. 性能优化:在低端设备上建议禁用动画效果

11.2 适配代码示例

针对 OpenHarmony 平台的适配代码:

// OpenHarmony 环境检测
function isOpenHarmony() {
    return typeof window !== 'undefined' &&
           navigator.userAgent.indexOf('OpenHarmony') > -1;
}

// 根据平台调整配置
const progressConfig = {
    container: '#progress',
    type: 'line',
    percent: 50,
    animated: !isOpenHarmony() || isHighPerformanceDevice(),
    status: 'normal'
};

const progress = new Progress(progressConfig);

11.3 已适配组件清单

截至 v1.7.0 版本,VCordova 三方库已适配的组件如下:

版本 组件 状态
v1.0.0 基础数据展示 ✅ 已完成
v1.1.0 图表组件 ✅ 已完成
v1.2.0 弹窗组件 ✅ 已完成
v1.3.0 日期选择器 ✅ 已完成
v1.4.0 下拉菜单 ✅ 已完成
v1.5.0 文件上传 ✅ 已完成
v1.6.0 标签组件 ✅ 已完成
v1.7.0 进度条组件 ✅ 已完成
v1.8.0 加载动画 🔜 开发中
v1.9.0 分页组件 📋 计划中

十二、完整 API 参考

12.1 Progress 类 API

以下是 Progress 类的完整 API 列表:

方法 参数 返回值 说明
setPercent(value) Number (0-100) void 设置进度百分比
getPercent() Number 获取当前进度百分比
setStatus(status) String void 设置进度状态
getStatus() String 获取当前状态
setColor(color) String void 设置自定义颜色
destroy() void 销毁组件实例

12.2 Steps 类 API

以下是 Steps 类的完整 API 列表:

方法 参数 返回值 说明
setCurrent(index) Number void 设置当前步骤
getCurrent() Number 获取当前步骤索引
next() void 前进到下一步
prev() void 返回上一步
setStatus(status) String void 设置步骤状态
destroy() void 销毁组件实例

12.3 配置项速查

Progress 组件完整配置项:

const progress = new Progress({
    // 必填项
    container: '#container',     // 容器选择器

    // 可选项
    type: 'line',               // 类型:'line' | 'circle'
    percent: 0,                 // 初始进度:0-100
    status: 'normal',           // 状态:'normal' | 'success' | 'warning' | 'error'
    animated: false,            // 是否启用动画
    color: null,                // 自定义颜色
    showText: true              // 是否显示百分比文字
});

Steps 组件完整配置项:

const steps = new Steps({
    // 必填项
    container: '#container',     // 容器选择器
    steps: [],                  // 步骤数组

    // 可选项
    current: 0,                 // 当前步骤索引
    direction: 'horizontal',    // 方向:'horizontal' | 'vertical'
    status: 'process',          // 状态:'process' | 'finish' | 'error'
    onChange: null               // 步骤切换回调函数
});

十三、常见问题与解决方案

13.1 进度条不显示

如果进度条没有正常显示,请检查以下几点:

  1. 确认 CSS 文件已正确引入
  2. 确认容器元素存在且 ID 正确
  3. 确认 JS 文件加载顺序正确(CSS 在 JS 之前)
  4. 检查浏览器控制台是否有报错信息

13.2 动画卡顿

在低端设备上动画可能出现卡顿,解决方案:

  • 禁用动画效果:设置 animated: false
  • 减少页面中同时存在的进度条数量
  • 使用 will-change CSS 属性优化渲染性能
.progress-bar-inner {
    will-change: width;
    transform: translateZ(0);
}

13.3 圆形进度条尺寸异常

圆形进度条的尺寸取决于容器的宽高,确保容器设置了明确的宽高:

#circleContainer {
    width: 120px;
    height: 120px;
}

提示:圆形进度条的容器建议设置为等宽等高的正方形,以获得最佳显示效果。


十四、最佳实践建议

14.1 性能优化建议

在实际项目中使用进度条组件时,建议遵循以下最佳实践:

  • 避免在同一页面创建过多的进度条实例(建议不超过 10 个)
  • 不再使用的进度条实例及时调用 destroy() 方法销毁
  • 在列表或表格中使用进度条时,考虑使用虚拟滚动
  • 频繁更新进度时,使用 requestAnimationFrame 节流

14.2 无障碍访问

进度条组件内置了基本的无障碍支持:

<!-- 组件自动生成的无障碍属性 -->
<div role="progressbar"
     aria-valuenow="65"
     aria-valuemin="0"
     aria-valuemax="100"
     aria-label="进度:65%">
</div>

组件会自动添加 role="progressbar" 和相关的 ARIA 属性,确保屏幕阅读器能够正确识别和朗读进度信息。

14.3 与其他组件配合使用

进度条组件可以与 VCordova 的其他组件配合使用:

  • 文件上传组件配合,展示上传进度
  • 弹窗组件配合,在弹窗中展示加载进度
  • 表格组件配合,在表格列中展示数据占比

总结

VCordova v1.7.0 进度条组件完成了进度展示和步骤流程的全部功能适配。结合前面版本已适配的组件,现在我们拥有了涵盖数据展示、交互、输入、选择、上传、标签和进度的完整解决方案。

进度条组件的设计遵循简洁、高效、易用的理念,提供了线性进度条和圆形进度条两种类型,支持四种状态、动画效果、自定义颜色等丰富功能。同时提供步骤条组件,满足多步骤流程的展示需求。

后续版本将继续添加更多组件。下一个版本 v1.8.0 将带来加载动画组件,之后还有分页、轮播等组件。每个组件都将遵循同样的设计理念,为 OpenHarmony 跨平台开发提供开箱即用的 UI 解决方案。

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐