我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。

本文作者:修能

What's?

数栈产品里的 Descriptions 组件实际上就是 antd 的 Descriptions 组件,那么 antd 的 Descriptions 组件是什么?

在数栈产品中,我们通常使用的方式是 bordered + small 的模式。

即:

<Descriptions bordered size="small">
<Descriptions.Item label="任务名称">
{taskName}
</Descriptions.Item>
<Descriptions.Item label="指标表名称">
{tableName}
</Descriptions.Item>
</Descriptions>

展示如下:

平平无奇,甚至非常普通。但,这里面暗藏玄机。

Why?

我们要实现一行只有一个 Item 的设计方式。这里我们可以借助 Descriptions 组件的 column API 实现。

 - <Descriptions bordered size="small">
+ <Descriptions bordered size="small" column={1}>

此时,一位靓仔发出疑惑:“怎么就这么宽了?”

那么,直接根据设计稿的尺寸给设置宽度吧

contentStyle={{
width: 630,
}}
labelStyle={{
width: 140,
}}

可以?不可以!由于我们这个模块是在详情的抽屉里,抽屉的宽度是不固定的,那么这里设置固定值会导致有问题!……有问题吧?

这里的 label 宽度并没有按照所设置的来,而是自适应的撑满了。

但是,都是自适应,这里的自适应并不是我们想要的,根据 UI 设计师的确认,这里的自适应应该是 label 的大小不变,content 的大小自适应。


怎么实现?

设置 contentStyle 的 width 为 'calc(100% - 140px)'

---

看起来,这个需求搞定了?实际上,还有问题!

这里,我们需要模拟一下任务名称很长并且用 Button 组件的情况。

这里,我们想到,可以用 EllipsisText 组件解决溢出省略的问题。

糟糕,貌似并没有生效,这是为何?


分析原因如下:

这里我们一下原因,首先,我们这里的省略逻辑是如下

  1. 通过设置 maxWidth 为百分比(不能设置具体数值,为何?),然后配合 overflow

我们从 DOM 树上可以看出来,理论上,我们应该是 td 元素的宽度百分比,同时 td 元素设置的宽度也是百分比,所以理论上是 tr 元素的百分比。


这里我们发现,tr 元素的宽度并没有按照我们设想的是继承父元素的宽度,而是被子元素撑开了。那么,我们尝试在 tr 上增加 width:100% 使其宽度为继承父元素的宽度。

还是无效,这是为何?


我们这里注意到,width 是需要继承父元素的宽度,而父元素的宽度也是被撑开的。这里我们省略一些定位的过程,快进到定位 table 元素。

这个 Descriptions 组件的根元素是 table 元素。table 元素相比起普通的 div 元素来说,更加复杂,其相关的 CSS 属性更加难以捉摸。


观察到,这里的 table 组件上有如下属性

table 的宽度被设置了 100%,但是并没有继承父元素的宽度,而是被子元素撑开了。

这里我们注意到 table 有一条属性为 table-layout,在 MDN 中该属性的定义为:

table-layout CSS 属性定义了用于布局表格的单元格、行和列的算法。

如果设置为 auto,则表示

默认情况下,大多数浏览器使用自动表格布局算法。表格及其单元格的宽度会根据内容自动调整大小。


到这里就破案了,如果设置为了 auto,则单元格会根据内容自适应,那么就会导致父元素(即单元格)会被子元素的宽度撑开,即使给父元素的宽度设置了一个固定值也会失效。

如果表格布局是 auto,表格将会根据其内容自动扩展大小,而不考虑指定的 width

那么,可以确认,如果我们想要用 Descriptions 组件实现文案的省略,则不可避免地需要将 table-layout 设置为 fixed 属性。

How

然而,Descriptions 组件默认的 table-layout 是为 auto,且并没有相关的属性去修改这个值。

所以这里我们只能通过全局的 CSS 去修改?(theme 可做)

但这里,我选择在指标里重写 Descriptions 组件,让用户可控地去使用 Descriptions 组件。


题外话,需要插入说明一下,如果 table-layout 设置为 auto,且单元格的内容并没有溢出,即一开始设置的那样子。那么此时单元格的宽度其实并非我们设置的值,而是基于我们给不同单元格设置的 width 计算出的比例进行等比放大或缩小。

例如:我现在给单元格分别设置 140px 和 280px。

此时若 table 宽度恰好为 420px,则 label(即 th 元素)恰好为 140px,content(即 td 元素)恰好为 280px。

若 table 宽度大于 420px,则按照 1:2 的方式等比放大。

此时 table 的宽度为:

计算可得:806 * 1/3 ≈ 248。

最后

欢迎关注【袋鼠云数栈UED团队】~

袋鼠云数栈 UED 团队持续为广大开发者分享技术成果,相继参与开源了欢迎 star

浅谈数栈产品里的 Descriptions 组件的更多相关文章

  1. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  2. 浅谈单调栈 By cellur925

    这位dalao的单调栈文章很棒!我写的是他的题单233. http://www.cnblogs.com/COLIN-LIGHTNING/p/8474668.html 一.单调栈的一般写法 ;i< ...

  3. 浅谈A/B测试里常见的辛普森悖论,企业决策者必看

    A/B测试背后有着高深的统计学知识,今天我们就来讲讲常见的辛普森悖论. 辛普森悖论 (Simpson's Paradox) 是英国统计学家 E.H.辛普森 (E.H.Simpson) 于1951年提出 ...

  4. 浅谈数通畅联ECP与EAC的区别

    最近收到很多客户的提问,AEAI ECP企业云联平台是什么产品?为什么AEAI ECP中包括集成套件?EAC也是数通畅联的产品吗?同样涉及集成两者有什么区别呢?诸如此类的问题还有很多. 其实AEAI ...

  5. 浅谈扩展欧几里得[exgcd] By cellur925

    关于扩展欧几里得从寒假时就很迷,抄题解过了同余方程,但是原理并不理解. 今天终于把坑填上了qwq. 由于本人太菜,不会用markdown,所以这篇总结是手写的(什么).(字丑不要嫌弃嘛) ****** ...

  6. Molecule实现数栈至简前端开发新体验

    Keep It Simple, Stupid. 这是开发人耳熟能详的 KISS 原则,也像是一句有调侃意味的善意提醒,提醒每个前端人,简洁易懂的用户体验和删繁就简的搭建逻辑就是前端开发的至简大道. 这 ...

  7. 袋鼠云出品!数栈UI 5.0全新体验升级,设计背后的故事

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 前言 数栈作为云原⽣⼀站式⼤数据开发平台,从2016年发布第⼀个版本 ...

  8. 袋鼠云研发手记 | 数栈·开源:Github上400+Star的硬核分布式同步工具FlinkX

    作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...

  9. Android安全开发之启动私有组件漏洞浅谈

    0x00 私有组件浅谈 android应用中,如果某个组件对外导出,那么这个组件就是一个攻击面.很有可能就存在很多问题,因为攻击者可以以各种方式对该组件进行测试攻击.但是开发者不一定所有的安全问题都能 ...

  10. 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)

    虚拟化构建二分图 ------BZOJ2080 题解+浅谈几道双栈排序思想的题 本题的题解在最下面↓↓↓ 不得不说,第一次接触类似于双栈排序的这种题,是在BZOJ的五月月赛上. [BZOJ4881][ ...

随机推荐

  1. 使用 useNuxtData 进行高效的数据获取与管理

    title: 使用 useNuxtData 进行高效的数据获取与管理 date: 2024/7/22 updated: 2024/7/22 author: cmdragon excerpt: 深入讲解 ...

  2. NIO操作文件读写

    第一章 第一节,Buffuer 案例一  从buffur 读出数据, 创建了一个 FileInputStream 对象,并通过调用 getChannel() 方法获取了与之关联的 FileChanne ...

  3. 再读vue

    app.vue是项目的主组件,页面的入口文件 main.js是项目的入口文件 vue.config.js是vue-cli的配置文件//用这个配置代理,端口号 例如 const { defineConf ...

  4. Fiddler使用界面介绍-左侧会话面板

    左侧会话面板,是Fiddler抓取的请求数据展示

  5. Jmeter的安装(Windows)

    1.选择和本机JDK兼容的jmeter版本下载 Jmeter历史版本下载地址:https://archive.apache.org/dist/jmeter/binaries/ 此处我的jmeter5. ...

  6. 7、SpringBoot2之整合事务及AOP

    本文在SpringBoot2之整合Mybatis的基础上进行 7.1.整合事务 7.1.1.mapper接口 int deleteEmployeeById(int id); 7.1.2.mapper映 ...

  7. kaggle上的jax框架的环境配置(TPU版本)

    导出时间: 2024-01-18 21:00:37 星期四 python版本: Python 3.10.13 absl-py==1.4.0 accelerate==0.25.0 aiofiles==2 ...

  8. 国产深度学习框架MindSpore的高校发展之旅——“样本点”计划

    MindSpore这个框架我是使用时间比较早的了,因为这是华为的产品,而且正好是我所在的领域,再加上前些年华为的那些爱国宣传,我是大力支持这个软件的,而且是非常支持的那种.虽然之前就知道华为的这个软件 ...

  9. git 如何删除一个文件名为nul的文件

    前提 当我发现存在一个nul的文件,手动删除/移动它,都会提示ms-dos功能无效或文件过大.想一想这个nul应该是某个保留字,所以普通的方式不能删除 解决方案 https://stackoverfl ...

  10. 前端使用 Konva 实现可视化设计器(20)- 性能优化、UI 美化

    这一章主要分享一下使用 Konva 遇到的性能优化问题,并且介绍一下 UI 美化的思路. 至少有 2 位小伙伴积极反馈,发现本示例有明显的性能问题,一是内存溢出问题,二是卡顿的问题,在这里感谢大家的提 ...