一旦用户点击,我需要用一条线连接2个DIV.我以角度开发我的项目.谁能帮我?我真的需要解决方案.
请参阅我的代码段以获得更清晰的信息.
.padding-answer-line-mapping { padding-bottom:8px; } .answer-container { width:40px; height:40px; background-color:#ccc; border:1px solid #ccc; margin:2px; float:left; text-align:center; padding-top:8px; cursor:pointer; position:relative; } .answer-container:hover,.answer-container:focus,.answer-container:active { background-color: #0076e9; color: white; border: 1px solid #0076e9; } .round-pointer-right { position: absolute; background-color:#ccc; cursor:pointer; width:10px; height:10px; border-radius: 50%; right:0px; top:14px; margin-right:-20px; } .round-pointer-left { position: absolute; background-color:#ccc; cursor:pointer; width:10px; height:10px; border-radius: 50%; left:0px; top:14px; margin-left:-20px; }
<link href="http://code.ionicframework.com/1.3.1/css/ionic.css" rel="stylesheet"/> Match the following items. <div class="row padding-answer-line-mapping"> <div class="col answer-container"> One <div class="round-pointer-right"></div> </div> <div class="col"> </div> <div class="col answer-container"> 2 <div class="round-pointer-left"></div> </div> </div> <div class="row padding-answer-line-mapping"> <div class="col answer-container"> Two <div class="round-pointer-right"></div> </div> <div class="col"> </div> <div class="col answer-container"> 1 <div class="round-pointer-left"></div> </div> </div>
解决方法
您可以使用画布上下文中的
lineTo.有关详细信息,请参见
https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D.
首先,在html上定义画布:
<canvas id="connection-canvas"></canvas>
然后你可以在上面划一条线:
function drawLine(p1,p2) { var canvas = document.getElementById("connection-canvas"); var ctx = canvas.getContext("2d"); ctx.beginPath(); ctx.moveTo(p1.x,p1.y); ctx.lineTo(p2.x,p2.y); ctx.stroke(); }
你需要的只是弄清楚你的“圆形指针”的偏移量:
function getPoint(answerElement) { var roundPointer = answerElement.lastElementChild; return { y: answerElement.offsetTop + roundPointer.offsetTop + roundPointer.offsetHeight / 2,x: answerElement.offsetLeft + roundPointer.offsetLeft + roundPointer.offsetWidth / 2 }; }
因此,您可以使用这两个函数获取“圆形指针”的中心点并在画布中绘制一条线从另一个“圆形指针”,假设画布位于相同的答案容器的偏移父级及其大小必须足够大.
接下来,您必须处理选择两个连接它们的答案.下面有一个演示版.如果您更改答案,此演示不会处理删除行.
var lastSelection; // Add click listener for answer-container function listenToClick() { var rows = document.querySelectorAll('.row'),row; var cols,col; for (row = 0; row < rows.length; row++) { cols = rows[row].children; for (col = 0; col < cols.length; col++) { // Bind information about which answer is this,// so we can prevent from connecting two answers on // same column. cols[col].addEventListener('click',selectAnswer.bind({ row: row,col: col,element: cols[col] })); } } } // This is fired when a answer-container is clicked. function selectAnswer(event) { if (lastSelection) { lastSelection.element.classList.remove('selected'); } if (!lastSelection || lastSelection.col === this.col) { lastSelection = this; this.element.classList.add('selected'); } else { drawLine(getPoint(this.element),getPoint(lastSelection.element)); lastSelection = null; } } function getPoint(answerElement) { var roundPointer = answerElement.lastElementChild; return { y: answerElement.offsetTop + roundPointer.offsetTop + roundPointer.offsetHeight / 2,x: answerElement.offsetLeft + roundPointer.offsetLeft + roundPointer.offsetWidth / 2 }; } function drawLine(p1,p2) { var canvas = document.getElementById("connection-canvas"); var ctx = canvas.getContext("2d"); ctx.beginPath(); ctx.moveTo(p1.x,p1.y); ctx.lineTo(p2.x,p2.y); ctx.stroke(); } function resizeCanvas() { var canvas = document.getElementById("connection-canvas"); var ctx = canvas.getContext("2d"); ctx.canvas.width = window.innerWidth; ctx.canvas.height = window.innerHeight; } listenToClick(); resizeCanvas();
.padding-answer-line-mapping { padding-bottom:8px; } .answer-container { width:40px; height:40px; background-color:#ccc; border:1px solid #ccc; margin:2px; float:left; text-align:center; padding-top:8px; cursor:pointer; position:relative; } .answer-container:hover,.answer-container:active { background-color: #0076e9; color: white; border: 1px solid #0076e9; } .round-pointer-right { position: absolute; background-color:#ccc; cursor:pointer; width:10px; height:10px; border-radius: 50%; right:0px; top:14px; margin-right:-20px; } .round-pointer-left { position: absolute; background-color:#ccc; cursor:pointer; width:10px; height:10px; border-radius: 50%; left:0px; top:14px; margin-left:-20px; } .selected { background-color: red; }
<link href="//code.ionicframework.com/1.3.1/css/ionic.css" rel="stylesheet"/> Match the following items. <canvas id="connection-canvas" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0"></canvas> <div class="row padding-answer-line-mapping"> <div class="col answer-container"> One <div class="round-pointer-right"></div> </div> <div class="col"> </div> <div class="col answer-container"> 2 <div class="round-pointer-left"></div> </div> </div> <div class="row padding-answer-line-mapping"> <div class="col answer-container"> Two <div class="round-pointer-right"></div> </div> <div class="col"> </div> <div class="col answer-container"> 1 <div class="round-pointer-left"></div> </div> </div>