Kendo UI Tabstrip内嵌固定列Grid的表头宽度对齐异常求助
Kendo UI Tabstrip嵌套Grid固定列表头错位问题排查与解决
实际遇到的异常表现
- 同一页面搭建两个独立Tabstrip页签,每个页签内部都嵌入Kendo Grid组件
- 第一个页签内的Grid配置为固定列模式,包含2个固定列、8个可滚动列,单次全量加载需要20-30秒
- 页面加载后,如果在第一个Grid完成全量渲染前就切到第二个页签,等第一个Grid加载完再切回去,就会出现表头宽度错位、固定列和可滚动区域边框不对齐的显示异常
- 此时只要打开浏览器开发者工具,对页面元素做一次强制检查触发重排,Grid就会自动修正表头宽度,恢复正常显示
问题根因
这个异常是Kendo UI嵌套Tabstrip场景下的高频踩坑点:
切走的页签默认是display:none状态,父容器宽度为0,这时候如果Grid刚好加载完数据、计算列宽,算出来的固定列、可滚动区的尺寸全是错的。等你切回页签的时候,Grid不会主动重新计算尺寸,就会出现表头和表身错位的问题。而你打开元素检查器的时候,浏览器会强制触发全页面重排,刚好命中了Grid内置的resize监听回调,自动把尺寸重新算对了,所以视觉上会出现“点一下检查就好”的现象。
实测有效的解决方案
- 页签激活时主动触发Grid重算
绑定Tabstrip的activate事件,当切回承载对应Grid的页签时,直接调用Kendo官方提供的Grid重算接口:$("#目标Grid的DOMID").data("kendoGrid").resize()
这个方法没有额外的DOM修改副作用,会自动拉取容器的实际可用宽度,重新计算固定列、可滚动表头和表身的尺寸匹配,和浏览器重排触发的自动修正效果完全一致。 - 改成懒加载初始化,避免在隐藏容器里做首次渲染
不要在页面刚加载的时候就把所有页签里的Grid都实例化。可以利用Tabstrip的contentLoad事件做懒加载——只有当用户第一次点开对应页签的时候,才去初始化这个页签里的Grid,从根源上避免Grid在零宽度的隐藏容器下完成第一次列宽计算。 - 长加载场景加兜底逻辑
针对需要20-30秒才能加载完的大体积Grid,可以在Grid的dataBound回调里加状态判断:如果Grid完成数据绑定、渲染完成的时候,发现自己所属的页签没激活,就标记成“待重算”,等页签切回来的时候自动触发一次resize;如果Grid本来就在激活的页签里,就在渲染完成后主动调用一次resize,覆盖长加载过程中可能出现的容器宽度变化(比如窗口缩放、侧边栏折叠)带来的尺寸偏差。 - 提前排除版本兼容问题
2021年之前的Kendo UI旧版本,在固定列数量≥2、可滚动列占比比较高的配置下,存在隐藏容器中尺寸计算的已知bug,升级到当前渠道的正式稳定版本,可以减少这类偶现的显示异常。
内容的提问来源于stack exchange,提问作者Rudresh Kundur
相关产品推荐
相关产品推荐

