本篇主要记录流程图的实现过程中的难点和核心技术点,先上效果图:

节点可以任意拖拽,曲线跟随变化

正在连接的线

1、节点实现

流程图是基于SVG绘制的,节点主要利用 gforeignObject 的特性来实现:

   <g  class="pane-node">
<foreignObject width="180" height="50">
<body xmlns="http://www.w3.org/1999/xhtml">
<div class="pane-node-content">
<span class="iconfont icon-datas"></span>
<span class="name" :title="item.name">{{item.name}}</span>
<!-- 节点进 -->
<div class="pane-port-list in">
......
</div>
<!-- 节点出 -->
<div class="pane-port-list out">
......
</div>
</div>
</body>
</foreignObject>
</g>
  • g元素:特性是可以包裹元素,并进行位置变化,这样拖拽的时候获取对应的坐标改变 transform 的值就可以整体移动了;
  • foreignObject标签:借助<foreignObject>标签,可以直接在SVG内部嵌入XHTML元素,尤其一些需要css进行控制的样式类,但是这个兼容性较差,主要是IE浏览器。

2、曲线的绘制

核心代码:

   <g class="pane-link">
<path class="connector-wrap" :d="`M ${pos.startS} Q ${pos.curveS} T ${pos.endS}`"></path>
<path
class="target-marker"
d="M 5 0 L 0 3.6327126400268037 L 5 7.265425280053607 Z"
:transform="`translate(${item.endPosX - 4},${item.endPosY + 4}) scale(1,1) rotate(-90)`"
></path>
</g>

这里使用的是svg中的path中的M Q T

  • Mmoveto 这里是初始节点的底部连接点
  • Q quadratic Bézier curve 二次贝塞尔曲线

    【截图源于网络】
  • Tsmooth quadratic Bézier curveto 二次贝塞尔曲线平滑延伸

    【截图源于网络】

这里的T指的是通过一个控制点推断出一个新的控制点,T前面必须是一个Q命令或者是另一个T命令

由此可见,只要确认三个点(起点,控制点,终点),就可以绘制出平滑好看的曲线啦~

/**
* startPosX 起节点的左上角x
* endPosX 终节点的左上角x
* sizeX 节点的一半宽度 sizeY 是节点的高度
/
// 起始点
let startS = `${startPosX + sizeX} ${startPosY + sizeY}`; // 二次贝尔曲线
let curveS = `${startPosX + sizeX} ${startPosY + sizeY + 40} ${
this.endNode
? (startPosX + endPosX+ 2 * sizeX) / 2
: (startPosX + endPosX+ sizeX) / 2
} ${(startPosY + endPosY + 20) / 2}`; // 终点
let endS = `${this.endNode ? endPosX + sizeX : endPosX} ${endPosY}`;

至于节点的拖拽就比较简单了,点击移动的时候获取位置信息更transformtranslate属性即可。

使用SVG绘制流程图的更多相关文章

  1. 使用SVG绘制湖南地图

    项目中有需求使用SVG绘制湖南地图,现把自己制作过程写一下供大家参考. 1.首先准备一张湖南地图(仅有各市边界线即可).(图片最好是PNG的,除了地图其它什么也没有) 2.准备SVG编辑工具SVGDe ...

  2. SVG Drawing Animation - SVG 绘制动画

    一个小实验,探索 SVG 线图动画的使用情况,以前沿的展示形式呈现图形或网站元素的外观,模拟它们的加载.SVG 真的很强大,有许多创造性和可能性,使用 SVG 可以制作各种有趣的网站交互效果.今天这篇 ...

  3. html 5新特性 --用SVG绘制的微信logo

    一个简单的SVG绘制图片的小案例. 效果图: 代码如下: <style> * { ; ; } body { background-color: #d5d3d4; } .container ...

  4. SVG绘制圆形简单示例分享

    今天分享“svg绘制圆形”部分 1.简单圆形 效果图如下: 关键代码: <svg xmlns="http://www.w3.org/2000/svg" version=&qu ...

  5. 18个超有趣的SVG绘制动画赏析

    SVG作为时下比较新颖的技术标准,已经建立了很多基于SVG的前端项目.由于SVG在绘制路径上非常灵活,我们将很多网页上的元素使用SVG来绘制而成,有各种人物.小图标.小动画等等.今天我们收集了18个非 ...

  6. svg绘制一个简单地饼图

    一个简单地svg绘制饼图的demo,代码如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...

  7. 程序猿必备的10款超有趣的SVG绘制动画赏析

    SVG作为时下比较新颖的技术标准,已经建立了很多基于SVG的前端项目.由于SVG在绘制路径上非常灵活,我们将很多网页上的元素使用SVG来绘制而成,有各种人物.小图标.小动画等等.今天我们收集了10个非 ...

  8. SVG绘制图形

    一.SVG介绍 1.SVG指可伸缩矢量图片 2.SVG用来定义用于网络的基于矢量的图形 3.SVG使用XML格式定义图形 4.SVG图像在放大或改变尺寸的情况下其图形质量不会有损失 5.SVG是万维网 ...

  9. 划词标注1——使用svg绘制换行文本并自动识别库中字典数据

    业务需求 给出一段文本,自动识别出文本中包含的关键字信息,关键字是库里已知的数据,根据类型的不同显示出不同的颜色 业务分析 1)采用css:文本识别出来后,根据识别出的文本更改对应文本的dom,通过更 ...

随机推荐

  1. [黑科技]跑的比fread还快的cin挂和cout挂

    CCPC赛后摸鱼搞了个新的奇怪外挂 这里贴上利用sgetn和sputn来实现的读入读出挂,理论上比fread更优 期望在赛中TLE的代码能强行卡过去hhh 利用小规模的Codeforces - 103 ...

  2. [Xamarin.Android]如何引用JAR檔案 (转帖)

    這個範例是如何在Xamarin.Android中去使用一個我們自行在開發的JAR檔案. 主要會執行的步驟如下 1. 在Xamarin建立一個Android Java Bindings Library ...

  3. SASS的安装和转换为CSS的方法

    http://www.cnblogs.com/52css/archive/2012/08/19/sass-how-to-install-and-use.html SASS的安装方法: 1.先安装Rub ...

  4. 05 synchronized

    转载自:  Java并发编程:synchronized http://www.cnblogs.com/dolphin0520/p/3923737.html 前文中也有相关的详细描述:02 如何创建线程 ...

  5. 第七章、Linux 文件与目录管理

    第七章.Linux 文件与目录管理   1. 目录与路径 1.1 相对路径与绝对路径 1.2 目录的相关操作: cd, pwd, mkdir, rmdir 1.3 关於运行档路径的变量: $PATH ...

  6. SQL常用性能相关脚本

    --调试语句性能前记得清空执行计划 每次执行需优化SQL前,带上清除缓存的设置SQL. 平常在进行SQL Server性能优化时,为了确保真实还原性能问题,我们需要关闭SQL Server自身的执行计 ...

  7. 【c++】字符串流输出恢复状态问题

    缘起 #include <iostream> #include <sstream> using namespace std; int main() { istringstrea ...

  8. Package.json中dependencies依赖包中^符号和~符号前缀的区别

    刚git了webpack的包发现package.json里面dependencies依赖包的版本号前面的符号有两种,一种是~,一种是^,如下图标记: 然后搜了下在stackoverflow上找到一个比 ...

  9. 微信WeUI入门2

    引入需要的样式文件 最重要的css文件为 weui.min.css 基本的框架如下: <!DOCTYPE html> <html lang="zh-CN"> ...

  10. 打印插件--PAZU

    PAZU对打印控制实现了: 2.1 设置页眉页脚 2.2 指定纸张大小 2.3 设置纸张方向 2.4 设置页边距 2.5 选择指定的打印机 2.6 无需用户确认,JS直接调用打印预览 2.7 无需用户 ...