antd table 动态宽度、动态columns 闪烁严重的问题

2,930 阅读2分钟

版本背景

antd:4.6.6

react:16.13.1

浏览器:chrome

问题

页面布局如下:

image.png

当动态伸缩部分(左右两部分都增加了transition 动画)变换的同时表格部分的columns 也跟着变换,出现columns闪烁问题。

原因

table width 宽度变化的同时,td自适应width 同时增加/减少td数量 导致td宽度变换多次从而出现闪烁。

整理table td 宽度变换问题如下(分析了9 种情况):

- 1. table 定宽 【 sum(td width) > table width && td内容未超出

image.png

image.png

image.png

这种情况可以看出,td 的width是按照 三个td width 的比例缩小的!

- 2. table 定宽 【 sum(td width) > table width && td内容超出

image.png

image.png

image.png

image.png

由上图可以看出,td width 完全由内容多少控制的并且table 的宽度也并未按照样式国定的宽度显示

- 3. table 定宽 【 sum(td width) < table width && td内容超出

image.png

image.png

image.png

由上图可以看出,td width 完全由内容多少控制的并且table 的宽度也按照样式国定的宽度显示

- 4. table 定宽 【 sum(td width) < table width && td内容超出 fixed布局

image.png

image.png

image.png **由上图可以看出,td width 是按照三个td width 比例放大的 **

- 5. table 定宽 【 sum(td width) > table width && td内容超出 fixed布局

image.png

image.png

image.png 由上图可以看出,td width 是按照三个td width 比例缩小的 但是 table 的宽度未按照规定的样式显示

- 6. table 定宽 【td宽度未定 fixed布局

image.png

image.png

image.png

image.png 由上图可以看出,td width 是按照三个td平均分配的 并且table 的宽度按照规定的样式显示

- 7. table 定宽 【td宽度未定

image.png

image.png

image.png

由上图可以看出,td width 完全是按照内容比例撑开的 并且table 的宽度没有按照规定的样式显示

- 8. table 宽度未定 【td定宽 fixed布局

image.png image.png image.png image.png 由上图可以看出,td width 完全是按照内容比例撑开的 并且table 的宽度也不等于sum(td width)

- 9. table 宽度未定 【td定宽

image.png

image.png

image.png 由上图可以看出,td width 完全是按照内容比例撑开的 并且table 的宽度也不等于sum(td width)

有上面总结可以得处,fixed 布局&& td 定宽下, td宽度是浏览器按照td比例计算出来的,

那么在看antd table 的布局: image.png

会发现也是fixed 布局,也就是说这种布局下,antd 的colunm宽度是按照我们些的column的width浏览器计算出来的,那么可以推断的就是当table 依赖的父组件宽度变化时浏览器是会根据最新宽度变化的。

那么我们即改变父组件的宽度(动画时间5s)又同时改变columns数量,再根据react 的更新机制可以想象出,浏览器既要更新table td(动画5s)的宽度,又要更新最新的td数量,一前一后肯定会出现严重的闪烁.

最后解决办法:去掉transition

ps: 一定的transition 确实会增强交互,但是要合理运用