iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue+jsPlumb实现连线效果(支持滑动连线和点击连线)
  • 296
分享到

Vue+jsPlumb实现连线效果(支持滑动连线和点击连线)

VuejsPlumb连线效果Vue连线VuejsPlumb 2023-01-31 12:01:25 296人浏览 薄情痞子
摘要

目录前言实现前言 最近在做一个互动题板管理项目,主要负责开发互动题板的连线题,由于时间紧凑,一番search之后决定使用jsPlumb来做,本身jsPlumb做的是可以滑动连线的,奈

前言

最近在做一个互动题板管理项目,主要负责开发互动题板的连线题,由于时间紧凑,一番search之后决定使用jsPlumb来做,本身jsPlumb做的是可以滑动连线的,奈何产品要同时兼容点击,我想做过拖拽的前端小伙伴知道,拖拽和点击两者是有冲突问题; 拖拽比点击多了个move的操作,所有我们可以通过鼠标按下和抬起的位置来区分是否点击或者是拖拽,

思路:

① 记录鼠标按下mousedown和鼠标抬起mouseup的时候当前的pageX和pageY,

② 通过开方将两个位置坐标进行对比,当值等于0或者小于10的时候证明当前是点击事件,反之则是拖拽事件

实现

下载依赖:

npm install jsplumb --save`

代码

<template>
  <div id="container">
    <div style="display: flex;margin-bottom: 50px">
      <div v-for="(el, index) in up" :key="'up'+index" class="border"
           :id="'up-'+index"
           @mousedown="mouseDown($event,'up-'+index)" >
        {{el.txt}}
      </div>
    </div>
    <div style="display: flex">
      <div v-for="(el, index) in below" :key="'below'+index" class="border"
           :id="'below-'+index"
           @mousedown="mouseDown($event,'below-'+index)">
        {{el.txt}}
      </div>
    </div>
  </div>
</template>

<script>
import { jsPlumb } from "jsplumb";
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  data () {
    return {
      instance: null,
      up: [
        { txt: "up1"},
        { txt: "up2"},
        { txt: "up3"},
        { txt: "up4"},
      ],
      below: [
        { txt: "below1"},
        { txt: "below2"},
        { txt: "below3"},
        { txt: "below4"},
      ],
      curItem: "",
      pos: {
        pageX: 0,
        pageY: 0,
      },
      clickItem: []
    }
  },
  beforeDestroy () {
    document.removeEventListener("mouseup", this.mock);
  },
  mounted() {
    const _this = this;
    this.$nextTick(() => {
      jsPlumb.ready(function () {
        // 初始化jsPlumb 创建jsPlumb实例
        _this.init();
        // 设置可以为连线起点和连线终点的元素
        _this.setContainer();
        // 在连线事件中 只允许连接相邻的列表 不能跨列表连接
        _this.setRule();
        jsPlumb.fire("jsPlumbDemoLoaded", _this.instance);
      });
    });
    document.addEventListener("mouseup", this.mock);
  },
  methods: {
    init () {
      this.instance = jsPlumb.getInstance({
        Container: "container",
        Connector: "Straight",
        ConnectionsDetachable: false,
        DeleteEndpointsOnDetach: false,
        Detachable: false,
        PaintStyle: {
          strokeWidth: 5,
          stroke: "#ffffff",
          dashstyle: "5 0.8",
          outlineStroke: "transparent",
          outlineWidth: 15
        },
        HoverPaintStyle: {
          strokeWidth: 5,
          stroke: "#368FFF",
          dashstyle: "5 0.8"
        },
        Endpoint: ["Dot", { radius: 5 }],
        EndpointStyle: { fill: "transparent" }
      });
    },
    setContainer () {
      this.instance.batch(() => {
        for (let i = 0; i < this.up.length; i++) {
          this.initLeaf(`up-${i}`);
        }
        for (let j = 0; j < this.below.length; j++) {
          this.initLeaf(`below-${j}`);
        }
      });
    },
    setRule () {
      this.instance.bind("connection", () => {
        this.clickItem = [];
      });
    },
    initLeaf (id) {
      // anchor: ["Left", "Right"] 左右
      const elem = document.getElementById(id);
      this.instance.makeSource(elem,  {
        anchor: ["Top", "Bottom"],
        allowLoopback: false,
        maxConnections: -1
      });
      this.instance.makeTarget(elem, {
        anchor: ["Top", "Bottom"]
      });
    },
    mouseDown (e, index) {
      console.log("eee", e);
      this.curItem = index;
      this.pos = {
        pageX: e.pageX,
        pageY: e.pageY
      };
    },
    mock (e) {
      console.log("ee000e", e);
      // 模拟点击
      if (
          Math.abs(e.pageX - this.pos.pageX) <= 10 &&
          Math.abs(e.pageY - this.pos.pageY) <= 10
      ) {
        if (this.clickItem.length > 0) {
          this.clickItem.push(this.curItem);
          this.instance.connect({
            source: this.clickItem[0],
            target: this.clickItem[1]
          });
        } else {
          this.clickItem.push(this.curItem);
        }
      } else {
        this.clickItem = [];
      }
    },
  }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
#container {
  height: 100%;
  background-color: greenyellow;
}
.border {
  width: 120px;
  height: 50px;
  line-height: 50px;
  border-radius: 8px;
  border: 1px dashed black;
  margin: 20px;
}
</style>

实现效果

实现其实很简单,主要看document.addEventListener("mouseup", this.mock); 和 mouseDown方法。

到此这篇关于Vue+jsPlumb实现连线效果(支持滑动连线和点击连线)的文章就介绍到这了,更多相关Vue jsPlumb连线效果内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue+jsPlumb实现连线效果(支持滑动连线和点击连线)

本文链接: https://www.lsjlt.com/news/191782.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue+jsPlumb实现连线效果(支持滑动连线和点击连线)
    目录前言实现前言 最近在做一个互动题板管理项目,主要负责开发互动题板的连线题,由于时间紧凑,一番search之后决定使用jsPlumb来做,本身jsPlumb做的是可以滑动连线的,奈...
    99+
    2023-01-31
    Vue jsPlumb连线效果 Vue 连线 Vue jsPlumb
  • vue+jsplumb实现连线绘图
    vue+jsplumb实现连线绘图,供大家参考,具体内容如下 jsPlumb是一个比较强大的绘图组件,它提供了一种方法,主要用于连接网页上的元素。在现代浏览器中,它使用SVG或者Ca...
    99+
    2024-04-02
  • vue+jsplumb如何实现连线绘图
    小编给大家分享一下vue+jsplumb如何实现连线绘图,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下jsPlumb是一个比较强大的绘图组件,它提供了...
    99+
    2023-06-29
  • vue3.x使用jsplumb实现拖拽连线
    本文实例为大家分享了vue3.x 使用jsplumb实现拖拽连线的具体代码,供大家参考,具体内容如下 如果想在vue2里面使用jsplumb 可以查看 文章,下面讲解如何在vue3....
    99+
    2024-04-02
  • vue3.x如何使用jsplumb实现拖拽连线
    小编给大家分享一下vue3.x如何使用jsplumb实现拖拽连线,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下如果想在vue2里面使用jsplumb ...
    99+
    2023-06-29
  • Java httpClient连接池支持多线程高并发的实现
    当采用HttpClient httpClient = HttpClients.createDefault() 实例化的时候。会导致Address already in use的异常。...
    99+
    2024-04-02
  • JavaScript canvas实现动态点线效果
    本文实例为大家分享了JavaScript canvas实现动态点线效果的具体代码,供大家参考,具体内容如下 效果预览 1.实现效果 画彩色点 相近的点产生连线 ...
    99+
    2024-04-02
  • 如何利用Javascript简单实现星空连线效果
    这篇文章主要讲解了“如何利用Javascript简单实现星空连线效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何利用Javascript简单实现星空连...
    99+
    2024-04-02
  • 怎么在html5中利用canvas实现一个背景鼠标连线动态效果
    本篇文章为大家展示了怎么在html5中利用canvas实现一个背景鼠标连线动态效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。<!doctype html><html&...
    99+
    2023-06-09
  • matplotlib绘制两点间连线的几种方法实现
    目录绘制方法<1>绘制方法<2>使用pyplot绘制图像绘制方法<3>使用axes类绘制图像绘制方法<4>使用figure类绘制图像为...
    99+
    2024-04-02
  • vue中echarts关系图动态增删节点以及连线方式
    目录echarts关系图动态增删节点及连线echarts关系图vue完整代码echarts关系图动态增删节点及连线 首先,echarts的关系图有个非常坑的地方,就是节点的id必须连...
    99+
    2022-11-13
    vue中echarts关系图 echarts动态增删节点 echarts关系图连线
  • Android如何实现直播app送礼物连击动画效果
    这篇文章将为大家详细讲解有关Android如何实现直播app送礼物连击动画效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。最近在做公司的直播项目,需要实现一个观看端连击送礼物的控件:直接上代码:publ...
    99+
    2023-05-31
    android
  • 纯css如何实现流向性和动态线条效果
    这篇“纯css如何实现流向性和动态线条效果”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“纯css如何实现流向性和动态线条效果”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接...
    99+
    2023-06-08
  • vue可视化大屏实现无线滚动列表飞入效果
    目录一、效果如下二、代码如下(因项目是vite与vue3.0、element-plus)一、效果如下 二、代码如下(因项目是vite与vue3.0、element-plus) &l...
    99+
    2024-04-02
  • 如恶化实现Ubuntu通过无线网络安装Ubuntu Server启动系统后连接无线网络
    本篇内容介绍了“如恶化实现Ubuntu通过无线网络安装Ubuntu Server启动系统后连接无线网络”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学...
    99+
    2023-06-13
  • vue可视化大屏怎么实现无线滚动列表飞入效果
    今天小编给大家分享一下vue可视化大屏怎么实现无线滚动列表飞入效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、效果如下...
    99+
    2023-06-30
  • SpringBoot+Netty实现TCP客户端实现接收数据按照16进制解析并存储到Mysql以及Netty断线重连检测与自动重连
    场景 在SpringBoot项目中需要对接三方系统,对接协议是TCP,需实现一个TCP客户端接收 服务端发送的数据并按照16进制进行解析数据,然后对数据进行过滤,将指定类型的数据 通过mybatis存储进mysql数据库中。并且当tcp服务...
    99+
    2023-09-01
    spring boot tcp/ip mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作