
ag grid作为一款功能强大的数据表格组件,其列固定(pinned columns)功能在数据比较和导航时提供了极大的便利。然而,当需要固定的列数量较多时,一个常见的问题便会浮现:固定列会占据表格的全部可用宽度,导致非固定列区域完全不可见。ag grid核心功能目前并未提供直接的解决方案来限制固定列的宽度并使其自身可横向滚动,从而在保持固定列可见性的同时,也允许用户访问被遮挡的非固定数据。
本文将介绍一种“非官方”的解决方案,通过直接操作DOM结构、监听滚动事件并应用自定义CSS样式,实现AG Grid固定列的宽度限制和内部横向滚动。
该方案的核心思想是为AG Grid的固定列区域和非固定列区域分别创建独立的容器,然后通过CSS控制这些容器的尺寸和滚动行为,并通过JavaScript同步滚动事件。
重要提示:
首先,确保你的AG Grid实例配置了分页功能。这有助于在DOM结构上提供更稳定的基础,以进行后续的DOM操作。
<AgGridReact
// ...其他配置
pagination={true}
paginationAutoPageSize={true}
// ...
/>此步骤是解决方案的关键,我们需要在AG Grid渲染完成后,通过JavaScript动态地为固定列的头部、数据区以及非固定列的头部、数据区创建新的父容器。这使得我们能够独立地控制这些区域的布局和滚动。
在onGridReady回调函数中执行以下DOM操作:
onGridReady = (params) => {
this.gridApi = params.api;
this.gridColumnApi = params.columnApi;
// 包裹固定左侧的头部区域
var headerParent = document.getElementsByClassName('ag-header')[0];
var headerChild = document.getElementsByClassName('ag-pinned-left-header')[0];
var newHeaderContainer = document.createElement('div');
newHeaderContainer.id = 'header-container';
newHeaderContainer.className = 'header-container';
if (headerParent && headerChild) {
headerParent.replaceChild(newHeaderContainer, headerChild);
newHeaderContainer.appendChild(headerChild);
}
// 包裹固定左侧的数据区域
var dataParent = document.getElementsByClassName('ag-body-viewport')[0];
var dataChild = document.getElementsByClassName('ag-pinned-left-cols-container')[0];
var newDataContainer = document.createElement('div');
newDataContainer.id = 'data-container';
newDataContainer.className = 'data-container';
if (dataParent && dataChild) {
dataParent.replaceChild(newDataContainer, dataChild);
newDataContainer.appendChild(dataChild);
}
// 包裹非固定数据区域
var unpinnedDataParent = document.getElementsByClassName('ag-center-cols-viewport')[0];
var unpinnedDataChild = document.getElementsByClassName('ag-center-cols-container')[0];
var newUnpinnedDataContainer = document.createElement('div');
newUnpinnedDataContainer.id = 'unpinned-data-container';
newUnpinnedDataContainer.className = 'unpinned-data-container';
if (unpinnedDataParent && unpinnedDataChild) {
unpinnedDataParent.replaceChild(newUnpinnedDataContainer, unpinnedDataChild);
newUnpinnedDataContainer.appendChild(unpinnedDataChild);
}
// 包裹非固定头部区域
var unpinnedHeaderParent = document.getElementsByClassName('ag-header-viewport')[0];
var unpinnedHeaderChild = document.getElementsByClassName('ag-header-container')[0];
var newUnpinnedHeaderContainer = document.createElement('div');
newUnpinnedHeaderContainer.id = 'unpinned-header-container';
newUnpinnedHeaderContainer.className = 'unpinned-header-container';
if (unpinnedHeaderParent && unpinnedHeaderChild) {
unpinnedHeaderParent.replaceChild(newUnpinnedHeaderContainer, unpinnedHeaderChild);
newUnpinnedHeaderContainer.appendChild(unpinnedHeaderChild);
}
// 连接滚动事件监听器
const dataContainer = document.getElementsByClassName('data-container')[0];
const unpinnedDataContainer = document.getElementsByClassName('unpinned-data-container')[0];
if (dataContainer) {
dataContainer.addEventListener("scroll", this.runOnScroll1, { passive: true });
}
if (unpinnedDataContainer) {
unpinnedDataContainer.addEventListener("scroll", this.runOnScroll2, { passive: true });
}
};代码解释:
由于我们已经将固定列的头部和数据区、非固定列的头部和数据区分别包裹在独立的容器中,它们将不再自动同步横向滚动。因此,我们需要手动添加事件监听器来同步它们的滚动位置。
runOnScroll1 = (evt) => {
const headerContainer = document.getElementsByClassName('header-container')[0];
if (headerContainer) {
headerContainer.scrollTo(evt.srcElement.scrollLeft, 0);
}
};
runOnScroll2 = (evt) => {
const unpinnedHeaderContainer = document.getElementsByClassName('unpinned-header-container')[0];
if (unpinnedHeaderContainer) {
unpinnedHeaderContainer.scrollTo(evt.srcElement.scrollLeft, 0);
}
};代码解释:
最后一步是应用一系列CSS样式来控制新创建容器的宽度、高度和滚动行为,同时覆盖一些AG Grid的默认样式。
/* 隐藏AG Grid原有的滚动条,由我们新容器控制 */
.ag-body-viewport {
overflow: hidden !important;
}
/* 调整AG Grid头部高度 */
.ag-header {
height: 55px !important; /* 根据实际需求调整 */
}
/* 固定数据容器样式 */
.data-container {
min-width: 50% !important; /* 固定列区域最小宽度 */
max-width: 50% !important; /* 固定列区域最大宽度 */
width: 50% !important; /* 固定列区域宽度 */
height: 100% !important;
overflow-x: scroll !important; /* 允许固定列区域横向滚动 */
overflow-y: hidden !important; /* 隐藏纵向滚动条 */
}
/* 非固定数据容器样式 */
.unpinned-data-container {
height: 100% !important;
overflow-y: hidden !important; /* 隐藏纵向滚动条 */
overflow-x: scroll !important; /* 允许非固定列区域横向滚动 */
}
/* 隐藏AG Grid左侧的水平间隔,避免视觉冲突 */
.ag-horizontal-left-spacer {
visibility: hidden;
}
/* 固定头部容器样式 */
.header-container {
height: 120px !important; /* 根据实际需求调整 */
width: 50% !important;
max-width: 50% !important;
min-width: 50% !important;
overflow-x: hidden !important; /* 头部区域横向滚动由数据区同步,自身隐藏 */
overflow-y: hidden !important;
}
/* 非固定头部容器样式 */
.unpinned-header-container {
height: 120px !important; /* 根据实际需求调整 */
overflow-y: hidden !important;
overflow-x: hidden !important; /* 头部区域横向滚动由数据区同步,自身隐藏 */
}CSS解释:
通过上述步骤,你可以在AG Grid中实现固定列的宽度限制和横向滚动功能,有效解决固定列过多导致非固定数据被遮挡的问题。尽管此方案具有一定的“黑科技”性质和潜在风险,但在特定需求下,它能提供有效的用户体验改进。
以上就是AG Grid 固定列宽度限制与横向滚动实现教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号