2011-01-12 83 views
11

是否有任何方法在两个突出显示的列表项之间动态绘制箭头?在列表之间绘制箭头

所以,如果我上空盘旋,“项目2”,将做到这一点(但直箭头):

Item 1   Highlight 3 
Item 2-----\  Highlight 1 
Item 3  ----->Highlight 2 

这是我几个小时前来到这里的答案代码:

Highlight item in two lists when mouseover

$(".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> 

回答

6

您不必在这里使用2D绘图。看看这个:http://jsfiddle.net/vjYuW/ 我只是分叉和更新你上面张贴的小提琴。

这里是必不可少的代码,它处理3倍的DIV 1个像素宽或高的绘制线:

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 &有限公司

3

我认为对于这样的事情你可能想使用第三方绘图库,如Vector Draw Library

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

它列入您的网页上:

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

然后添加到您的悬停功能:

$(".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(); 

注意,您必须编写代码来删除行的悬停功能否则一旦绘制它将保持。此外,我正在使用offset()来计算列表中项目的位置。这应该可以工作,但你可能需要调整一下才能看起来正确。

上述代码有效,但不完整。也许悬停中的第二个功能可以在画布上调用clear()。此处的Canvas是包含这两个列表的封闭div。

6

您可以使用HTML5 canvas元素来实现此目的。

我不确定这是否是最好的办法,但我摆弄并得到this

我做的第一件事是我在div中附上了列表。 div使用CSS来设置相对位置。当你通过jQuery获得这个职位时,情况就是这样,它会给出一个相对于此的位置。接下来,我在列表前放置一个画布,并在其上禁用指针事件。我还添加了一些东西来调整画布的高度到列表的高度。然后我添加了另一个悬停处理程序。当你将鼠标悬停在上面时,它会画出箭头,当你悬停时,它会清除画布。

绘制箭头非常简单。首先它得到物品的位置。然后它绘制一条线并使用一些数学来定向箭头。获得职位相当容易。对于正确的列表,您可以使用position方法。对于左侧列表,我创建了一个临时的span并将其附加到列表项中,然后获得了该位置。

+0

嘿,很酷的东西:) – 2011-01-12 03:59:26

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(); 
}