最近使用antdv时涉及到一个表格可编辑的需求,鼠标点击单元格可输入内容,在左侧设置fixed: 'left'
固定位置后,出现了固定列不跟随右侧内容高度改变,导致显示无法对齐的情况,如图:
‘
看了antdv表格结构后,发现左侧固定为单独一个表格层,完整的结构为:
所以需要通过js实现右侧输入内容或有变化时,调整左侧高度。实现思路,通过ResizeObserver对象监听右侧表格高度的变化,计算左侧dom,感觉会经常用到,随便记一下,分享一部分代码段:
// 创建元素监听器
const resizeObserver = null;
// 监听表格高度变化,同步修改左侧fixed高度
function tableHeightObserver() {
if (typeof ResizeObserver === 'undefined') return;
resizeObserver = new ResizeObserver((entries) => {
for (const entry of entries) {
const { height } = entry.contentRect;
// 更新fixed表行高
this.tableHeightUpdate();
}
});
// 监听表格DOM元素(注意使用ant-table-tbody,只监听table会有出现滚动条时无高度变化的问题)
const element = document.querySelector('#table .ant-table-scroll .ant-table-tbody');
if (element) {
resizeObserver.observe(element);
}
}
function tableHeightUpdate() {
const element = document.querySelector('#table');
if (!element) return;
const scrollEl = element.querySelector('.ant-table-scroll > .ant-table-body');
const leftFixedEl = element.querySelector('.ant-table-fixed-left .ant-table-tbody');
// 遍历scroll表的高度,赋值左侧
scrollEl.querySelectorAll('tr').forEach((item, index) => {
leftFixedEl.querySelectorAll('tr')[index].style.height = `${item.offsetHeight}px`;
});
}
注意:离开组件或页面需结束监听,使用disconnect方法
resizeObserver.disconnect();
修复后: