当前位置: 首页 > news >正文

微信小程序:实现节点进度条的效果;正在完成的节点有动态循环效果;横向,纵向排列

参考说明

微信小程序实现流程进度功能 - 知乎

上面的为一个节点进度条的例子,但并不完整,根据上述代码,进行修改完善,实现其效果

横向效果

代码

wxml

<view class='order_process'><view class='process_wrap' wx:for="{{processData}}" wx:key="index"><view class='process'><view class='process_line' style="background:{{item.start}}"></view><image class="process_icon {{item.icon === icon2 ? 'rotate-icon' : ''}}" src="{{item.icon}}"></image><view class='process_line' style="background:{{item.end}}"></view></view><text class='process_name'>{{item.name}}</text></view>
</view>

wxss

.order_process {display: flex;flex-wrap: nowrap;padding: 10rpx 10rpx 20rpx 10rpx;background-color: #fff;
}
.process_wrap {display: flex;flex-direction: column;flex: 1;align-items: center;
}
.process {display: flex;align-items: center;width: 100%;
}
.process_icon {width: 35rpx;height: 35rpx;
}
.process_line {background: #eff3f6;flex: 1;height: 5rpx;
}
.process_name {font-size: 24rpx;
}
/* 定义旋转动画 */
@keyframes rotate360 {from {transform: rotate(0deg);}to {transform: rotate(360deg);}
}
/* 应用到 .rotate-icon 类 */
.rotate-icon {animation: rotate360 5s linear infinite; /* 5秒完成一次旋转,线性时间函数,无限循环 */
}

js

Page({data: {icon1: '../img/process_1.png',icon2: '../img/process_2.png',icon3: '../img/process_3.png',processData: [],//节点信息},onLoad: function () {// 初始化数据 processDataconst data = [{name: '节点1',start: '#fff',end: '#f9d9dd',icon: this.data.icon1,state: 0},{name: '节点2',start: '#f9d9dd',end: '#f9d9dd',icon: this.data.icon1,state: 0},{name: '节点3',start: '#f9d9dd',end: '#f9d9dd',icon: this.data.icon1,state: 1},{name: '节点4',start: '#f9d9dd',end: '#f9d9dd',icon: this.data.icon1,state: 0},{name: '节点5',start: '#f9d9dd',end: '#fff',icon: this.data.icon1,state: 0}]this.setData({processData: data})// 处理节点信息this.setProcessIcon();},setProcessIcon: function () {const processArr = this.data.processData;let index = -1; // 记录状态为1的最后的位置// 首先找到状态为1的节点位置processArr.forEach((item, i) => {if (item.state === 1) {index = i;return false; // 找到后停止循环}});// 然后根据找到的位置设置图标和其他属性processArr.forEach((item, i) => {if (i === index) { // 当前正在处理的节点item.icon = this.data.icon2;item.start = "#f0a0a9";item.end = "#f9d9dd";} else if (i < index && index !== -1) { // 已完成的节点item.icon = this.data.icon3;item.start = "#f0a0a9";item.end = "#f0a0a9";} else { // 未完成的节点item.icon = this.data.icon1;item.start = "#f9d9dd";item.end = "#f9d9dd";}});// 特殊处理第一个和最后一个节点if (processArr.length > 0) {processArr[0].start = "#fff";processArr[processArr.length - 1].end = "#fff";}this.setData({processData: processArr});}
});

纵向效果

代码

wxml

<view class='order_process1'><view class='process_item1' wx:for="{{processData}}" wx:key="index"><view class='process_vertical1'><view class='process_line_vertical1' style="background:{{item.start}};"></view><image class="process_icon1 {{item.icon === icon2 ? 'rotate-icon1' : ''}}" src="{{item.icon}}"></image><view class='process_line_vertical1' style="background:{{item.end}};"></view></view><text class='process_name1'>{{item.name}}</text></view>
</view>

wxss

.order_process1 {display: flex;flex-direction: column; /* 改为垂直排列 */padding: 10rpx;background-color: #fff;
}.process_item1 {display: flex;flex-direction: row; /* 每个步骤项水平排列 */align-items: center; /* 垂直居中对齐 */
}.process_vertical1 {display: flex;flex-direction: column; /* 步骤线垂直排列 */align-items: center; /* 图标居中 */
}.process_icon1 {width: 35rpx;height: 35rpx;
}.process_line_vertical1 {background: #eff3f6;width: 5rpx; /* 宽度变为5rpx */height: 40rpx; /* 高度根据需要设置 */
}.process_name1 {font-size: 24rpx;margin-left: 20rpx; /* 文字与图标之间的间距 */
}/* 定义旋转动画 */
@keyframes rotate360 {from {transform: rotate(0deg);}to {transform: rotate(360deg);}
}/* 应用到 .rotate-icon1 类 */
.rotate-icon1 {animation: rotate360 5s linear infinite; /* 5秒完成一次旋转,线性时间函数,无限循环 */
}

js

参见横向js代码

图片展示 

process_1.png

process_2.png

process_3.png

扩展

已完成的状态均设置为1

Page({data: {icon1: '../img/process_1.png',icon2: '../img/process_2.png',icon3: '../img/process_3.png',processData: [], // 节点信息},onLoad: function () {// 初始化数据 processData, 将当前节点及之前的所有节点状态设置为1const data = [{name: '节点1',start: '#fff',end: '#f9d9dd',icon: this.data.icon1,state: 1 // 已完成},{name: '节点2',start: '#f9d9dd',end: '#f9d9dd',icon: this.data.icon1,state: 1 // 已完成},{name: '节点3',start: '#f9d9dd',end: '#f9d9dd',icon: this.data.icon1,state: 1 // 当前处理中},{name: '节点4',start: '#f9d9dd',end: '#f9d9dd',icon: this.data.icon1,state: 0 // 未开始},{name: '节点5',start: '#f9d9dd',end: '#fff',icon: this.data.icon1,state: 0 // 未开始}];this.setData({processData: data});// 处理节点信息this.setProcessIcon();},setProcessIcon: function () {const processArr = this.data.processData;let index = -1; // 记录状态为1的最后的位置// 首先找到状态为1的最后节点位置processArr.forEach((item, i) => {if (item.state === 1) {index = i;}});// 然后根据找到的位置设置图标和其他属性processArr.forEach((item, i) => {if (i <= index) { // 当前正在处理的节点和已完成的节点item.icon = i === index ? this.data.icon2 : this.data.icon3;item.start = i === 0 ? "#fff" : "#f0a0a9";item.end = i === index ? "#f9d9dd" : "#f0a0a9";} else { // 未完成的节点item.icon = this.data.icon1;item.start = "#f9d9dd";item.end = "#f9d9dd";}});// 特殊处理最后一个节点if (processArr.length > 0) {processArr[processArr.length - 1].end = "#fff";}this.setData({processData: processArr});}
});

数据部分优化

其实可以只保留name和state

const data = [{name: '节点1',start: '',end: '',icon: '',state: 1 },{name: '节点2',start: '',end: '',icon: '',state: 1 },{name: '节点3',start: '',end: '',icon: '',state: 1 },{name: '节点4',start: '',end: '',icon: '',state: 0 },{name: '节点5',start: '',end: '',icon: '',state: 0 }
];

新的逻辑效果:调整正在直接节点的位置(附加完整解析)

将正在执行的节点,设置为最后一个已完成节点的下一个节点

Page({data: {icon1: '../img/process_1.png',//未完成图标icon2: '../img/process_2.png',//正在进行的图标icon3: '../img/process_3.png',//已完成图标processData: [], // 节点信息},onLoad: function () {// 初始化数据 ,name:显示的节点名称;start:表示开始线段的颜色;end:表示结束线段的颜色;icon:表示节点的图标显示// state:表示当前节点的状态(已完成表示1,未完成表示0)// 这里的start和end表示节点的前后两条线段,每个节点都含有start前线段和end尾线段const data = [{name: '节点1',start: '',end: '',icon: '',state: 1},{name: '节点2',start: '',end: '',icon: '',state: 1},{name: '节点3',start: '',end: '',icon:'',state: 0},{name: '节点4',start: '',end: '',icon:'',state: 0},{name: '节点5',start: '',end: '',icon:'',state: 0}];this.setData({processData: data});// 处理节点信息this.setProcessIcon();},//将节点信息进行效果展示setProcessIcon: function () {const processArr = this.data.processData;//获取节点的完整信息let lastIndex = -1; // 记录状态为1的最后的位置// 找到状态为1的最后节点位置processArr.forEach((item, i) => {// 循环全部节点信息,如果state为1,就设置lastIndex的值为当前索引,// 这里一直会被赋值知道最后一个sate为1出现,lastIndex的值就为最后一个satae的索引,// 例如这里第一条,和第二条state为1,第一次对第一条进行赋值,lastIndex = 0;第二次对第二条进行赋值,lastIndex = 1,所以lastIndex = 1if (item.state === 1) {lastIndex = i;}});// 判断是否所有节点都已完成或未开始:allCompleted和allNotStarted的数值是bool类型,如果后面判断成立为true,反之为false// 判断是否全部完成:判断最后一个节点的索引是否是节点信息长度-1。(判断最后一个为状态为1的节点是否是最后一个节点)// 例如有三条数据,我的索引是0,1,2;如果我索引是2,那要对齐需要长度3-1才行const allCompleted = lastIndex === processArr.length - 1;// 判断是否全部未完成:如果lastIndex在<找到状态为1的最后节点位置>中为进行赋值,也就是为初始数据-1的时候,表明数据中没有state为1的数据,那就是全都未开始const allNotStarted = lastIndex === -1;// 根据条件设置图标和其他属性,循环全部节点信息对每一项进行设置processArr.forEach((item, i) => {// 如果所有节点都未开始if (allNotStarted) { // 如果当前索引等于0(也就是第一个节点(索引为0)):就设置图标为正在执行状态icon2。// 反之(其余节点)设置图标为未完成图标icon1item.icon = i === 0 ? this.data.icon2 : this.data.icon1;// 如果当前索引等于0(也就是第一个节点(索引为0)):就设置节点的开始线段为白色(和背景色一致表示隐藏)。// 反之(其余节点)设置开始线段的颜色为未完成的浅粉色// 简而言之,设置第一个节点的开始线段隐藏,其余节点的开始线段为浅粉色item.start = i === 0 ? "#fff" : "#f9d9dd";// 如果当前索引等于全部节点长度-1(也就是最后节点):就设置节点的结束线段为白色(和背景色一致表示隐藏)。// 反之(其余节点)设置结束线段的颜色为未完成的浅粉色// 简而言之,设置最后节点的结束线段隐藏,其余节点的结束线段为浅粉色item.end = i === processArr.length - 1 ? "#fff" : "#f9d9dd";}// 如果所有节点都已完成else if (allCompleted) { //设置全部节点的图标为已完成图标icon3item.icon = this.data.icon3;//如果是第一个节点,那么它的开始线段隐藏(白色);如果是其余节点,开始线段设置为深粉色item.start = i === 0 ? "#fff" : "#f0a0a9";//如果是最后一个节点,那么它的结束线段隐藏(白色);如果是其余节点,结束线段设置为深粉色item.end = i === processArr.length - 1 ? "#fff" : "#f0a0a9";}// 中间节点-正常情况else { // 已完成的节点// 如果当前索引小于等于最后一个state为1的节点,表示已完成(这里的例子lastIndex=1,也就是这里前两条0,1满足)if (i <= lastIndex) { //设置已完成的节点图标为icon3item.icon = this.data.icon3;//设置第一个节点的开始线段隐藏(白色),反之已完成的节点的开始线段为深粉色item.start = i === 0 ? "#fff" : "#f0a0a9";//设置最后一个节点的结束线段隐藏(白色),反之已完成的节点的结束线段为深粉色item.end = i === lastIndex ? "#f0a0a9" : "#f0a0a9";} // 下一个即将开始的节点// 这里设置正在执行的节点(节点未完成,但正在执行,介于未完成和已完成之间)// 该节点位于state=1的数据的下一条数据,也就是最后一个于state=1的索引+1else if (i === lastIndex + 1) {//设置这个正在进行的节点的图标为icon2item.icon = this.data.icon2;//设置这个节点的开始线段为深粉色(已完成线段颜色)item.start = "#f0a0a9";//设置这个节点的结束线段为浅粉色(未完成线段颜色)item.end = "#f9d9dd";} // 未完成的节点else { //设置节点图标为iconitem.icon = this.data.icon1;//设置全部未完成节点的开始线段为浅粉色item.start = "#f9d9dd";//如果是最后一个节点,就隐藏它的结束线段(白色),如果不是最后一个节点,就设置结束线段颜色为浅粉色item.end = i === processArr.length - 1 ? "#fff" : "#f9d9dd";}}});//替换新的节点数据this.setData({processData: processArr});}
});

相关文章:

微信小程序:实现节点进度条的效果;正在完成的节点有动态循环效果;横向,纵向排列

参考说明 微信小程序实现流程进度功能 - 知乎 上面的为一个节点进度条的例子&#xff0c;但并不完整&#xff0c;根据上述代码&#xff0c;进行修改完善&#xff0c;实现其效果 横向效果 代码 wxml <view classorder_process><view classprocess_wrap wx:for&quo…...

【Unity3D】无限循环列表(扩展版)

基础版&#xff1a;【Unity技术分享】UGUI之ScrollRect优化_ugui scrollrect 优化-CSDN博客 using UnityEngine; using UnityEngine.UI; using System.Collections.Generic;public delegate void OnBaseLoopListItemCallback(GameObject cell, int index); public class BaseLo…...

MacOS 命令行详解使用教程

本章讲述MacOs命令行详解的使用教程&#xff0c;感谢大家观看。 本人博客:如烟花般绚烂却又稍纵即逝的主页 MacOs命令行前言&#xff1a; 在 macOS 上,Terminal&#xff08;终端) 是一个功能强大的工具&#xff0c;它允许用户通过命令行直接与系统交互。本教程将详细介绍 macOS…...

redis集群安装部署 redis三主三从集群

redis集群安装部署 redis三主三从集群 1、下载redis2、安装redis集群 三主三从3、配置redis开机自启动3.1、建立启动脚本3.2、复制多份redis启动脚本给集群使用3.3、添加可执行权限3.4、配置开机自启动 1、下载redis 本次redis安装部署选择当前最新的稳定版本7.4.1 下载链接: …...

第十二课 Unity 内存优化_内存工具篇(Memory)详解

内存&#xff08;Memory&#xff09; unity 内存部分也是优化过程中非常重要的一个环节&#xff0c;也会影像渲染过程中的同步等待与带宽问题。因此内存的优化也可能会给我们渲染开销带来精简&#xff0c;今天我们先来了解unity中的内存与使用到的内存工具。 Unity中的内存 托…...

达梦8-达梦数据的示例用户和表

1、示例库说明&#xff1a; 创建达梦数据的示例用户和表&#xff0c;导入测试数据。 在完成达梦数据库的安装之后&#xff0c;在/opt/dmdbms/samples/instance_script目录下有用于创建示例用户的SQL文件。samples目录前的路径根据实际安装情况进行修改&#xff0c;本文将达梦…...

数据可视化-1. 折线图

目录 1. 折线图适用场景分析 1. 1 时间序列数据展示 1.2 趋势分析 1.3 多变量比较 1.4 数据异常检测 1.5 简洁易读的数据可视化 1.6 特定领域的应用 2. 折线图局限性 3. 折线图代码实现 3.1 Python 源代码 3.2 折线图效果&#xff08;网页显示&#xff09; 1. 折线图…...

【现代服务端架构】传统服务器 对比 Serverless

在现代开发中&#xff0c;选择合适的架构是至关重要的。两种非常常见的架构模式分别是 传统服务器架构 和 Serverless。它们各有优缺点&#xff0c;适合不同的应用场景。今天&#xff0c;我就带大家一起对比这两种架构&#xff0c;看看它们的差异&#xff0c;并且帮助你选择最适…...

论文学习—VAE

VAE----Auto-Encoding Variational Bayes 2024年12月17日-2024年12月18日摘要引言方法例子&#xff1a;变分自动编码器 2024年12月17日-2024年12月18日 从今天开始&#xff0c;我准备记录自己学习的内容以此来检验我每天的学习量&#xff0c;菜鸡一枚&#xff0c;希望能够与大…...

AI 智能体(AI Agent)到底什么原理?能干什么事情

智能体应用有哪些&#xff1f; 智能体在千行百业中有着广泛的应用&#xff0c;目前已经在 600 多个项目落地和探索&#xff0c;广泛应用于政府与公共事业、交通、工业、能源、金融、医疗、科研等行业。智能体是模拟人类智能的计算机系统&#xff0c;能自主感知环境、智能决策并…...

【mysql】如何查看大表记录行数

目录 1. 使用 ANALYZE TABLE 和 SHOW TABLE STATUS2. 查询 INFORMATION_SCHEMA 表3. 使用索引统计信息4. 维护行数缓存5. 使用分区计数 1. 使用 ANALYZE TABLE 和 SHOW TABLE STATUS 1.ANALYZE TABLE 可以更新表的统计信息&#xff0c;然后使用 SHOW TABLE STATUS 来查看估算的…...

Linux之网络配置

一、检查虚拟机和本机通不通 测试虚拟机和本机是否通不通 winR&#xff0c;运行本机cmd&#xff0c;输入ipconfig&#xff0c;拿到本机ip地址 在虚拟机上ping一下这个地址(ctrlshitv)可以把复制的文本粘贴进虚拟机。 可以看到&#xff0c;不通&#xff0c;解决方法在最后&am…...

SpringBoot集成JWT和Redis实现鉴权登录功能

目前市面上有许多鉴权框架&#xff0c;鉴权原理大同小异&#xff0c;本文简单介绍下利用JWT和Redis实现鉴权功能&#xff0c;算是抛砖引玉吧。 主要原理就是“令牌主动失效机制”&#xff0c;主要包括以下4个步骤&#xff1a; (1)利用拦截器LoginInterceptor实现所有接口登录拦…...

LabVIEW热电偶传感器虚拟仿真实验系统

在教学和科研领域&#xff0c;实验设备的更新和维护成本较高&#xff0c;尤其是在经济欠发达地区&#xff0c;设备的短缺和陈旧化严重影响了教学质量。基于LabVIEW的热电偶传感器虚拟仿真实验系统能够通过模拟实验环境&#xff0c;提供一个成本低廉且效果良好的教学和研究平台。…...

Centos7 部署ZLMediakit

1、拉取代码 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init 2、安装编译器 sudo yum -y install gcc 3、安装cmake sudo yum -y install cmake 4…...

Docker搭建kafka环境

系统&#xff1a;MacOS Sonoma 14.1 Docker版本&#xff1a;Docker version 27.3.1, build ce12230 Docker desktop版本&#xff1a;Docker Desktop 4.36.0 (175267) 1.拉取镜像 先打开Docker Desktop&#xff0c;然后在终端执行命令 docker pull lensesio/fast-data-dev …...

wsl2-ubuntu安装docker后无法拉取镜像

如上是报错全部信息, 这个实际上是因为网络不通导致的, 由于我实在公司使用, 而公司上网需要使用代理, 因此把代理加上就行了. # 为docker服务添加代理 mkdir /etc/systemd/system/docker.service.d cat > /etc/systemd/system/docker.service.d/http-proxy.conf <<…...

Invalid bound statement (not found) 错误解决

出现这个错误提示&#xff1a;Invalid bound statement (not found): com.xxx.small_reservior.dao.WaterRainMapper.getWaterRainByRegion&#xff0c;通常表示 MyBatis 框架无法找到与给定的 getWaterRainByRegion 方法匹配的 SQL 映射语句。这种问题通常发生在以下几种情况中…...

深度学习的下一站:解锁人工智能的新边界

引言&#xff1a;新边界的呼唤 深度学习的诞生&#xff0c;犹如人工智能领域的一次革命&#xff0c;激发了语音助手、自动驾驶、智能医疗等前沿技术的飞速发展。然而&#xff0c;面对现实世界的复杂性&#xff0c;现有的深度学习模型仍然存在数据依赖、可解释性差、环境适应力不…...

搭建Tomcat(三)---重写service方法

目录 引入 一、在Java中创建一个新的空项目&#xff08;初步搭建&#xff09; 问题&#xff1a; 要求在tomcat软件包下的MyTomcat类中编写main文件&#xff0c;实现在MyTomcat中扫描myweb软件包中的所有Java文件&#xff0c;并返回“WebServlet(url"myFirst")”中…...

跟着AI 学AI开发二,本地部署自己的Chat GPT

这里要安装的是Open Web UI &#xff0c;用一张架构图说明AI 前端与后端的关系。 之前的Python 的方法已经做过多次介绍&#xff0c;这里不做赘述。 顺序&#xff1a;1&#xff0c;Ollama。 2&#xff0c;Docker。 3&#xff0c;Open WebUI。 Ollama 安装下载地址&#xff1…...

XXE靶机漏洞复现通关

1.扫描XXE靶机的ip地址 将kali虚拟机和XXE靶机部署在同一局域网中&#xff0c;都采用NAT网络模式 搭建好后在kali终端中进行扫描XXE靶机的ip arp-scan -l 根据常识我们可以推断192.168.27.153为靶机的ip地址 2.访问靶机页面并扫描附录 进入页面后我们可以打开御剑扫描网页中…...

XS9922B 同轴RX芯片 四通道 多合一模拟高清解码器

XS9922B 是一款 4 通道模拟复合视频解码芯片&#xff0c;支持 HDCCTV 高清协议和 CVBS 标 清协议&#xff0c;视频制式支持 720P/1080P 高清制式和 960H/D1 标清制式。芯片将接收到的高清 模拟复合视频信号经过模数转化&#xff0c;视频解码以及 2D 图像处理之后&#xff0c;转…...

如何在谷歌浏览器中设置电子邮件通知

在现代互联网生活中&#xff0c;电子邮件已成为我们日常沟通的重要工具。为了更高效地管理邮件&#xff0c;您可以在谷歌浏览器中设置电子邮件通知。本文将详细介绍如何实现这一功能&#xff0c;并附带一些相关的Chrome使用技巧。&#xff08;本文由https://chrome.google64.cn…...

利用Java获取淘宝商品详情API接口的深入指南引言

引言 在电商领域&#xff0c;数据的价值日益凸显&#xff0c;尤其是在淘宝这样的大型电商平台上。淘宝商品详情API接口允许开发者通过编程方式获取商品的详细信息&#xff0c;这对于市场分析、竞争对手研究等方面至关重要。本文将详细介绍如何使用Java编写爬虫程序&#xff0c…...

3D工具显微镜的测量范围

一、测量尺寸范围 样品尺寸&#xff1a; 3D工具显微镜通常能够测量各种尺寸和形状的样品&#xff0c;从小至微米级别的微小结构到大至几厘米甚至更大的物体。具体的测量尺寸范围取决于显微镜的载物台大小、镜头焦距以及软件处理能力。测量精度&#xff1a; 3D工具显微镜的测量…...

WPF DataTemplate 数据模板

DataTemplate 顾名思义&#xff0c;数据模板&#xff0c;在 wpf 中使用非常频繁。 它一般用在带有 DataTemplate 依赖属性的控件中&#xff0c;如 ContentControl、集合控件 ListBox、ItemsControl 、TabControls 等。 1. 非集合控件中使用 <UserControl.Resources>&l…...

知道一个服务器IP地址,如何attack对方美国

CSDN提醒&#xff1a;亲爱的用户&#xff1a;你好&#xff01; 你的账号于2024-12-17 19:04:04在美国美国登录&#xff0c;登录IP为&#xff1a;47.238.159.124。若非本人登录&#xff0c;请及时修改密码。 莫名其妙显示美国登录了我的CSDN博客 卧槽 简介 服务器的IP地址是一…...

lettuce 默认情况下连接池参数不生效,源码分析

先说结论&#xff1a; 1.LettuceConnectionFactory 属性 shareNativeConnection 默认为true&#xff0c;要想连接池生效&#xff0c;该参数设置为false; 2.使用redisTemplate模版封装的pipeline没有意义&#xff0c;autoFlashCommands 默认为true;spring2.0开始默认使用lettuc…...

《宇宙机器人》提示错误弹窗“找不到d3dx9_43.dll”是什么原因?“d3dx9_43.dll缺失”怎么解决?

电脑游戏运行时常见问题解析&#xff1a;《宇宙机器人》提示“找不到d3dx9_43.dll”的解决之道 TGA2024落幕&#xff0c;年度最佳游戏——《宇宙机器人》&#xff0c;作为一名在软件开发领域深耕多年的从业者&#xff0c;我深知电脑游戏在运行过程中可能会遇到的各种挑战&…...