版本背景:
antd:4.6.6
react:16.13.1
浏览器:chrome
问题:
页面布局如下:
当动态伸缩部分(左右两部分都增加了transition 动画)变换的同时表格部分的columns 也跟着变换,出现columns闪烁问题。
原因:
table width 宽度变化的同时,td自适应width 同时增加/减少td数量 导致td宽度变换多次从而出现闪烁。
整理table td 宽度变换问题如下(分析了9 种情况):
- 1. table 定宽 【 sum(td width) > table width && td内容未超出】
这种情况可以看出,td 的width是按照 三个td width 的比例缩小的!
- 2. table 定宽 【 sum(td width) > table width && td内容超出】
由上图可以看出,td width 完全由内容多少控制的并且table 的宽度也并未按照样式国定的宽度显示
- 3. table 定宽 【 sum(td width) < table width && td内容超出】
由上图可以看出,td width 完全由内容多少控制的并且table 的宽度也按照样式国定的宽度显示
- 4. table 定宽 【 sum(td width) < table width && td内容超出 fixed布局】
**由上图可以看出,td width 是按照三个td width 比例放大的 **
- 5. table 定宽 【 sum(td width) > table width && td内容超出 fixed布局】
由上图可以看出,td width 是按照三个td width 比例缩小的 但是 table 的宽度未按照规定的样式显示
- 6. table 定宽 【td宽度未定 fixed布局】
由上图可以看出,td width 是按照三个td平均分配的 并且table 的宽度按照规定的样式显示
- 7. table 定宽 【td宽度未定】
由上图可以看出,td width 完全是按照内容比例撑开的 并且table 的宽度没有按照规定的样式显示
- 8. table 宽度未定 【td定宽 fixed布局】
由上图可以看出,td width 完全是按照内容比例撑开的 并且table 的宽度也不等于sum(td width)
- 9. table 宽度未定 【td定宽】
由上图可以看出,td width 完全是按照内容比例撑开的 并且table 的宽度也不等于sum(td width)
有上面总结可以得处,fixed 布局&& td 定宽下, td宽度是浏览器按照td比例计算出来的,
那么在看antd table 的布局:
会发现也是fixed 布局,也就是说这种布局下,antd 的colunm宽度是按照我们些的column的width浏览器计算出来的,那么可以推断的就是当table 依赖的父组件宽度变化时浏览器是会根据最新宽度变化的。
那么我们即改变父组件的宽度(动画时间5s)又同时改变columns数量,再根据react 的更新机制可以想象出,浏览器既要更新table td(动画5s)的宽度,又要更新最新的td数量,一前一后肯定会出现严重的闪烁.
最后解决办法:去掉transition
ps: 一定的transition 确实会增强交互,但是要合理运用