請(qǐng)問圖中這種對(duì)應(yīng)關(guān)系的指引線怎么實(shí)現(xiàn),右邊的盒子可能會(huì)有好幾個(gè),怎樣動(dòng)態(tài)的和左邊的盒子建立指引線的聯(lián)系?請(qǐng)了解的大佬給個(gè)實(shí)現(xiàn)的思路和方法
這個(gè)屬于腦圖的效果
我更建議你引入組件庫來幫助你實(shí)現(xiàn)這一效果
https://antv.alipay.com/zh-cn...
https://www.yuque.com/antv/g6...
額,我的方法有點(diǎn)笨,就是將線與塊放在一個(gè)容器內(nèi),計(jì)算他們?cè)谌萜鲀?nèi)的左標(biāo),然后連線。c 可以拖拽,線在右側(cè)可以跟隨,但是拖動(dòng)不好用,,,
大概思路如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Page Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.10/lodash.min.js"></script>
<style>
body {
position: relative;
border: 1px solid #ccc;
height: 500px;
width: 500px;
}
body > div {
position: absolute;
width: 100px;
height: 50px;
background: blueviolet;
color: white;
}
div.line {
border-top: 2px dashed red;
height: 0;
}
#a {
top: 200px;
left: 100px;
}
#b {
top: 100px;
left: 300px;
}
#c {
top: 300px;
left: 300px;
}
</style>
</head>
<body>
<div id='a'>A</div>
<div id='b'>B</div>
<div id='c' style="background: teal">C, drag me</div>
<canvas id='anc' style='position: absolute; z-index: 1'></canvas>
<div id='anb' class='line'></div>
<script>
const ela = document.getElementById('a');
const elb = document.getElementById('b');
const elc = document.getElementById('c');
const lineAToB = document.getElementById('anb');
const lineAToC = document.getElementById('anc');
const container = document.body;
let lineCtx = lineAToC.getContext('2d');
const drawPaddingX = 10;
const drawPaddingY = 10;
// 元素左上角,在容器內(nèi)的坐標(biāo)
let pEla = getCordInContainer(ela);
let pElb = getCordInContainer(elb);
let pElc = getCordInContainer(elc);
// 元素本身的長(zhǎng)寬
let sEla = { width: ela.offsetWidth, height: ela.offsetHeight };
let sElb = { width: elb.offsetWidth, height: elb.offsetHeight };
let sElc = { width: elc.offsetWidth, height: elc.offsetHeight };
function getCordInContainer(elem) {
let eX = elem.offsetLeft;
let eY = elem.offsetTop;
return { eX, eY };
}
// 三角函數(shù)忘得差不多了,這里面角度的符號(hào)沒有確定,隨便寫的。。。
function setLine() {
// 這個(gè)坐標(biāo)差,應(yīng)該從兩個(gè)連接點(diǎn)換直角三角形計(jì)算
let diffXAB = (pElb.eX - sElb.width )- pEla.eX ;
let diffXAC = (pElb.eX -sElb.width) - pEla.eX ;
let diffYAB = pEla.eY + sEla.height/2 - sElb.height/2 - pElb.eY ;
let diffYAC = pEla.eY + sEla.height/2 - sElb.height/2 - pElb.eY ;
// 求夾角
let lineABDeg = Math.atan2(diffYAB, diffXAB) * 180 / Math.PI;
let lineABRad = Math.atan2(diffYAB, diffXAB);
let lineWidth = diffYAB/Math.sin(lineABRad);
// 求初始位置,主要是旋轉(zhuǎn)后的偏移量
let lineStartX = pEla.eX + sEla.width - (lineWidth/2 - lineWidth/2*Math.cos(lineABRad));
let lineStartY = pEla.eY + sEla.height/2 - lineWidth/2*Math.sin(lineABRad);
let str = `width: ${lineWidth}px; top: ${lineStartY}px; left: ${lineStartX}px`;
console.log(str);
lineAToB.style.cssText= str;
lineAToB.style.transform = `rotate(${-lineABDeg}deg)`;
}
// 將線放置到正確位置
setLine();
function drawLine(canElem, ctx) {
pElc = getCordInContainer(elc);
sElc = { width: elc.offsetWidth, height: elc.offsetHeight };
// 這個(gè)坐標(biāo)差,應(yīng)該從兩個(gè)連接點(diǎn)換直角三角形計(jì)算
// 調(diào)整這個(gè)就可一移動(dòng)到左面
let diffXAC = (pElc.eX -sElc.width) - pEla.eX + 2 * drawPaddingX;
let diffYAC = Math.abs(pEla.eY + sEla.height/2 - sElc.height/2 - pElc.eY) + 2 * drawPaddingY;
let lineStartX = pEla.eX + sEla.width;
let lineStartY = pEla.eY + sEla.height/2;
let lineEndX = pElc.eX;
let lineEndY = pElc.eY + sElc.height/2;
let lineCordX = Math.min(lineStartX, lineEndY) - drawPaddingX;
let lineCordY = Math.min(lineStartY, lineEndY) - drawPaddingY;
canElem.width = Math.abs(diffXAC);
canElem.height = Math.abs(diffYAC);
canElem.style.setProperty('left', lineCordX + 'px', '');
canElem.style.setProperty('top', lineCordY + 'px', '');
ctx.clearRect(0,0, canElem.width, canElem.height);
ctx.beginPath();
ctx.moveTo(lineStartX - lineCordX, lineStartY - lineCordY);
ctx.lineTo(lineEndX - lineCordX, lineEndY - lineCordY);
ctx.stroke();
}
drawLine(lineAToC, lineCtx);
let draging = false;
elc.onmousedown = () => {
draging = true;
}
container.onmousemove = _.throttle((e) => {
if (draging) {
elc.style.setProperty('left', elc.offsetLeft + e.movementX + 'px', '');
elc.style.setProperty('top', elc.offsetTop + e.movementY + 'px', '');
drawLine(lineAToC, lineCtx);
}
}, 10);
container.onmouseleave = () => {
draging = false;
}
container.onmouseup = () => {
draging = false;
console.log(draging);
}
</script>
</body>
</html>北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。