手写顺序流程图组件

效果图

完整代码

<template><div><div class="container" :style="{ width: `${spacingX * (colNum - 1) + itemWidth * colNum}px` }"><divv-for="(item, i) in recordList":key="i"class="list-box":style="{marginTop: i < colNum ? '0' : `${spacingY}px`,marginRight: i % (2 * colNum) === colNum - 1 || i % (2 * colNum) === colNum ? '0' : `${spacingX}px`,order: orderList[i] && orderList[i].order,visibility: orderList[i] && orderList[i].itemHide ? 'hidden' : 'visible'}"><div class="cont-box" :style="{ width: itemWidth + 'px', height: itemHeight + 'px', backgroundColor: '#16a085' }">{{ item }}</div><div v-if="i !== listLen - 1" class="arrow-box" :style="arrowStyle[orderList[i] && orderList[i].arrow]"><div class="line-tip" /><div class="arrow-tip" /></div></div></div></div>
</template><script>
export default {name: 'FlowPath',data() {return {itemWidth: 75, // item宽度itemHeight: 75, // item高度colNum: 1, // 显示的列数spacingX: 40, // 列间距spacingY: 40, // 行间距rawList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18], // 原始数据recordList: [], // 列表数据arrowStyle: { right: {}, down: {}, left: {}}, // 箭头样式orderList: [], // 列表排序序号listLen: '' // 列表数据长度}},mounted() {this.listLen = this.rawList.lengththis.initFun() // 初始化方法window.addEventListener('resize', this.initFun) // 页面宽度变化监听器},beforeDestroy() {window.removeEventListener('resize', this.initFun) // 组件销毁时移除 resize 事件监听器,避免内存泄漏},methods: {/* 初始化方法 */initFun() {const pageWidth = document.documentElement.clientWidth // 获取页面宽度(可视区域宽度)const minTotalWidth = this.itemWidth + this.spacingX // 每个 item(包含间距) 期望的最小总宽度为 minTotalWidth(单位:px)const newNum = Math.floor(pageWidth / minTotalWidth) // 计算 colNum,向下取整this.colNum = Math.max(newNum, 1) // 限制 colNum 的最小值,比如至少为 1 列// 更新箭头样式和列表样式,因为 colNum 变化了,相关布局依赖 colNum 列数this.setArrowStyle() // 设置箭头样式this.setOrderList() // 设置列表样式},/* 设置箭头样式 */setArrowStyle() {const left = {width: this.spacingX + 'px',top: this.itemHeight / 2 + 'px',left: -this.spacingX + 'px'}const right = {width: this.spacingX + 'px',top: this.itemHeight / 2 + 'px',right: -this.spacingX + 'px',transform: 'rotate(180deg)'}const down = {width: this.spacingY + 'px',left: this.itemWidth / 2 + 'px',bottom: -this.spacingY + 'px',transform: 'rotate(-90deg)',transformOrigin: 0}this.arrowStyle = { right, left, down }},/* 设置列表样式 */setOrderList() {this.recordList = JSON.parse(JSON.stringify(this.rawList))this.orderList = [] // 列表排序序号const n = this.colNum // 显示的列数const dbn = n * 2 // 列数 * 2// 添加占位的 item 项const arrLen = this.listLenconst remainder = (arrLen - 1) % dbnif (remainder >= n && remainder < dbn) {const diff = dbn - 1 - remainderfor (let i = 0; i < diff; i++) {this.orderList[arrLen + i] = {itemHide: true,order: arrLen + i}this.recordList[arrLen + i] = null}}// 设置 item 的箭头方向和顺序this.recordList.map((item, index) => {const i = index % dbn	// 余数if (i >= 0 && i < n) {this.orderList[index] = {order: index,arrow: i !== n - 1 ? 'right' : 'down'} // 不用改变顺序} else {this.orderList[index] = {order: index + ((n - 1) - 2 * (i - n)), // i - n 是与最近一侧的距离arrow: i !== dbn - 1 ? 'left' : 'down',itemHide: this.orderList[index]?.itemHide} // 需要改变顺序}})}}
}
</script><style scoped lang="scss">
.container {display: flex;flex-wrap: wrap;box-sizing: border-box;overflow: hidden;.list-box {position: relative;font-size: 20px;box-sizing: border-box;.cont-box {}}
}
/* 箭头区域 */
.arrow-box {$bgColor: #303133;position: absolute;// 线条样式.line-tip {position: absolute;top: 50%;transform: translateY(-50%);left: 3px;width: 90%;height: 2px;background-color: $bgColor;}// 箭头样式.arrow-tip {position: absolute;top: 50%;transform: translateY(-50%);left: 1px;width: 0;height: 0;border-top: 8px solid transparent;border-bottom: 8px solid transparent;border-right: 8px solid $bgColor;}
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot自定义中文Banner

Spring Boot自定义中文Banner在线生成工具 https://www.bootschool.net/https://www.bootschool.net/1.选择喜欢的复制 2.在resources文件下新建banner文件&#xff0c;粘贴即可 <_> ::::: …

SpringCloud源码-Ribbon

一、Spring定制化RestTemplate&#xff0c;预留出RestTemplate定制化扩展点 org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration 二、Ribbon定义RestTemplate Ribbon扩展点功能 org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguratio…

风力涡轮机缺陷检测数据集,86.6%准确识别率,11921张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注

风力涡轮机缺陷检测数据集&#xff0c;86.6&#xff05;准确识别率&#xff0c;11921张图片&#xff0c;支持yolo&#xff0c;PASICAL VOC XML&#xff0c;COCO JSON格式的标注 数据集下载 yolov11&#xff1a; https://download.csdn.net/download/pbymw8iwm/90206849 yolov…

Vue 针对浏览器参数过长实现浏览器参数加密解密

1、首先安装crypto-js npm install crypto-js 1、在router/index.js中添加如下代码 在utils工具类添加如下 encryption.js源码 import CryptoJS from crypto-js import CryptoJSCore from crypto-js/core import AES from crypto-js/aes import ZeroPadding from crypto-js/…

Python脚本实现通过Vector VN1630A CAN盒子与ECU通信

1 安装 python-can 包 安装命令如下&#xff1a; pip install python-can安装完成后可用下面命令查看是否安装成功及版本。 pip show python-canName: python-can Version: 4.4.2 Summary: Controller Area Network interface module for Python Home-page: https://github.…

Oracle 创建本地用户,授予权限,创建表并插入数据

目录 一. 用户的种类二. 切换session为PDB三. 创建用户并授予权限四. 创建表空间五. 为用户分配默认表空间并指定表空间配额六. 通过创建的用户进行登录七. 创建脚本&#xff0c;简化登录八. 查看用户信息九. 创建表&#xff0c;并插入数据9.1 查看当前用户的schema9.2 插入数据…

普及组集训数据结构--并查集

P1551 亲戚 - 洛谷 | 计算机科学教育新生态 并查集就是把所有相关联的量串成一串珠子&#xff0c;抽象来说就是&#xff1a; 把此类相关联的量当作节点&#xff0c;两个节点之间连接一条无向边&#xff0c;所形成的图 例题算法流程&#xff1a; 在此定义“族长”就是一个树的…

ESP32-S3遇见OpenAI:OpenAI官方发布ESP32嵌入式实时RTC SDK

目录 OpenAI RTC SDK简介应用场景详解智能家居控制系统个人健康助手教育玩具 技术亮点解析低功耗设计快速响应高精度RTC安全性保障开发者指南 最近&#xff0c;OpenAI官方发布了一款针对ESP32-S3的嵌入式实时RTC&#xff08;实时时钟&#xff09;SDK&#xff0c;这标志着ESP32-…

JS基础 -- 数组 (对象 / 数组 / 类数组 / 对象数组)的遍历

一、数组&#xff1a; 数组是复杂数据类型&#xff0c;用于存储一组有序的数据。 1、创建数组&#xff1a; ① 使用 new 关键字&#xff1a; let arr new Array() // 创建一个长度为0的空数组 let arrLength new Array(5) // 创建一个长度为5的空数组② 字面量形式&#…

【期末复习】一、操作系统概论

题型 选择题 论述题 综合分析题(计算,证明) 算法分析题(根据程序代码分析) 1.方面 操作系统在计算机系统中主要涉及硬件、软件和数据这三个重要方面。 2.操作系统发展历史 手工操作阶段(1940s) 联机批处理系统阶段(1950s) 脱机批处理系统阶段(1950s) 多道…

基于STM32F103的USART的原理及应用(一)(实现手机BLE和MCU进行通信)

一&#xff0c;查阅数据手册&#xff0c;找到对应的IO口和外设总线并配置好外设源文件 想了解USART的具体原理的小伙伴请进传送门&#xff1a;&#xff08;总结&#xff09;STM32中USART原理及应用&#xff08;PC、BLE、ESP8266通信实现&#xff09;-CSDN博客 二&#xff0c;打…

业务模型与UI设计

业务数据模型的设计、UI设计这应该是程序设计中不可缺少的部分。做程序设计的前提应该先把这两块设计好&#xff0c;那么&#xff0c;来一个实际案例&#xff0c;看看这2块的内容。 汽车保养记录业务模型与UI设计&#xff1a; 一、【车辆清单】 记录车辆相关的数据&#xff0…

微服务保护—Sentinel快速入门+微服务整合 示例: 黑马商城

1.微服务保护 微服务保护是确保微服务架构可靠、稳定和安全的策略与技术。 在可靠性上&#xff0c;限流是控制进入微服务的请求数量&#xff0c;防止流量过大导致服务崩溃。比如电商促销时对商品详情服务进行流量限制。熔断是当被调用的微服务故障过多或响应过慢时&#xff0c;…

unity学习4:git和SVN的使用差别

目录 1 svn 1.1 操作逻辑 1.2 对应工具 1.3 SVN避免冲突的好习惯 2 git 2.1 git的基础操作逻辑 2.1.1 commit时&#xff0c;提交文件之外的其他文件需要pull 2.1.2 commit时&#xff0c;发现要提交的本地文件和服务器的文件冲突了 2.1.3 pull 时 2.2 对应工具 2.3 …

Docker新手:在tencent云上实现Python服务打包到容器

1 使用docker的原因 一致性和可移植性&#xff1a;Docker 容器可以在任何支持 Docker 的环境中运行&#xff0c;无论是开发者的笔记本电脑、测试服务器还是生产环境。这确保了应用在不同环境中的行为一致&#xff0c;减少了“在我的机器上可以运行”的问题。 隔离性&#xff…

阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance)

阻抗&#xff08;Impedance&#xff09;、容抗&#xff08;Capacitive Reactance&#xff09;、感抗&#xff08;Inductive Reactance&#xff09; 都是交流电路中描述电流和电压之间关系的参数&#xff0c;但它们的含义、单位和作用不同。下面是它们的定义和区别&#xff1a; …

入门网络安全工程师要学习哪些内容【2025年寒假最新学习计划】

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 大家都知道网络安全行业很火&#xff0c;这个行业因为国家政策趋势正在大力发展&#xff0c;大有可为!但很多人对网络安全工程师还是不了解&#xff0c;不知道网…

智联视频超融合平台:电力行业的智能守护者

文章目录 一、远程实时监控与设备状态监测二、提高应急响应能力三、实现无人值守与减员增效四、保障电力设施安全与防范外部破坏五、提升电网运行管理效率与决策科学性六、助力电力企业数字化转型与智能化发展七、智联视频超融合平台 在当今数字化浪潮下&#xff0c;视频联网平…

带虚继承的类对象模型

文章目录 1、代码2、 单个虚继承3、vbptr是什么4、虚继承的多继承 1、代码 #include<iostream> using namespace std;class Base { public:int ma; };class Derive1 :virtual public Base { public:int mb; };class Derive2 :public Base { public:int mc; };class Deri…

信号的产生、处理

一、信号的概念 信号是linux系统提供的一种&#xff0c;向指定进程发送特定事件的方式。收到信号的进程&#xff0c;要对信号做识别和处理。信号的产生是异步的&#xff0c;进程在工作过程中随时可能收到信号。 信号的种类分为以下这么多种&#xff08;用指令kill -l查看&…