基于自然流布局的可视化拖拽搭建平台设计方案

简介: LowCode 是高效、高性能的拖拽式低代码开发平台. 也是笔者最近一直在研究的方向, 对于可视化搭建平台的实现方案笔者之前写过很多文章, 这里带大家探索一个新方向——基于自然流布局的可视化搭建平台.

网络异常,图片无法展示
|


LowCode 是高效、高性能的拖拽式低代码开发平台. 也是笔者最近一直在研究的方向, 对于可视化搭建平台的实现方案笔者之前写过很多文章, 这里带大家探索一个新方向——基于自然流布局的可视化搭建平台.


在我们之前实现的 h5-dooring 搭建平台中, 我们采用了网格布局的方式来实现拖拽生成H5页面或者Web app, 其好处就是灵活简单, 用户基本没有任何使用成本, 在前端层也能做一定的横向扩展, 但是存在几个缺陷:


  • 实现嵌套组件比较复杂
  • 没有层的概念


虽然通过改造可以实现层和嵌套的问题, 最近也在努力往这个方向实现(虽然和设计初衷相驳, dooring的初衷是抹去层和嵌套的概念, 让搭建扁平化和智能化, 所以没有采用自由布局的方案)

网络异常,图片无法展示
|


但是如果一定要实现嵌套和层的功能, 有没有另一种更简单的方案呢? 笔者目前想到了两种解决方案:


  • 将智能布局改为自由布局, 即可以采用类似 react-resizable 的这种方案
  • 基于自然流来实现, 也就是抹去定位的概念, 完全基于元素在文档的顺序, 层级和定位的选择权交给用户


因为第一种方案笔者在dooring的早期已经实现过一版, 最后弃用采用了网格布局, 所以说我们来探讨一下第二种方案的实现.


基于自然流布局实现拖拽生成页面



自然流布局的好处就是我们不用通过定位的方式来限定元素的位置等信息, 而是以html文档流的方式来布局元素, 并且用户可以灵活的设置元素的层级(layer)和偏移(transform), 接下来我们来看看简单的实现效果.


1. demo效果


网络异常,图片无法展示
|


网络异常,图片无法展示
|


由上图的demo我们可以发现组件在画布中的布局完全是默认的文档流的方式, 所以我们有更灵活的布局实现.


2. 实现思路


具体实现思路主要分以下几个部分:


  • 组件区拖拽至画布
  • 画布区拖拽
  • 组件编辑器和更新机制


第一点和第三点我们在 H5-dooring中已经实现了, 感兴趣的可以看我之前的文章, 我们这里重点来实现画布区拖拽, 也是比较核心的环节.


2.1 H5拖放api基本介绍


拖放(Dragdrop)是 HTML5 标准的组成部分, 早已被大多数浏览器支持. 我们目前使用的拖放插件基本上基于 H5 拖放 API 来实现的, 其实实现第一点组件区拖拽至画布我们完全可以用原生来实现, 这里笔者简单来介绍以下.


首先我们来看看一个完整的拖放过程:


  1. 首先要设置一个元素可拖放(比如)


  1. 设计拖动的时候会发生什么(需要用到ondragstart事件 和 setData(你要传递的数据))


  1. 放到何处,也就是目标容器(通常在目标容器上绑定ondragoverondrop事件)

有了以上3个步骤, 我们就能实现第一点的需求, 笔者写个简单demo来给大家参考一下:

<scripttype="text/javascript">functionallowDrop(ev) {
ev.preventDefault();
  }
functiondrag(ev){
ev.dataTransfer.setData("Text",ev.target.id);
  }
functiondrop(ev){
ev.preventDefault();
letdata=ev.dataTransfer.getData("Text");
ev.target.appendChild(document.getElementById(data));
  }
</script><divid="box"ondrop="drop(event)"ondragover="allowDrop(event)"></div><imgid="drag"src="dooring.png"draggable="true"ondragstart="drag(event)"width="336"height="69"/>

也就是对应的我们的组件拖放区域, 如下图所示:


网络异常,图片无法展示
|



2.2 画布区拖拽布局实现


因为之前的版本我们采用了网格布局来实现智能拖拽, 由于内部定位机制采用的是绝对定位(absolute), 所以是实现层级和固定组件比较困难, 如果组件的呈现完全脱离了定位的束缚, 我们就可以实现以上的困境了. 所以这里我们调研了一种方案——拖拽排序机制.

自然流布局的规律就是默认情况下html页面是基于dom出现的顺序来排列的, 也就是我们说的堆叠.


网络异常,图片无法展示
|


我们可以遵循这样的设计, 通过排序的方式改变组件的位置从而实现自然流布局的页面搭建.


那么我们再回到上面说的布局问题, 比如说要想实现栅格化布局, 我们只需要定义一个flex容器, 将组件拖拽到容器里就好了, 这样也就解决了嵌套的问题.  同时我们还可以设计嵌套容器的栅格数, 这样就可以实现类似如下的效果:


网络异常,图片无法展示
|


拖拽排序的库我们可以使用:


  • sortable
  • Vue.Draggable
  • react-dnd


还有很多优秀的库, 这里就不一一举例了.


3. 如何实现层级和嵌套


其实在上面的实现思路中我们已经解决了嵌套的问题了, 即提供拖放的容器组件, 利用笔者在上文中介绍的拖放api即可实现. 对于组件层级来说, 因为我们采用的是自然流布局, 所以我们可以轻松的设置元素的定位属性, 比如我们提供一个定位的设置:


网络异常,图片无法展示
|


关于如何设计一个动态的属性编辑器, 笔者之前文章中也就详细的介绍, 大家可以参考:


以上就是自然流布局的基本实现方式, 后续笔者也会在github上同步我们最新的成果.

H5-Dooring编辑器wiki: github.com/MrXujiang/h…



目录
相关文章
|
文字识别 前端开发
CodeFuse-VLM 开源,支持多模态多任务预训练/微调
随着huggingface开源社区的不断更新,会有更多的vision encoder 和 LLM 底座发布,这些vision encoder 和 LLM底座都有各自的强项,例如 code-llama 适合生成代码类任务,但是不适合生成中文类的任务,因此用户常常需要根据vision encoder和LLM的特长来搭建自己的多模态大语言模型。针对多模态大语言模型种类繁多的落地场景,我们搭建了CodeFuse-VLM 框架,支持多种视觉模型和语言大模型,使得MFT-VLM可以适应不同种类的任务。
1355 0
|
2月前
|
人工智能 监控 安全
让Agent系统更聪明之前,先让它能被信任
当我们将所有希望寄托于大模型的「智能」时,却忘记了智能的不确定性必须以工程的确定性为支撑。一个无法复现、无法调试、无法观测的智能,更像是一场精彩但失控的魔法,而非我们真正需要的、可靠的生产力。本文尝试从系统工程的视角剖析 Agent 系统在可运行、可复现与可进化三个层次上不断升级的问题以及复杂度。进一步认识到:框架/平台让 Agent 「好搭」但没有让它「好用」,真正的复杂性,从未被消除,只是被推迟。
374 33
让Agent系统更聪明之前,先让它能被信任
|
4月前
|
运维 网络协议 Linux
CentOS下Bind服务的安装与故障排查
通过以上的步骤,您应该能够在CentOS系统上安装并配置BIND DNS服务,并进行基本的故障排查。
405 0
|
机器学习/深度学习 自然语言处理 算法
命名实体消歧
8月更文挑战第23天
|
存储 缓存 JavaScript
|
存储 算法 NoSQL
(七)漫谈分布式之一致性算法下篇:一文从根上儿理解大名鼎鼎的Raft共识算法!
Raft通过一致性检查,能在一定程度上保证集群的一致性,但无法保证所有情况下的一致性,毕竟分布式系统各种故障层出不穷,如何在有可能发生各类故障的分布式系统保证集群一致性,这才是Raft等一致性算法要真正解决的问题。
344 11
|
消息中间件 安全 Java
Java中的异步编程方案总结
Java中的异步编程是一种能够提高程序性能和响应速度的技术。它通过将耗时的操作放在单独的线程中,让主线程继续执行其他任务,从而实现并发处理和异步执行。在Java中,异步编程常用的方式有多线程、Future和CompletableFuture等。在实际应用中,异步编程可以优化网络请求、数据库操作等IO密集型任务的性能,提高程序的响应速度和吞吐量。虽然异步编程可以带来许多好处,但同时也涉及到一些问题,比如线程安全、回调地狱等。因此,在使用异步编程时需要注意合理地设计和管理线程,确保程序的正确性和可维护性。
905 1
Java中的异步编程方案总结
|
数据采集 安全 搜索推荐
什么是谷歌独立站?
答案是:谷歌独立站就是利用Wordpress或者Shopify做的个人网站。 谷歌独立站的特点 内容为王 一个成功的谷歌独立站始终注重内容的质量和原创性。 高质量的内容能够吸引更多的用户,同时也更容易获得其他网站的链接,从而提高在Google搜索结果中的排名。 结构清晰 谷歌独立站的结构通常非常清晰,每个页面都有明确的目的,易于导航。 这不仅有助于提供良好的用户体验,也使谷歌的爬虫更容易抓取和索引网站内容。
1872 1
什么是谷歌独立站?
|
机器学习/深度学习 人工智能 自然语言处理
深度强化学习发展概要
强化学习(Reinforcement Learning)是智能体与环境之间进行交互,并将状态映射到动作以获得奖励,实现最优策略的学习机制。与监督学习相比,强化学习不需要样本集,也不需要进行人工标注,而是通过不断尝试来发现不同动作产生的正向或负向的反馈,来指导策略的学习。与无监督式学习相比,强化学习不只是探索事物的特征进行模式识别,而且通过与环境交互建立输入与输出之间的映射关系,目标是得到最优策略。
1022 1
深度强化学习发展概要
|
SQL 存储 关系型数据库
mysql 利用 performance_schema 排查 qps 过高过程记录
mysql 利用 performance_schema 排查 qps 过高过程记录
635 0