原生html+js实现两两元素配对,用线条连接两个元素

news/2025/1/23 2:21:05/文章来源:https://www.cnblogs.com/mtpmm-bky/p/18237551

效果如下:

画线部分借鉴了“https://blogweb.cn/article/1403842582411”此链接文章作者的代码,感谢!
直接放出代码:

点击查看代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>配对</title><script type="text/javascript" src="../../libs/easyui/jquery.min.js"></script><script type="text/javascript" src="../../libs/easyui/jquery.easyui.min.js"></script>
</head>
<body class="easyui-layout">
<div title="帮助" data-options="iconCls:'icon-help',closable:true" style="padding:10px"><button id="remove-btn" style="margin-left: 100px;font-size: 20px" onclick="removeBtn()">撤销</button><form id="checkbox-from0" style="float: left"></form><form id="checkbox-from1" style="float: left;margin-left: 100px"></form><input id="logText" class="easyui-textbox" data-options="multiline:true"value="This TextBox will allow the user to enter multiple lines of text."style="width:300px;height:500px;float: left">
</div><script>var webAppName = "/" + window.location.pathname.split("/")[1];var lineCache = [];var index0_id = null;var index1_id = null;var logText;var logStr = "";var colorArray = ['red','green','orange','blue','purple','pink','brown'];var colorIndex = 0;initTextBox();initData();function initTextBox() {logText = $('#logText').textbox();logText.textbox('setValue', logStr);logStrAppend('已配对记录:');}function initData() {var checkDataItem0 = [];var checkDataItem1 = [];for (let i = 0; i < 10; i++) {var item0 = {};item0['label'] = 'item' + i;item0['value'] = 'item' + i;item0['checked'] = false;checkDataItem0.push(item0);var item1 = {};item1['label'] = 'item' + (9 - i);item1['value'] = 'item' + (9 - i);item1['checked'] = false;checkDataItem1.push(item1);}var checkboxFrom0 = $('#checkbox-from0');for (let i = 0; i < checkDataItem0.length; i++) {var item = checkDataItem0[i];var checkboxId = 'checkbox-0-' + i;var checkboxItem0 = $('<h2 id="' + checkboxId + '" style="text-align: center;padding:5px;border: 2px solid #b2b2b2">'+item.label+'</h2></br></br>');checkboxFrom0.append(checkboxItem0);var checkboxView = document.getElementById(checkboxId);checkboxView.onclick = function () {if (updateObjId('checkbox-0-' + i)){index0_id = 'checkbox-0-' + i;}if (index0_id != null && index1_id != null){drawLine(index0_id,index1_id);}}}var checkboxFrom1 = $('#checkbox-from1');for (let i = 0; i < checkDataItem1.length; i++) {item = checkDataItem1[i];checkboxId = 'checkbox-1-' + i;var checkboxItem1 = $('<h2 id="' + checkboxId + '" style="text-align: center;padding:5px;border: 2px solid #b2b2b2">'+item.label+'</h2></br></br>');checkboxFrom1.append(checkboxItem1);checkboxView = document.getElementById(checkboxId);checkboxView.onclick = function () {if (updateObjId('checkbox-1-' + i)){index1_id = 'checkbox-1-' + i;}if (index0_id != null && index1_id != null){drawLine(index0_id,index1_id);}}}console.log("testSelector.html");drawLine('checkbox-0-1','checkbox-1-8');}function updateObjId(id){for (let i = 0; i < lineCache.length; i++) {var link0 = lineCache[i]['link0'];var link1 = lineCache[i]['link1'];if (id === link0 || id === link1){return false;}}return true;}function drawLine (id0, id1) {var obj1 = document.getElementById(id0);var obj2 = document.getElementById(id1);var color = colorArray[colorIndex];obj1.style.color = color;obj2.style.color = color;if (colorIndex < colorArray.length){colorIndex ++;}if (colorIndex >= colorArray.length){colorIndex = 0;}// 起点坐标var x1 = obj1.getBoundingClientRect().left + obj1.clientWidth / 2var y1 = obj1.getBoundingClientRect().top + obj1.clientHeight / 2// 终点坐标var x2 = obj2.getBoundingClientRect().left + obj2.clientWidth / 2var y2 = obj2.getBoundingClientRect().top + obj2.clientHeight / 2// 计算连接线长度var length = Math.sqrt((x2 -x1) * (x2 -x1) + (y2 -y1) * (y2 -y1))// 计算连接线旋转弧度值var rad = Math.atan2((y2 -y1), (x2 -x1))// 连接线未旋转前,起点坐标计算var top = (y1 + y2) / 2var left = (x1 + x2) / 2 - length / 2// 创建连接线 dom 节点,并设置样式var line = document.createElement('div')var style = 'position: absolute; background-color: '+color+'; height: 3px; top:' +top + 'px; left:' + left + 'px; width: ' + length + 'px; transform: rotate(' + rad + 'rad);'line.setAttribute('style', style)document.body.appendChild(line);var lineObj = {};lineObj['link0'] = id0;lineObj['link1'] = id1;lineObj['line'] = line;lineCache.push(lineObj);index0_id = null;index1_id = null;logStrAppend(obj1.innerText + "-----" + obj2.innerText);}function removeBtn() {let length = lineCache.length;if (length > 0){var link0 = lineCache[length - 1]['link0'];var link1 = lineCache[length - 1]['link1'];var line = lineCache[length - 1]['line'];document.body.removeChild(line);lineCache.splice(length - 1,1);}}function logStrAppend(str) {logStr += "\n" + str;let len = logStr.split('\n').length;if (len > 200) {let index = logStr.indexOf("\n", 2);logStr = logStr.substring(index, logStr.length);}logText.textbox('setValue', logStr);}
</script>
</body>
</html>

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

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

相关文章

代码随想录算法训练营第三十天 | 51.N 皇后

51.N 皇后 题目链接 文章讲解 视频讲解递归三部曲递归函数参数 需要传入当前chessBoard和棋盘大小n,以及当前要放置皇后的行数rowvoid backtracking(vector<string>& chessBoard, int n, int row);递归终止条件 当最后一个皇后放置好后结束if(row == n) {result.pus…

使用Verdaccio创建一个本地私有库,并应用

安装verdaccio npm install -g verdaccio 直接verdaccio启动 可以先右上角登录然后先使用 npm create vite@latest 然后创建属于自己的一个vue3项目 vite-project(随便起了个名) npm i 一下 npm run dev 跑起来看看 然后创建下列文件夹style/indsx/scss .u-t…

【医疗器械产品分类规则了解】

分类目录由国家食品药品监督管理部门依据医疗器械分类规则制定: 医疗器械按照风险程度由低到高,管理类别依次分为第一类、第二类和第三类。医疗器械风险程度,应当根据医疗器械的预期目的,通过结构特征、使用形式、使用状态、是否接触人体等因素综合判定。 第一类医疗器械是…

VS下QT使用QCustomplot报错QPainter::HighQualityAntialiasing: Use Antialiasing instead

@Time:2024-06-07 @Error:VS+QT+QCustomplot 编译时报错 ERROR 4995 QPainter::HighQualityAntialiasing: Use Antialiasing instead @原因:使用标记有 deprecated 的函数。参见:/sdl(启用附加安全检查) | Microsoft Learn @解决办法:关闭编译报错或编译警告;参见:编…

[Qt开发]当我们在开发兼容高分辨率和高缩放比、高DPI屏幕的软件时,我们在谈论什么。

前言 最近在开发有关高分辨率屏幕的软件,还是做了不少尝试的,当然我们也去网上查了不少资料,但是网上的资料也很零碎,说不明白,这样的话我就做个简单的总结,希望看到这的你可以一次解决你有关不同分辨率下的所有问题。 分辨率?DPI? 首先我们搞清楚我们现在到底面对的是…

Maui+blazor中使用https时信任所有证书

Maui中的Android使用https时信任所有证书 前言 最近使用Maui+blazor写了一个Android app,需要调用webapi接口,同时需要用websock与服务器通信,在使用http和https中遇到一些问题 http Android默认禁止http,想要使用http需要在Platforms\Android目录下找到AndroidManifest.xml…

文件格式转换器哪个工具更好用?

文件格式转换器哪个好用?相信很多小伙伴在处理PDF文件时会遇到各种各样的问题,不晓得的选择哪款文件格式转换器!这个时候我们该如何解决呢?以下是文件格式转换器推荐,一起来看看吧。 一、Adobe Acrobat 推荐指数★★★☆☆ Adobe Acrobat是一款非常成熟的在线PDF转换软件,…

yarn或者npm安装依赖报错401 Unauthorized

1. 报错2.原因 在npm顶层的npmrc中指定了某仓库地址,触发了需要验证(可以通过直接打开401的地址看浏览器是否能直接下载)

pr的工作原理

Premiere Pro了解pr面板菜单栏:里面包括文件,编辑,剪辑,序列,标记,窗口,帮助等,在这些菜单里还有子菜单。效果面板:双击素材,可以在效果面板里进行编辑你想要的效果。节目面板:在时间轴里编辑时,要是查看效果在节目面板里进行查看。项目面板:导入和新建的素材都可…

ARM技术 —— 条件执行

文档: DDI0487J_a_a-profile_architecture_reference_manual.pdf本文来自博客园,作者:摩斯电码,未经同意,禁止转载

pr工作原理文档

Adobe Premiere Pro的工作原理思维导图 Pr面板展示图 第一步:导入视频1导入点击文件——点击导入——选择视频,双击视频或点击打开按钮——完成导入。2预览点击视频,拖到右侧;拖动蓝色条,时间指针,点击会快速预览,快捷键是空格键。3视频轨道和音频轨道A声音;V:视频;左…

vue3+TypeScript

1. Vue3简介2020年9月18日,Vue.js发布版3.0版本,代号:One Piece(n经历了:4800+次提交、40+个RFC、600+次PR、300+贡献者官方发版地址:Release v3.0.0 One Piece vuejs/core截止2023年10月,最新的公开版本为:3.3.41.1. 【性能的提升】打包大小减少41%。初次渲染快55%, …