html实现竖直步骤条

news2024/11/29 8:58:27

1、问题描述

        最近碰到一个需求,要把审批流程改为竖直步骤条的形式。本来想直接抄网上的,但是网上给的要么是水平步骤条,要么是集成在框架里的,要么就是人家写的太复杂了,js,css一大堆。

2、我的代码

        代码下载:【免费】步骤条Demo.zip资源-CSDN文库

        index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<script type="text/javascript" src="./js/jquery.min.js"></script>
	<link rel="stylesheet" href="./css/myStyle.css" />
	<body>
		<script type="text/javascript">
			$(document).ready(function() {
				// $("body").append(drawLine($("#step1"), $("#step2"),"black"));
				// $("body").append(drawLine($("#step2"), $("#step3"),"black"));
				// $("body").append(drawLine($("#step3"), $("#step4"),"black"));
				var arrStep = [];
				var index = 0;
				$(".step").each(function() {
					console.log($(this).attr("id"));
					arrStep[index++] = $(this).attr("id");
				})
				for (var i = 0; i < arrStep.length - 1; i++) {
					$("body").append(drawLine($("#" + arrStep[i]), $("#" + arrStep[i + 1]), "#DDDDDD"));
				}
				$("#step1").addClass("is-ready");
				//$("body").append(drawLine($("#step1"),$("#"+finalStepId),"#DDDDDD"));

				$(".btnApprove").click(function() {
					var id = $(this).attr("id");
					var num = id.substr(id.length - 1, 1);
					var bAllow = true;
					// console.log(num)
					//如果当前步已完成,则直接退出函数
					if ($("#step" + num).hasClass("is-finish")) {
						return;
					}
					if (num > 1) {
						//第一步之后,只有当下一步未完成且当前步未完成时,上一步已完成,才可以点审批
						if ((!$("#step" + (Number(num) + 1)).hasClass("is-finish")) && ($("#step" + (Number(
								num) - 1)).hasClass("is-finish"))) {
							// console.log("num="+num)
							// console.log("bAllow="+bAllow)
							bAllow = true;
						} else {
							bAllow = false;
						}
					}
					if (bAllow) {
						console.log("step" + num)
						$("#step" + num).removeClass("is-ready");
						$("#step" + num).addClass("is-finish");
						if (document.getElementById("step" + (Number(num) + 1))) {
							$("#step" + (Number(num) + 1)).addClass("is-ready");
						}
						$("body").append(drawLine($("#step" + num), $("#step" + (Number(num) + 1)), "#4995FA"));
					}

				});

				$(".btnRefuse").click(function() {
					var id = $(this).attr("id");
					var num = id.substr(id.length - 1, 1);
					//如果当前步已完成,则直接退出函数
					if ($("#step" + num).hasClass("is-finish")) {
						return;
					}
					$("#step" + (Number(num) - 1)).removeClass("is-finish");
					$("#step" + (Number(num) - 1)).addClass("is-ready");
					$("#step" + num).removeClass("is-ready");
					$("#step-bar" + (Number(num) - 1) + "1").remove();
				})
			})

			//type:1同意,0拒绝
			function drawLine(start, end, colorCode) {
				if (document.getElementById(start.attr("id")) && document.getElementById(end.attr("id"))) {
					var startId = start.attr("id");
					var endId = end.attr("id");
					var startNum = startId.substr(startId.length - 1, 1);
					var endNum = endId.substr(endId.length - 1, 1);
					var startObj = start.offset();
					var endObj = end.offset();
					var returnStr = ""
					if (colorCode == "#DDDDDD") {
						return `<div class='step-bar' style='top:${startObj.top+20}px;left:${startObj.left+15}px;height:${endObj.top-startObj.top-10}px;background-color:${colorCode};'></div>`
					}
					returnStr = returnStr +
						`<div class='step-bar' id='step-bar${startNum}1' style='top:${startObj.top+20}px;left:${startObj.left+15}px;height:${endObj.top-startObj.top-10}px;background-color:${colorCode};'></div>`
					console.log(returnStr)
					return returnStr;
				}
			}
		</script>
		<div class="step" id="step1">
			<div class="point" id="point1"></div>
			<div class="content">步骤一</div>
			<button class="btnApprove" id="btnApprove1">同意</button>
			<button class="btnRefuse" id="btnRefuse1">拒绝</button>
		</div>
		<!-- <div class="step-bar"></div> -->
		<div class="step" id="step2">
			<div class="point" id="point2"></div>
			<div class="content">步骤二</div>
			<button class="btnApprove" id="btnApprove2">同意</button>
			<button class="btnRefuse" id="btnRefuse2">拒绝</button>
		</div>

		<div class="step" id="step3">
			<div class="point" id="point3"></div>
			<div class="content">步骤三</div>
			<button class="btnApprove" id="btnApprove3">同意</button>
			<button class="btnRefuse" id="btnRefuse3">拒绝</button>
		</div>

		<div class="step" id="step4">
			<div class="point" id="point4"></div>
			<div class="content">步骤四</div>
			<button class="btnApprove" id="btnApprove4">同意</button>
			<button class="btnRefuse" id="btnRefuse4">拒绝</button>
		</div>

		<div class="step" id="step5">
			<div class="point" id="point5"></div>
			<div class="content">步骤五</div>
			<button class="btnApprove" id="btnApprove5">同意</button>
			<button class="btnRefuse" id="btnRefuse5">拒绝</button>
		</div>

		<div class="step" id="step6">
			<div class="point" id="point6"></div>
			<div class="content">步骤六</div>
			<button class="btnApprove" id="btnApprove6">同意</button>
			<button class="btnRefuse" id="btnRefuse6">拒绝</button>
		</div>

		<div class="step" id="step7">
			<div class="point" id="point7"></div>
			<div class="content">步骤七</div>
			<button class="btnApprove" id="btnApprove7">同意</button>
			<button class="btnRefuse" id="btnRefuse7">拒绝</button>
		</div>

		<div class="step" id="step8">
			<div class="point" id="point8"></div>
			<div class="content">步骤八</div>
			<button class="btnApprove" id="btnApprove8">同意</button>
			<button class="btnRefuse" id="btnRefuse8">拒绝</button>
		</div>
	</body>
</html>

        myStyle.css

.step {
	display: table;
	height: 100px;
	.point {
		display: table-cell;
		width: 10px;
		height: 10px;
		border-radius: 50%;
		/* background-color: #B4CFEC; */
		/* position: relative; */
		background-color:#DDDDDD;
		float: left;
		margin: 10px;
	}

	.content {
		display: table-cell;
		position: relative;
		float: right;
		margin-left: 10px;
	}
}

.step.is-finish{
	display: table;
	height: 100px;
	.point {
		display: table-cell;
		width: 10px;
		height: 10px;
		border-radius: 50%;
		/* background-color: #0E098B; */
		/* position: relative; */
		background-color:#B4CFEC;
		float: left;
		margin: 10px;
	}
	
	.content {
		display: table-cell;
		position: relative;
		float: right;
		margin-left: 10px;
	}
}

.step.is-ready{
	display: table;
	height: 100px;
	.point {
		display: table-cell;
		width: 10px;
		height: 10px;
		border-radius: 50%;
		background-color: #0E098B;
		/* position: relative; */
		/* background-color:#B4CFEC; */
		float: left;
		margin: 10px;
	}
	
	.content {
		display: table-cell;
		position: relative;
		float: right;
		margin-left: 10px;
	}
}

.step-bar {
	width: 1px;
	background-color: #4995FA;
	display: inline-block;
	position: absolute;
	z-index: 1;
	/*这里设置大于2,即可看到真正连线的其实是两个元素的中心坐标*/
}

.btnApprove {
	background-color: aquamarine;
	position:absolute;
	margin-left: 100px;
}

.btnRefuse {
	background-color:greenyellow;
	position:absolute;
	margin-left: 150px;
}

3、效果

4、总结

        无

5、参考资料

jquery获取当前元素的坐标_jq获取元素坐标-CSDN博客

js+css实现两个dom元素之间的连线_js 连线-CSDN博客 

模板字符串 - JavaScript | MDN 

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

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

相关文章

【沁恒 CH32V208 开发板免费试用】+ U盘/ SD NAND读写与多功能数码相框

CH32V208继承了沁恆产品一贯的传统&#xff0c;即U盘的读写功能。这使得尽管CH32V208的闪存要比CH32V307的小一倍&#xff0c;但有了U盘读写功能的支持就可有效地缓解用户对存储空间的需求。它除了支持U盘的读取&#xff0c;还支持对CS SD NAND (贴片式TF卡/SD卡) 这类器件的使…

小黑子—springMVC:第一章 请求处理与响应数据

springMVC入门1.0 1、小黑子的springMVC基础1.1 SpringMVC概述1.2 SpringMVC快速入门1.3 Controller中直接注入spring中维护的Bean1.4 SpringMVC关键组件浅析 2、SpringMVC的请求处理2.1 请求映射路径配置2.2 请求数据的接收2.2.1 键值对方式接收数据2.2.1 - I RquestParam属性…

Linux Hadoop平台伪分布式安装(Hive on Spark)

&#x1f4d4;Linux Hadoop 伪分布式安装(Hive on Spark) 安装目录 1. JDK2. Hadoop3. MysqlHive3.1 Mysql8安装3.2 Hive安装 4. Spark4.1 Maven安装4.2 Scala安装4.3 Spark编译并安装 5. Zookeeper6. HBase 版本概要&#xff1a; jdk&#xff1a; jdk-8u391-linux-x64.tar.gz…

浅析SR隧道路径批量构造方法

为什么要仿真PCE LSP下发隧道路径&#xff1f; 在大型的多区域网络中&#xff0c;路径计算非常复杂。在某些场景下&#xff0c;为了完成路径计算&#xff0c;需要在控制器上部署特殊的计算组件&#xff0c;并需要不同区域中的节点之间协作。这使得网元在进行路径计算时效率低&…

局部路由守卫path守卫

局部路由守卫path守卫 path守卫&#xff08;beforeEnter&#xff09; 代码位置&#xff1a;path守卫代码写在route对象中&#xff08;index.js文件&#xff09;beforeEnter是一个函数&#xff0c;参数上没有回调函数beforeEnter有三个参数&#xff1a; to参数&#xff1a;to是…

CocosCreator | 2.3.3及后续版本浏览器无法断点和控制台不显示错误代码路径的解决方案(cocos代码报错无法定位的问题)

在2.3.3正式版的官方介绍中有这么一项&#xff1a; 提升网页预览时的加载速度 为了进一步提升开发效率&#xff0c;我们优化了网页预览时的脚本加载速度。不论是对引擎还是项目中的代码&#xff0c;载入速度都获得了提升。特别是在开启自定义引擎&#xff0c;或者使用手机扫码…

实时时钟和日历电路MS85163/MS85163M

主要特点 ◼ 基于 32.768kHz 晶振提供年、月、日、 周工作日、小时、分钟和秒 ◼ 具有世纪标记&#xff0c;可工作于 2000-2199 年 ◼ 工作电压&#xff1a; 1.8V-5.5V ◼ 低功耗 ◼ 最高频率达 400kHz 的 I 2 C 接口 ◼ 可编程的时钟输出 (32.768kHz, 1.024kHz…

开发人员请注意:在 PyPI 上的 Python 包中发现 BlazeStealer 恶意软件

1、开发人员请注意&#xff1a;在 PyPI 上的 Python 包中发现 BlazeStealer 恶意软件 一组新的恶意 Python 包已经滑入 Python 包索引 &#xff08;PyPI&#xff09; 存储库&#xff0c;其最终目的是从受感染的开发人员系统中窃取敏感信息。这些软件包伪装成看似无害的混淆工具…

记录一次数据库内存占满

一&#xff0c;背景及表现 用户普遍反馈业务功能&#xff0c;无法加载出数据&#xff0c;服务挂了 二&#xff0c;数据库指标 三&#xff0c;排查方反馈 排查方反馈&#xff1a;查全量数据导致的&#xff0c;就是没查出来但是一直在查 四&#xff0c;分析 1.应用服务器问题…

深度系统v15.4正式发布,惊艳眼球

导读深度操作系统是一个致力于为全球用户提供美观易用、安全可靠的Linux发行版。深度桌面操作系统V15.4专业版使用全新设计的控制中心和重构桌面&#xff0c;采用模糊透明整体风格&#xff0c;全新的热区交互及窗口管理器动效&#xff0c;精挑细选的桌面壁纸&#xff1b;采用全…

VNC连接服务器实现远程桌面 --以AutoDL云服务器为例

VNC连接服务器实现远程桌面 --以AutoDL云服务器为例 针对本地机为Windows 云服务器租显卡跑些小模型很方便&#xff0c;但是当你想做可视化的时候&#xff0c;可能会遇到麻烦&#xff0c;云服务器没有显示输出界面&#xff0c;无法可视化一些检测任务的结果&#xff0c;或者可…

Python爬虫爬取家纺数据并分析

因为时间的原因&#xff0c;没法写一个详细的教程&#xff0c;但是我可以提供一个基本的框架。你需要根据实际情况进行修改和扩展。以下是使用Python的requests库和BeautifulSoup库来爬取网页内容的基本步骤&#xff1a; # 导入所需的库 import requests from bs4 import Beaut…

从零开始搭建SpringCloud微服务集群:Nacos的安装和配置

目录 Nacos集群搭建 1.集群结构图 2.搭建集群 2.1.初始化数据库 2.2.下载nacos 2.3.配置Nacos 2.4.启动 2.5.nginx反向代理 2.6.优化 Nacos集群搭建 1.集群结构图 官方给出的Nacos集群图&#xff1a; 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理3个Nac…

winui3开发笔记(二)自定义标题栏

参考文章链接&#xff1a;https://www.programminghunter.com/article/46392310600/ 注意事项 获取 AppWindowTitleBar 的实例并设置其颜色属性时&#xff0c;InitializeTitleBar(AppWindow.TitleBar);&#xff0c;只适用于Windows App SDK 1.2及以上&#xff0c;所以如果用w…

基于springboot学生心理咨询评估系统的设计与实现 全套代码 全套文档 附带视频知道教程

springboot学生心理咨询评估系统,springboot vue mysql (毕业论文10784字以上,共30页,程序代码,MySQL数据库) 代码下载: 链接&#xff1a;https://pan.baidu.com/s/1MjiwuWdkVHFQ4toPP1vVrA?pwd4eck 提取码&#xff1a;4eck 【运行环境】 IDEA, JDK1.8, Mysql, Node, Vue …

Unity 跑酷游戏全部脚本(完结)

脚本1 触发器脚本 这个脚本是主角身上的脚本&#xff0c;用于检测是否碰到其他触发器&#xff0c;并做出对应的行为 using System.Collections; using System.Collections.Generic; using UnityEngine; public class ColliidisonTrigger : MonoBehaviour { //触发检测 …

08.Diffusion Model数学原理分析(下)

文章目录 denoising matching term σ t z \sigma_tz σt​z的猜想Diffusion Model for SpeechDiffusion Model for TextMask-Predict 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》&#xff0c;B站自行搜索。 书接上文。 denoising matching term E q ( x t ∣ x 0 …

适用于 iOS 的 10 个最佳数据恢复工具分享

在当今的数字时代&#xff0c;我们的移动设备占据了我们生活的很大一部分。从令人难忘的照片和视频到重要的文档和消息&#xff0c;我们的 iOS 设备存储了大量我们无法承受丢失的数据。然而&#xff0c;事故时有发生&#xff0c;无论是由于软件故障、无意删除&#xff0c;甚至是…

Java 算法篇-深入理解递归(递归实现:青蛙爬楼梯)

&#x1f525;博客主页&#xff1a; 小扳_-CSDN博客 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 递归的说明 2.0 用递归来实现相关问题 2.1 递归 - 阶乘 2.2 递归 - 反向打印字符串 2.3 递归 - 二分查找 2.4 递归 - 冒泡排序 2.5 递归 - 冒泡排序2.0 2.6 递归 - 插…

Vite依赖预构建

本文使用的包管理工具是 npm 开发工具是 vscode 本文作为对 vite的了解性内容即可&#xff0c;实际开发中并不会做太多的工作 依赖预构建干了啥 首先vite会找到对应的依赖&#xff0c; 然后调用 esbuild(对js语法进行处理的一个库)&#xff0c; 将其他规范的代码转换成 esmodu…