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

简介: 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…



目录
相关文章
|
前端开发 数据可视化 JavaScript
可视化大屏的几种屏幕适配方案,总有一种是你需要的
假设我们正在开发一个可视化拖拽的搭建平台,可以拖拽生成工作台或可视化大屏,或者直接就是开发一个大屏,首先必须要考虑的一个问题就是页面如何适应屏幕,因为我们在搭建或开发时一般都会基于一个固定的宽高,但是实际的屏幕可能大小不一,接下来我们就尝试几种简单且常见的方案,并简单分析一下利弊。
698 0
|
存储 移动开发 前端开发
基于WebGL的在线3D建模与互动脚本开发系统 ThingJS
ThingJS编辑界面布局 3D建模与场景搭建方法 交互控制脚本开发关键点
基于WebGL的在线3D建模与互动脚本开发系统 ThingJS
|
2月前
|
数据可视化 搜索推荐 定位技术
三维地图万能子组件玩法全流程!拓展业务表达边界(附免费试用)
为了满足用户日益增长的个性化和定制化需求,我们推出了地图✖️万能子组件,支持自定义拼接地图组件内容,包括图表、标题等,打造超级信息面板。该组件可灵活展示地理信息业务数据,丰富可视化形式。此外,提供7天高级版免费试用、个人免费版永久使用等福利,并附有详细教程视频,帮助用户轻松配置和优化组件效果。
|
算法 数据可视化 搜索推荐
如何从0到1搭建图编辑器,打造沉浸编排体验?
如何从0到1搭建图编辑器,打造沉浸编排体验?
207 0
|
存储 JSON 移动开发
逻辑编排在优酷可视化搭建中的实践(三) - 元件与平台
前一篇文章里讲解了逻辑与Runtime&DSL,也提到了逻辑编排三板斧:元件 + 编排器 + Runtime,我在本篇将主要聊一聊元件设计以及YOHO的平台化。
501 1
逻辑编排在优酷可视化搭建中的实践(三) - 元件与平台
|
8月前
|
UED
带您一步步构建一个具有复杂布局的电商详情页,涵盖页面结构规划、样式设计以及交互效果的实现
【6月更文挑战第14天】构建复杂布局的电商详情页涉及页面结构规划、样式设计和交互效果实现。首先,规划页面结构,包括顶部导航栏、商品图片展示区、商品信息区、用户评价区和相关商品推荐区。接着,进行样式设计,注重色彩搭配、字体选择、布局与间距以及图片处理。例如,使用固定顶部导航栏,轮播图展示商品图片,分块展示商品信息和评价,以及设计相关商品推荐区。最后,实现交互效果,如图片放大、添加到购物车按钮、滚动监听和评论互动,提升用户体验。实际开发时需根据需求和规范进行调整,保证跨设备兼容性。
156 1
|
7月前
|
数据可视化 前端开发 开发者
花样玩转“所见即所得”的可视化开发UI
【7月更文挑战第12天】WYSIWYG)的可视化开发UI带来的便利与创新: 降低开发门槛: 即使无编程基础也能通过直观操作快速构建界面。 提高开发效率: 实时预览减少代码与预览间的频繁切换。 促进团队协作: 设计师与开发者可在同一界面交流修改。 增加创意实现: 自由尝试布局、颜色与交互方式以验证想法。 此类工具(如Adobe XD、Figma、Sketch等)正变革软件开发方式,带来更高效、具创意及易操作的体验。
122 3
|
6月前
|
开发框架 API 开发者
Flutter表单控件深度解析:从基本构建到高级自定义,全方位打造既美观又实用的移动端数据输入体验,让应用交互更上一层楼
【8月更文挑战第31天】在构建美观且功能强大的移动应用时,表单是不可或缺的部分。Flutter 作为热门的跨平台开发框架,提供了丰富的表单控件和 API,使开发者能轻松创建高质量表单。本文通过问题解答形式,深入解读 Flutter 表单控件,并通过具体示例代码展示如何构建优秀的移动应用表单。涵盖创建基本表单、处理表单提交、自定义控件样式、焦点管理和异步验证等内容,适合各水平开发者学习和参考。
157 0
|
存储 JSON 运维
基于WebGL的3D可视化告警系统关键技术解析 ThingJS
1. WebGL 3D技术 2. 新一代3D框架-ThingJS 3. 3D可视化告警系统案例 4. 基于ThingJS的通用架构设计

热门文章

最新文章