@antv/x6 自定义节点Safari兼容问题处理

news2024/12/23 16:00:41

背景

  1. 为什么选择@antv/x6?
    由于x6提供了一套强大友好的流程图API,并且支持使用 React、Vue 组件来渲染节点。这样可以使用组件开发的方式去快速完成卡片开发,并实现更加复杂的业务逻辑。
  2. 遇到了Safari的兼容问题
    由于x6自定义节点基于SVG foreignObject节点去实现的,但是Safari对foreignObject的实现不够完整,这就出现了在safari上出现了无法设置节点的位置,有些内容展示不出来的问题。
    以下是x6官网上Vue使用案例在Chrome和Safari上的展示对比:
    Chrome 效果
    在这里插入图片描述
    Safari 效果
    在这里插入图片描述
    卡片跑到了左上角位置,设置的卡片位置完成无效了

参考:

Safari上SVG foreignObject中<video>元素的位置错误

解决Safari浏览器使用SVG foreignObject 不生效,错位的问题

解决方式

一开始想的是有没有对应的polyfill去解决foreignObject的兼容问题,但是没有找到。后面发现了x6-html-shape这个库,采用了html节点的方式,避开了foreignObject。

x6-html-shape原理解析

  1. 节点绘制
    x6-html-shape通过创建一个html容器节点覆盖在svg画布的上层,使用绝对定位+transform将自定义节点绘制到这个html容器内,在每个节点的下层会对应相关的svg空节点。这样避免了使用Svg foreignObject的方式。
    在这里插入图片描述在这里插入图片描述
  2. 事件处理
    对于画布上的事件通过添加pointer-events:none样式,使事件透传。卡片上事件通过监听直接转发到下层的svg节点。核心代码如下:
Dom.css(htmlContainer, {
    position: "absolute",
    width: "100%",
    height: "100%",
    "touch-action": "none",
    "user-select": "none",
    "pointer-events": "none",
    'z-index': 0,
    'transform-origin': 'left top',
});
htmlContainer.classList.add("x6-html-shape-container");
Dom.css(container, {
    "pointer-events": "auto",
    "touch-action": "none",
    "user-select": "none",
    "transform-origin": "center",
    position: "absolute",
})
container.classList.add("x6-html-shape-node");
      // forward events
const events = "click,dblclick,contextmenu,mousedown,mousemove,mouseup,mouseover,mouseout,mouseenter,mouseleave".split(",");
events.forEach((eventType) =>
    forwardEvent(eventType, container, this.container)
);
this.graph.htmlContainer.append(container);

container 就是自定义的卡片容器,卡片内容将放在里面, this.container能获取到对应的svg节点。这里container的pointer-events设置成了auto保证了卡片上的事件能正常触发。

export function forwardEvent(eventType, fromElement, toElement) {
  fromElement.addEventListener(eventType, function (event) {
    toElement.dispatchEvent(new event.constructor(event.type, event));
    event.preventDefault();
    event.stopPropagation();
  });
}

通过调用forwardEvent将自定义卡片上的事件转发到svg节点上。

使用中的问题

可能由于这个库,使用的人并不多,很多问题没有被发现,我在实际使用的时候也遇到了以下的问题:

  1. 缩放后节点错位,节点并没有合理缩放
  2. 卡片上不能滚动问题
  3. 节点删除后,下层对应的svg节点未删除
  4. 无法显示或隐藏节点问题
  5. 节点较多时缩放失效问题
  6. 卡片上点击功能按钮el-popover不展示问题(开发卡片时阻止按钮的事件冒泡行为即可)
    由于原作者精力有限,忙于其他事情。我就自己主动提交了PR,参与到了这个项目的贡献。后续作者也给开通了github代码提交权限和npm包的发布权限,以上问题都得到了解决。

总结

总体来说,x6-html-shape很好的解决了x6使用SVG foreignObject绘制自定义节点在Safari上的兼容问题。这个库的解决思路非常不错,希望能帮助到更多的人。当然如果Safari能把foreignObject的功能给完善一下就更好了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Milvus向量数据库-数据备份与恢复

前言 随着Milvus版本的持续迭代&#xff0c;越来越多的用户将其作为构建生产环境的向量数据服务使用。作为数据服务使用&#xff0c;其中的运维、数据安全、容灾备份自然是用户最关心且不容有失的需求。为解决这一需求&#xff0c;Milvus-backup项目工具应运而生。 Milvus-ba…

docker实战演练

一.docker简介 二.docker部署 1.解压并安装所需要的软件 [rootdocker-node1 ~]# ls anaconda-ks.cfg docker.tar.gz mario.tar.gz busybox-latest.tar.gz game2048.tar.gz nginx-latest.tar.gz [rootdocker-node1 ~]# tar zxf docker.tar.gz [rootdocker-node1 …

cad转换dxf怎么转换?学会这5种方法轻松解决cad难题

在CAD领域中&#xff0c;DXF格式因其良好的兼容性和广泛的应用&#xff0c;成为了许多设计师和工程师的首选交换格式。然而&#xff0c;CAD文件很多默认的都是dwg格式&#xff0c;那么如何将CAD文件转换为DXF格式&#xff0c;很多小伙伴不是很清楚&#xff0c;下面给大家分享5种…

想学gis开发,java和c++哪个比较好?

java与C的应用场景不同&#xff0c;究竟选择谁&#xff0c;应该由开发者的兴趣方向来决定。 你选择Java&#xff0c;意味着以后的业务方向就是偏后台服务开发&#xff0c;如果你非得说我用java也可以写界面&#xff0c;对不起&#xff0c;别人不会。不管是从项目还是产品的角度…

Element-plus组件库基础组件使用

文章目录 按钮图标输入框表格表单对话框文件上传布局容器ElMessage消息提示MessageBox 消息提示框Pagination分页样式表单校验 记录vue3项目使用element-Plus&#xff0c;开发中常用的一些样式 下面这些组件是写增删改查是经常用到的&#xff0c;学习了这个写增删改查会好很多。…

DBpedia——利用维基百科信源构造语义知识库

1. 简介 DBpedia 从维基百科(Wikipedia)的词条里撷取出结构化的信息&#xff0c;以强化维基百科的搜寻功能&#xff0c;同时还提供复杂信息的检索功能&#xff0c;并将其他资料集连结至维基百科。通过这样的语义化技术的介入&#xff0c;让维基百科的庞杂资讯有了许多创新而有趣…

iview checkbox单独使用时 如何去掉显示的true和false以及不显示文字

如图所有 当在表格显示中想单独使用checkbox的时候&#xff0c;只想显示勾选 不显示文字这样写&#xff0c;分别用2个参数true/false来显示勾选和不勾选&#xff0c;再在外层用参数控制就好啦&#xff0c;是不是很简单呢&#xff01;

各行各业的都有的文档推荐

如果你在寻找一个丰富多样、几乎能满足任何阅读需求的电子书下载的地方&#xff0c;不妨考虑“literalink.top”网站。它不仅涵盖了广泛的书籍种类&#xff0c;从经典文学到最新畅销书应有尽有&#xff0c;还提供了多本不同版本和译本的选择&#xff0c;超越了许多其他网站的资…

GaussDB 24.1.30 分布式3节点命令行方式部署

目录 GaussDB介绍 服务器环境 安装前准备 配置会话不中断 操作系统配置 关闭防火墙并禁止开机启动 设置时区和时间 检查时区和时间 java版本 expect root密码一致 root用户ssh连通性 上传软件包和安装脚本 安装脚本配置 修改 install_cluster.json 配置文件 安装…

2024最新最全面的JMeter 做接口加密测试

JMeter 怎么做接口的加密&#xff1f; JMeter如果需要做加密测试&#xff0c;是需要加密类型对应的jar包的。本文以MD5,加密作为教程。 1、在Test Plan 引用jar包&#xff1b; 2、添加BeanShell Sampler取样器&#xff0c;并输入调用代码 import md5.mymd5;//调用jar包 String…

使用kafka完成数据的实时同步,同步到es中。(使用kafka实现自动上下架 upper、lower)

文章目录 1、发送消息 KafkaService2、生产者 service-album -> AlbumInfoServiceImpl2.1、新增 saveAlbumInfo()2.2、更新 updateAlbumInfo()2.3、删除 removeAlbumInfo() 3、消费者 service-search - > AlbumListener.java 上架&#xff1a;新增专辑到 es下架&#xff…

信息学奥赛初赛天天练-78-NOIP2015普及组-基础题3-中断、计算机病毒、文件传输协议FTP、线性表、链式存储、栈

NOIP 2015 普及组 基础题3 8 所谓的“中断”是指( ) A 操作系统随意停止一个程序的运行 B 当出现需要时&#xff0c;CPU 暂时停止当前程序的执行转而执行处理新情况的过程 C 因停机而停止一个程序的运行 D 电脑死机 9 计算机病毒是( ) A 通过计算机传播的危害人体健康的一种病…

有什么还原空白试卷的免费软件?2024快速进行空白还原的软件

有什么还原空白试卷的免费软件&#xff1f;2024快速进行空白还原的软件 还原空白试卷通常是指将已经填写的试卷还原为未填写的空白版本&#xff0c;以便重复使用或进行其他用途。以下是五款可以帮助你快速还原空白试卷的免费软件&#xff0c;这些工具提供了不同的功能&#xf…

补录.day43动态规划

300.最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序…

【RNN】循环神经网络RNN学习笔记

时间序列任务场景&#xff1a; 语音识别生成一段音乐情感分析DNA序列分析机器翻译 如何理解时间序列&#xff1a;特点&#xff1a;前后关联强&#xff0c;前因后果&#xff0c;后面产生的结果依赖于之前的结果 标准神经网络建模的弊端&#xff1a; 输入和输出在不同例子中可…

MosaicML-面向生成式AI的机器学习平台

前段时间&#xff0c;大数据巨头 Databricks 宣布已签署最终协议&#xff0c;将以13亿美元的价格&#xff0c;收购位于旧金山的人工智能初创公司MosaicML 。这篇文章来自 MosaicML官方的技术博客&#xff0c;是对 MosaicML 大模型训练平台的一个简单介绍。 AIGC领域最大收购&am…

三防平板:定制化服务的趋势——以智慧医疗为例

随着科技的飞速发展&#xff0c;三防平板产品凭借其坚固耐用、适应复杂环境的特性&#xff0c;在众多行业领域中崭露头角。而在AI迅速增长的今天&#xff0c;AI智慧医疗成为了一个备受关注的热点&#xff0c;它不仅推动了医疗行业的数字化转型&#xff0c;也为三防平板产品的定…

OS向量测试方法-PPMU

1.OS向量测试方法 详细步骤&#xff1a; 检查工作&#xff1a; ①检查每根pin连接到指定的PPMU资源是否正确 ②继电器资源是否一一对应 代码编写步骤: 1、 ①设计者设计的测试电路继电器重置初始化 ②close应该闭合的继电器 2、 ①DPS pin电压置0V&#xff0c;同时考虑电流量…

1500万“黑悟空”,打醒一线大厂了吗?

《黑神话&#xff1a;悟空》“霸占”热搜以来&#xff0c;几乎每天都在创造新纪录。 近日&#xff0c;有机构称全平台已售1500万份&#xff0c;仅以268标准版计算&#xff0c;已然拿下40亿元人民币收入&#xff0c;这下10万天兵天将&#xff0c;每人要打150只猴子了。 发售之…

私有云仓库Harbor,docker-compose容器编排

一、私有云仓库 1.pip工具 是python的包管理工具&#xff0c;和yum对rehat的关系是一样的 pip install --upgrade pip 升级版本&#xff0c;会报错&#xff0c;需要指定源 pip install --upgrade pip20.3 -i https://mirrors.aliyun.com/pypi/simple pip …