【问题标题】:Draw arrow between lists在列表之间绘制箭头
【发布时间】:2018-08-15 02:23:44
【问题描述】:

有没有办法在两个突出显示的列表项之间动态绘制箭头?

因此,如果我将鼠标悬停在“第 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>

【问题讨论】:

    标签: javascript jquery html drawing


    【解决方案1】:

    您不必在这里使用 2D 绘图。看看这个:http://jsfiddle.net/vjYuW/ 我刚刚分叉并更新了您在上面发布的小提琴。

    这是基本代码,它处理 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 & Co.

    【讨论】:

      【解决方案2】:

      您可以使用 HTML5 canvas 元素来实现这一点。

      我不确定这是否是最好的方法,但我摆弄了一下,得到了this

      我首先将列表包含在div 中。 div 使用 CSS 设置样式以具有相对位置。因此,当您使用 jQuery 获得位置时,它会给出相对于该位置的位置。接下来,我在列表前面放置了一个画布,并在其上禁用了指针事件。我还添加了一些东西来将画布的高度调整为列表的高度。然后我添加了另一个悬停处理程序。当你将鼠标悬停在它上面时,它会绘制箭头,当你将鼠标悬停在它上面时,它会清除画布。

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

      【讨论】:

        【解决方案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。

        【讨论】:

          【解决方案4】:
          <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();
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多