用户点击后,我需要将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>
&#13;
答案 0 :(得分:6)
您可以使用画布上下文中的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: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;
}
.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>
答案 1 :(得分:5)
以下是使用SVG的解决方案:
单击左右两个框后,它将在最后两个单击的元素之间绘制线条。
var leftEl, rightEl;
function drawLine(leftEl, rightEl) {
var width = $(rightEl).offset().left - $(leftEl).offset().left;
var height = $(leftEl).offset().top - $(rightEl).offset().top;
if (height == 0) {
height = 2;
}
var line = $("<div style='position: absolute; width: "+Math.abs(width)+"px; height: "+Math.abs(height)+"px;'><svg style='width: 100%; height: 100%;'><line x1='"+(height > 0 ? '0' : '100%')+"' y1='100%' ' x2='"+(height > 0 ? '100%' : '0')+"' y2='0' style='stroke:rgb(255,0,0);stroke-width:2'/></svg></div>");
$('.container').append(line);
myPos = height > 0 ? 'left bottom' : 'left top';
ofPos = height == 2 ? 'center center-12' : 'left+5 top+5'
if (leftEl.data('line')) {
leftEl.data('line').remove()
}
if (rightEl.data('line')) {
rightEl.data('line').remove()
}
line.position({
my: myPos,
at: ofPos,
of: leftEl
})
leftEl.data('line', line)
rightEl.data('line', line)
}
$('.box-left,.box-right').on('click', function() {
if ($(this).hasClass('box-left')) {
leftEl = this
}
if($(this).hasClass('box-right')) {
rightEl = this
}
if (leftEl && rightEl) {
drawLine(
$(leftEl).parent().find('.round-pointer-right'),
$(rightEl).parent().find('.round-pointer-left')
);
leftEl = rightEl = null;
}
});
.container {
position: relative;
}
.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;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.css" />
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<link href="http://code.ionicframework.com/1.3.1/css/ionic.css" rel="stylesheet"/>
Match the following items.
<div class="container">
<div class="row padding-answer-line-mapping">
<div class="col answer-container box-left">
One
<div class="round-pointer-right"></div>
</div>
<div class="col">
</div>
<div class="col answer-container box-right">
2
<div class="round-pointer-left"></div>
</div>
</div>
<div class="row padding-answer-line-mapping">
<div class="col answer-container box-left">
Two
<div class="round-pointer-right"></div>
</div>
<div class="col">
</div>
<div class="col answer-container box-right">
1
<div class="round-pointer-left"></div>
</div>
</div>
<div class="row padding-answer-line-mapping">
<div class="col answer-container box-left">
Three
<div class="round-pointer-right"></div>
</div>
<div class="col">
</div>
<div class="col answer-container box-right">
3
<div class="round-pointer-left"></div>
</div>
</div>
</div>
我还添加了一个选项,一旦再次点击已经有一行的框,就删除一行。