使用一条带箭头的虚线连接两个div,并且div拖拽时保持虚线连接

 

 


 

1.如何使用带箭头的虚线将div连接


        a.了解path命令


        我们可以使用svg的path配合marker属性来实现,首先我们需要了解path元素的命令

        M(x,y) 起始位置的坐标

        L(x,y) 结束位置的坐标

 <!-- 从 坐标(150,0) ~ (300,300) -->
 <!-- <path d="M 150,0 L 300,300"  style="stroke: red ;stroke-width:2px"   /> -->

这样我们就会得到一条这样的直线

        那么如何绘制一条虚线,只需要添加"stroke-dasharray: 0.5%"属性就可以了

<!-- 从 坐标(150,0) ~ (300,300) -->
<path d="M 150,0 L 300,300" style="stroke: red; stroke-width: 2px ;stroke-dasharray: 0.5%;"  />

        H(x) 绘制一条给定x坐标的横线

 <!-- 从 坐标(150,300) ~ (600,0) 的横线 -->
 <path d="M 150,300 H 600" style="stroke: aqua" />

         V(y) 绘制一条给定y坐标的垂线

      <!-- 从 坐标(150,300) ~ (0,600) 的垂线 -->
      <path d="M 150,300 V 600" style="stroke: red; stroke-width: 2px" />

        C(x1,y1 x2,y2 x,y) 绘制一条 x1,y1 x2,y2 为控制点 终点为x,y的三次贝塞尔曲线

   <!-- 从(50,200)出发,以(0,50)(150,50)为控制点,以(300,200)为终点的三次贝塞尔曲线 /> -->
   <path d="M 50,200 C 0,50 150,50 300,200" style="stroke-width: 2px" fill="#fff" />


        b.marker属性实现箭头


        markerWidth: marker标记的宽度

        markerHeight: marker标记的高度

        markerUnits: 默认为strokeWidth 将marker的标记的大小设置为允许缩放

        refX refY: 是图形和marker标记连接位置的坐标

        orient: 他决定marker在与其他元素连接时 是否会旋转

        我们图形应用marker有以下几种方法

                marker-start=”url(#marker-id)”

                marker-mid=”url(#marker-id)”

                marker-end=”url(#marker-id)”

                marker=”url(#marker-id)”

        <defs>
          <marker
            markerWidth="10"
            markerHeight="10"
            markerUnits="strokeWidth"
            id="wjl"
            refX="0"
            refY="2"
            orient="auto"
          >
            <path d="M 0 0 L 5 2 L 0 4 z" />
          </marker>
        </defs>
        <path
          d="M 0,0 C 150,0 150,100 200,100"
          class="line3"
          style="marker-end: url(#wjl)"
          fill="none"
        />

        // .line3 {
        //   stroke-width: 2px;
        //   stroke: black;
        // }

这样我们就可以绘制一条有箭头的虚线了


2. 了解clientX/Y、 screenX/Y 、offsetX/Y

想要完成这个功能,我们必须了解的就是clientX/Y、 screenX/Y 、offsetX/Y

clientX/Y事件被触发时鼠标相对于浏览器区域的水平/垂直坐标
screenX/Y事件被触发时鼠标相对于屏幕的水平/垂直坐标
offsetX/Y事件被触发时鼠标相对于事件源的水平/垂直坐标


3.接下来我们要实现div的拖动


        1、为需要拖动的元素添加鼠标按下事件

        

        2、通过计算坐标实现鼠标拖动div 同理 为第二个div添加此方法

        

         3.接下来通过设置path的M(x,y)和L(x,y)来实现鼠标拖动 连接线始终连接的效果

 updated() {
   this.d = `M ${this.fX + 25?this.fX + 25:50},${this.fY?this.fY:0} L ${this.sX != ''?this.sX + 25:250},${this.sY?this.sY:55}`;
  },

        这时候我们在鼠标拖动方法中获得的fX和fY就起到了作用

        由于我的div大小为50px,所以为x坐标加25是为了使连接点的起始位置和终点位置都在两个div的中心,我们通过三元运算符来判断以确定在我们没有拖动时连接线的位置,到这一步我们就已经完成了拖动但是连接线保持连接

        4.通过进一步判断实现连接线根据两个div位置切换的效果

  updated() {
    this.d = `M ${this.fX + 25?this.fX + 25:50},${this.fY?(this.fY>this.sY+25?this.fY:this.fY+50):0}  L ${this.sX != ''?this.sX + 25:250},${this.sY?(this.sY>this.fY+25?this.sY:this.sY+50):55}`
  },
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以使用以下 HTML、CSS 和 SVG 代码来画两个长方形中间用箭头线连接: ```html <div style="position: relative; width: 200px; height: 100px;"> <!-- 第一个长方形 --> <svg viewBox="0 0 100 100" style="position: absolute; left: 20px; top: 20px;"> <rect x="0" y="0" width="100" height="100" fill="#f00" /> </svg> <!-- 第二个长方形 --> <svg viewBox="0 0 100 100" style="position: absolute; left: 120px; top: 20px;"> <rect x="0" y="0" width="100" height="100" fill="#0f0" /> </svg> <!-- 箭头线 --> <svg viewBox="0 0 200 100" style="position: absolute; left: 0; top: 0;"> <line x1="80" y1="50" x2="120" y2="50" stroke="#00f" stroke-width="2" marker-end="url(#arrow)" /> <!-- 定义箭头 --> <defs> <marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto" markerUnits="strokeWidth"> <path d="M0,0 L0,10 L8,5 z" fill="#00f" /> </marker> </defs> </svg> </div> ``` 其中,`div` 元素用来创建包裹 SVG 元素的容器,`position: relative;` 属性用来指定容器的定位方式,`width` 和 `height` 属性用来指定容器的大小。每个 SVG 元素用来创建长方形或箭头线,`viewBox` 属性用来指定 SVG 的视口大小和位置,`style` 属性用来指定 SVG 元素的定位方式和位置箭头线的 SVG 元素需要放在最后面,以便覆盖前面的 SVG 元素。 需要注意的是,SVG 元素默认是 inline 元素,无法设置宽度和高度,需要用 CSS 的 `position` 属性和 `left`、`top` 属性来控制位置和大小。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值