【新特性速递】树控件结构由单层 TR 改为 TR-TD-TABLE 层级嵌套
FineUIPro/Mvc/Core的下个版本(v6.1.0),我们对树控件进行了优化,由原来的单层 TR 改为 TR-TD-TABLE 层级嵌套,从而做到表里如一。
上个版本(v6.0.0),我们对树表格(本质上还是表格)进行了重构,由单层TR改为层级嵌套结构,效果不错:https://www.cnblogs.com/sanshi/p/11291478.html
这个版本,类似的手法用于树控件,改为层级嵌套结构有很多好处:
- 表里如一,数据和DOM节点结构一致
- 按层次处理,代码逻辑更清晰(v6.0.0之前的版本为每个节点添加data-nodelevel属性,方便迂回处理层次结构)
- 有助于简化展开折叠代码,特别是CSS3动画更加丝滑
先来直观对比下两者的区别:
FineUIPro v6.0.0:

FineUIPro v6.1.0:

这个改动有助于提升节点展开折叠的CSS3动画效果,是不是很奇怪?没关系,下面听我详细道来...
========================================================
FineUIPro/Mvc/Core v6.0.0中,由于子节点和父节点是平级的,所以在动画开始前,我们需要做一些的改变:
- 计算获得所有需要折叠的子节点
- 新建一个TR-TD-TABLE结构
- 将所有需要折叠的子节点移动到新建的 TR-TD-TABLE
下面给出了 F.js 中相关实现的源代码:
var fakeNode = $('<tr class="f-tree-fakenode"><td><div class="f-tree-fakenode-inner" style="opacity:1;"><table></table></div></td></tr>');
var fakeNodeInner = fakeNode.find('.f-tree-fakenode-inner');
var fakeNodeInnerTable = fakeNodeInner.find('table');
removedTrs.appendTo(fakeNodeInnerTable);
fakeNode.insertAfter(nodeTr);
下图可以看出,在折叠时DOM节点的改变,其中 f-tree-fakenode 是我们新增的 TR-TD-TABLE,用来作为当前节点所有子节点的容器,并执行折叠动画。

当然,这个截图的效果你是不太容易观察的,因为这个动画过程很快(300ms),所以新增的 TR-TD-TABLE 结构一闪而过,随即在折叠完成后给删除了。
不过这个过程需要计算和DOM节点操作,势必对动画效果有影响。
========================================================
新版本中(v6.1.0),由于所有子节点本来就在一个TR-TD-TABLE结构,所以无需上述的复杂操作,CSS3动画效果会更加丝滑。
官网示例已更新:
- FineUIPro:https://pro.fineui.com/
- FineUIMvc:https://mvc.fineui.com/
- FineUICore:https://core.fineui.com/
- FineUICore (Razor Pages & Tag Helpers):https://pages.fineui.com/
- F.js:https://js.fineui.com/
现在加入【三石和他的朋友们】星球,下载FineUIPro/Mvc/Core(基础版):https://fineui.com/fans/
【新特性速递】树控件结构由单层 TR 改为 TR-TD-TABLE 层级嵌套的更多相关文章
- 【新特性速递】CSS3动画增强
FineUIPro/Mvc/Core的下个版本(v6.1.0),我们对多个地方的CSS3动画进行了增强,使得用户体验更好. 1. 树控件启用EnableSingleExpand时,使得展开动画和折叠其 ...
- 【新特性速递】树表格结构由单层 TR 改为 TR-TD-TABLE 层级嵌套!
由于历史原因,在之前实现树表格时,我们有点偷懒,本来应该是层级嵌套的树结构,被我们硬生生的拉平了,请看: 可以看到,basic目录的子节点和basic是在同一级别的,因为此目录尚未展开,所以这些子节点 ...
- ActiveReports 11 新特性速递
又到了一年一度,翘首期盼的ActiveReports11 即将发布,ActiveReports 10 表控件横空出世,成为中国式复杂报表的救星后,ActiveReports11 又会有哪些令人惊奇的新 ...
- 【新特性速递】单元格导航(上下左右键,TAB键和ENTER键)
上下左右按键 其实单元格导航(上下左右按键,需要启用表格的ShowSelectedCell属性)一直都存在,只不过之前的版本(v5.5.0)有一些小的BUG. BUG1 比如锁定列存在时,上下左右键只 ...
- 【新特性速递】F.doPostBack的说明文档
FineUIPro/Mvc/Core的下个版本(v6.1.0),我们对客户端JS函数 F.doPostBack 进行了增强,并增加说明文档. 如果你还没有查阅过FineUI的客户端文档,可以收藏下这个 ...
- FineUIMvc新特性速递(大间距模式,隐藏菜单垂直滚动条)
即将发布的 FineUIMvc 新版本会引入两个重要的特性,用来提升用户体验,现在就来先睹为快吧: 大间距模式 我们已经支持的显示模式有:紧凑模式,普通模式,大字体模式. 紧凑模式: 普通模式: 大字 ...
- 【新特性速递】FineUIPro/Mvc/Core 全新移动端访问体验(示例首页)!
移动端支持 虽然 FineUIPro 早在 2016 年就已经完成对移动端的适配工作,并新增了 50 多个官网示例. 并且,我们也新增了一个移动端的首页 http://pro.fineui.com/m ...
- 【新特性速递】优化Shift/Ctrl行多选逻辑,和Windows的文件资源管理器保持一致!
别告诉我你不知道 别告诉我你不知道可以使用键盘的 Shift 和 Ctrl 来多选表格行,因为这个在 Windows 文件资源管理器中的常用操作,此时的画风是这样的: 这个动图中进行了如下操作: 1. ...
- 使用EasyUI的树控件构建Web界面
最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重 ...
随机推荐
- cd 到目录自动ls
$vim ~/.bashrc 文件末尾加入: cdls() { cd "${1}" ls; } alias cd='cdls' $source ~/.bashrc
- perl: warning: Setting locale failed. 解决
perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAG ...
- STM32 F4xx Fault 异常错误定位指南
STM32 F407 采用 Cortex-M4 的内核,该内核的 Fault 异常可以捕获非法的内存访问和非法的编程行为.Fault异常能够检测到以下几类非法行为: 总线 Fault: 在取址.数据读 ...
- 阿里小哥带你玩转JVM:揭秘try-catch-finally在JVM底层都干了些啥?
让我们准备一个函数: 然后,反编译他的字节码: 首先我们介绍异常表:在编译生成的字节码中,每个方法都附带一个异常表. 异常表中的每一个条目代表一个异常处理器,并且由 from 指针.to 指针 ...
- springMVC校验器(validator)
springmvc使用的是Hibernate Validator(和Hibernate的ORM无关)来完成校验功能 一.普通校验 1.导入jar包 2.编写校验错误配置文件 3.配置校验错误信息文件 ...
- MySQL学习——查询表里的数据
MySQL学习——查询表里的数据 摘要:本文主要学习了使用DQL语句查询表里数据的方法. 数据查询 语法 select [distinct] 列1 [as '别名1'], ..., 列n [as '别 ...
- PHP面试题2019年小米工程师面试题及答案解析
一.单选题(共29题,每题5分) 1.PHP面向对象方法重写描述错误的是? A.子类必须继承父类 B.子类可以重写父类已有方法 C.重写之后子类会调用父类方法 D.子类也可以具有与父类同名的属性,进行 ...
- java核心技术第一篇之数据库基础
01.数据库的概念: 1).数据库的概念:数据库(Database),就是存储数据的仓库. 2).作用:用来存储和管理大量数据的.内部采用了非常便于查询的机制来存储数据,能保证我们在大量数据的情况下 ...
- SpringBoot(二):SpringBoot 热部署
1.配置pom: <dependency> <groupId>org.springframework.boot</groupId> <artifactId&g ...
- JS基础语法---循环语句之:for 循环 + 9个练习
for循环 语法: for(表达式1;表达式2;表达式3){ 循环体; } 执行过程: 先执行一次表达式1,然后判断表达式2;如果不成立则直接跳出循环 如果表达式2成立,执行循环体的代码,结束后,跳到 ...