资讯专栏INFORMATION COLUMN

连接两个div的直线,拖动时保持连线。

monw3c / 2306人阅读

效果:连接两个div带箭头的虚线,拖动div时保持线条实时改变位置保持始终连接

效果图:

1.产品经理提出的需求

</>复制代码

  1. 用带箭头的虚线将两个位置不固定的div连接起来,初听到这个需求一头雾水,传统的div可以做直线,但斜起来不太好做,幸亏之前接触过svg,里面有一个line标签,知道起始中止两个点的位置,就可以将两个点连接起来了。
    至于箭头,可以这么做先定义箭头:

</>复制代码

将箭头放在直线上:marker-end="url(#arrow)"

</>复制代码

2.确定起始中止两个点左上角的位置

</>复制代码

  1. 需要连接的两个divSVG都相对于某一个div.wrap绝对定位,可以先求得两个div左上角相对与div.wrap坐标:

</>复制代码

  1. //获取元素左上角相对于某一元素的的位置
  2. function getElCoordinate(dom) {
  3. var t = dom.offsetTop;
  4. var l = dom.offsetLeft;
  5. var w = dom.offsetWidth;
  6. var h = dom.offsetHeight;
  7. dom = dom.offsetParent;
  8. while (!$(dom).hasClass("wrap")) {
  9. t += dom.offsetTop;
  10. l += dom.offsetLeft;
  11. dom = dom.offsetParent;
  12. }; return {
  13. top: t,//Y轴坐标
  14. left: l,//X轴坐标
  15. width:w,//元素宽度
  16. height:h//元素高度
  17. };
  18. }
  19. })
3.确定连接点在div上的位置:

</>复制代码

  1. 分为两种情况:终点div位于起点div上方,终点div位于起点div下方。

</>复制代码

  1. var pos1 = getElCoordinate($(".item1")[0])//起点div的位置
  2. var pos2 = getElCoordinate($(".item2")[0])//终点div的位置
  3. function getPos(pos1, pos2){
  4. //分两种情况
  5. var x1,y1,x2,y2;
  6. if(pos2.top
  7. 4.确定起止点位置后连线。
  8. </>复制代码

    1. function move(){
    2. var pos1 = getElCoordinate($(".item1")[0])
    3. var pos2 = getElCoordinate($(".item2")[0])
    4. var start = getPos(pos1, pos2).start
    5. var end = getPos(pos1, pos2).end
    6. $("#line").attr({ x1: start.x, y1: start.y, x2: end.x, y2: end.y })
    7. $("#path").attr({ d: "M20,20 L100,100" })
    8. }
    9. move()
  9. 5.两个div分别拖动并保持线始终连接
  10. </>复制代码

    1. drag($(".item"), move)
    2. function drag(obj,callback) {
    3. var dragEles = obj;
    4. dragEles.each(function(index, dragEleDom){
    5. var _move = false;//移动标记
    6. var _x, _y;//鼠标离控件左上角的相对位置
    7. var dragEle = $(dragEleDom)
    8. dragEle.click(function () {
    9. //alert("click");//点击(松开后触发)
    10. }).mousedown(function (e) {
    11. _move = true;
    12. _x = e.pageX - parseInt(dragEle.css("left"));
    13. _y = e.pageY - parseInt(dragEle.css("top"));
    14. // dragEle.fadeTo(20, 0.9);//点击后开始拖动并透明显示
    15. });
    16. $(document).mousemove(function (e) {
    17. if (_move) {
    18. var x = e.pageX - _x;//移动时根据鼠标位置计算控件左上角的绝对位置
    19. var y = e.pageY - _y;
    20. dragEle.css({ top: y, left: x });//控件新位置
    21. if(callback){callback()}
    22. }
    23. }).mouseup(function () {
    24. _move = false;
    25. dragEle.fadeTo("fast", 1);//松开鼠标后停止移动并恢复成不透明
    26. });
    27. })
    28. }
  11. 梳理下流程:分析需求>确定使用SVG>找到连接点>连线>拖动时保持连线。
  12. 源码托管于github欢迎star

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89619.html

相关文章

  • 基于vue简单流程图开发

    摘要:拖了这么久,现在终于要开始硬着头皮写一篇基于的流程图伪教程文章了。本教程主要讲述一个基于如何实现一个简单的流程图,更多引发的思考是,什么项目更适合使用这种模式的框架,以及如何发挥的价值。 严重拖延症,一方面这项目模块纯属个人娱乐。另一方面,流程图这块涉及的东西还是蛮多的,这次也只是介绍一些简单的部分。拖了这么久,现在终于要开始硬着头皮写一篇基于vue+svg的流程图伪教程文章了。初次献...

    hover_lew 评论0 收藏0
  • 基于vue简单流程图开发

    摘要:拖了这么久,现在终于要开始硬着头皮写一篇基于的流程图伪教程文章了。本教程主要讲述一个基于如何实现一个简单的流程图,更多引发的思考是,什么项目更适合使用这种模式的框架,以及如何发挥的价值。 严重拖延症,一方面这项目模块纯属个人娱乐。另一方面,流程图这块涉及的东西还是蛮多的,这次也只是介绍一些简单的部分。拖了这么久,现在终于要开始硬着头皮写一篇基于vue+svg的流程图伪教程文章了。初次献...

    willin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<