在列表之间画箭头

11

有没有办法在两个高亮列表项之间动态绘制箭头?

所以如果我将鼠标悬停在“Item 2”上,它会这样做(但是是一条直线箭头):

Item 1            Highlight 3
Item 2-----\      Highlight 1
Item 3      ----->Highlight 2
这是我几分钟前从这里得到的答案代码: 当鼠标悬停时在两个列表中高亮显示项的代码。
$(".list1 li, .list2 li").hover(function () {
    var n = this.id.substr(2);
    $("#qq" + n + ", #aa" + n).toggleClass("highlight");
});

jsfiddle: http://jsfiddle.net/e37Yg/1/

<ul class="list1">
    <li id="qq1">sdfsdv</li>
    <li id="qq2">bnvnvb</li>
    <li id="qq3">nmnutymnj7</li>
    <li id="qq4">cvbc</li>
    <li id="qq5">45tsgd</li>
</ul>

<ul class="list2">
    <li id="aa3">fgtbrtgb</li>
    <li id="aa1">vbn xgbn</li>
    <li id="aa5">vdgver</li>
    <li id="aa4">asdasdv</li>
    <li id="aa2">nvfbnfn</li>
</ul>
4个回答

6

这里不必使用2D绘图。看看这个:http://jsfiddle.net/vjYuW/ 我刚刚fork并更新了你上面发布的fiddle。

这是基本代码,它处理3个1像素宽或高的DIV来绘制线条:

HTML:


...left list...
<div id="segment1" class="hline"></div>
<div id="segment2" class="vline"></div>
<div id="segment3" class="hline"></div>
...right list...

CSS:


... formatting for ULs here, both have to be float:left...

.highlight { background-color: red; }

.hline {    
    display:block;
    position:relative;
    float:left;
    height: 1px;
    width: 7em;  
}

.vline {
    display:block;
    position:relative;
    float:left;
    height: 1px;
    width: 1px;    
}

JavaScript:


$(".list1 li, .list2 li").hover(function () {
    var n = this.id.substr(2);
    var leftY = $('#qq' + n).position().top;
    var rightY = $('#aa' + n).position().top;
    var H = Math.abs(rightY-leftY);
    if (H == 0) H = 1;
    $('#segment1').css('top',leftY+'px');
    $('#segment3').css('top',rightY+'px');
    $('#segment2').css('top',Math.min(leftY,rightY)+'px');
    $('#segment2').css('height',H+'px');
    $("#qq" + n + ", #aa" + n + ",#segment1,#segment2,#segment3").toggleClass("highlight");
});

注意:您可能需要稍微调整一下以支持所有浏览器——我没有检查IE6及其它浏览器。


6
您可以使用HTML5的canvas元素来实现这个。
我不确定这是否是最好的方法,但我试着调整了一下然后得到了这个
我所做的第一件事是将列表包含在div中。使用CSS给div添加相对位置样式。这样,当您使用jQuery获取位置时,它将相对于此处给出一个位置。接下来,在列表前面放置画布并禁用指针事件。我还添加了其他内容以调整画布的高度以适应列表的高度。然后,我添加了另一个悬停的处理程序。当您悬停在上面时,它会绘制箭头,并在退出时清除画布。
绘制箭头非常简单。首先它获取项目的位置。然后它绘制一条线并使用一些数学来定位箭头。获取位置非常容易。对于右侧的列表,可以使用position方法。对于左侧的列表,我创建了一个临时span并将其附加到列表项,然后获取了该位置。

3

我认为对于这样的问题,您可能需要使用第三方绘图库,例如矢量绘图库

您可以从链接下载该库并将其添加到应用程序中。然后:

将其包含在您的页面中:

<script type="text/javascript" src="wz_jsgraphics.js"></script>

然后在你的hover函数中添加以下内容:
$(".list1 li, .list2 li").hover(function () {
  var n = this.id.substr(2);
  $("#qq" + n + ", #aa" + n).toggleClass("highlight");

  //canvas is your drawing div
  var jg = new jsGraphics("canvas");
  jg.drawLine($("#qq" + n).offset().left + 30, $("#qq" + n).offset().top , $("#aa" + n).offset().left, $("#aa" + n).offset().top );
  jg.paint();

请注意,您需要编写代码来删除hover函数中的行,否则一旦绘制,它将保留。此外,我使用offset()来计算列表中项目的位置。这应该有效,但您可能需要稍微调整一下才能使其看起来正确。
上面的代码可以工作,但不完整。也许hover中的第二个函数可以在canvas上调用clear()。Canvas在这里是包含两个列表的封闭div。

0
<script src='www.walterzorn.de/en/scripts/wz_jsgraphics.js'> </script>

function drawLine(element1, element2) {
    var jg = new jsGraphics("renderGraph");
    var ele1 = document.getElementById(element1);
    var ele2 = document.getElementById(element2);
    jg.setColor("#DDD");
    jg.setStroke(5);
    jg.drawLine(ele1.offsetLeft + ele1.offsetWidth/2 , ele1.offsetTop + ele1.offsetHeight/2, ele2.offsetLeft + ele2.offsetWidth/2, ele2.offsetTop + ele2.offsetHeight/2);
    jg.paint();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接