Html让两个Dom进行连线 , 可以自定义连接的位置

javascript 复制代码
        function getXy(dom, pos) {
            var obj = {x : 0, y : 0};
            if(pos == 'button') {
                obj.x = dom.offsetLeft + dom.offsetWidth / 2;
                obj.y = dom.offsetTop + dom.offsetHeight;
            }else if(pos == 'left') {
                obj.x = dom.offsetLeft;
                obj.y = dom.offsetTop + dom.offsetHeight / 2;
            }else if(pos == 'right') {
                obj.x = dom.offsetLeft + dom.offsetWidth;
                obj.y = dom.offsetTop + dom.offsetHeight / 2;
            }else if(pos == 'top') {
                obj.x = dom.offsetLeft + dom.offsetWidth / 2;
                obj.y = dom.offsetTop;
            }
            return obj;
        }

        function connectEdges(id1, id2, color = 'red', width = '0.5' , pos1 = 'right', pos2 = 'left') {
            const dom1 = document.getElementById(id1);
            const dom2 = document.getElementById(id2);
            const svg = document.getElementById('svg-container');
            var objXy1 = getXy(dom1, pos1);
            var objXy2 = getXy(dom2, pos2);
            // 创建SVG线条
            const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');
            line.setAttribute('x1', objXy1.x);
            line.setAttribute('y1', objXy1.y);
            line.setAttribute('x2', objXy2.x);
            line.setAttribute('y2', objXy2.y);
            line.setAttribute('stroke', color); // 线条颜色
            line.setAttribute('stroke-width', width); // 线条宽度
            // 将线条添加到SVG容器中
            svg.appendChild(line);
        }

                // 这是我自己的业务代码
                for(var i = 0 ; i  < data.length ; i++) {
                    var obj = data[i];
                    if(obj.source != obj.target){
                        if(obj.target.indexOf('配偶') != -1) {
                            connectEdges(obj.source, obj.target, 'red', 2, 'right', 'left');
                        }else{
                            connectEdges(obj.source, obj.target, 'blue', 0.5, 'button', 'top');
                        }
                    }
                }
相关推荐
一见6 分钟前
WorkBuddy安装Skill的方法
android·java·javascript
..过云雨6 分钟前
【负载均衡oj项目】01. 项目概述及准备工作
linux·c++·html·json·负载均衡
kyriewen9 分钟前
Flexbox 完全指南:从此告别浮动,拥抱一维战神
前端·css·html
xChive9 分钟前
ECharts3D图表 | 3D柱状图和3D饼图实现思路
前端·3d·echarts
HookJames10 分钟前
解决Claude Code v2.1.74 官方找不到模型的问题-终结版
前端·chrome
代码煮茶11 分钟前
Vite 工程化实战 | 从 0 配置一个企业级前端项目(按需引入 / 环境变量 / 打包优化)
前端·vue.js
程序员Sunday11 分钟前
5000 字长文,全网最细的OpenClaw(小龙虾)架构拆解,我建议你认真看完
前端·人工智能
踩着两条虫14 分钟前
AI 驱动的 Vue3 应用开发平台 深入探究(九):双向代码转换之处理事件、Props 和指令
前端·vue.js·ai编程
badhope16 分钟前
GitHub热门AI技能Top20实战指南
前端·javascript·人工智能·git·python·github·电脑
踩着两条虫16 分钟前
AI 驱动的 Vue3 应用开发平台 深入探究(八):双向代码转换之 模板编译与AST转换
前端·vue.js·ai编程