如何在HTML表上复制“冻结窗格”功能?

时间:2011-08-16 16:59:53

标签: c# javascript jquery asp.net html

我在ASP.NET项目中有一个小部件,我正在为我的工作开发。它必须是300像素宽,不能更宽。不幸的是,对于这样一个小小部件,他们想要的东西已经证明相当复杂。这就是我现在所拥有的:

http://www.codetunnel.com/content/images/widget/currentWidget.jpg

如您所见,这是一个jQuery UI手风琴控件。当每个折叠窗格展开时,会调用ajax来异步加载其内容。现在它会吐出一个包含所需数据的HTML表。该表位于样式为overflow: auto;的DIV内,因此我们可以在底部和右侧获得滚动条。

我的问题是我想要一些漂亮的自定义功能(比如excel中的冻结窗格功能)。当向左和向右滚动时,我希望所有行(包括标题)向左和向右滚动之外的最左列,“产品名称”。像这样:

http://www.codetunnel.com/content/images/widget/scrollRight.jpg

当向上和向下滚动时,我希望所有列(包括左列)向上和向下滚动之外的标题行。像这样:

http://www.codetunnel.com/content/images/widget/scrollDown.jpg

实现此功能的最佳方法是什么?或者有办法吗?

2 个答案:

答案 0 :(得分:4)

我构建了一些类似的东西,但不那么复杂:我希望在数据行垂直滚动时冻结表的第一行(标题)。我将它实现为2个不同的表,每个表都有固定宽度的单元格,每个表格都在自己的DIV中。 “header”div只是静态,“body”div使用overflow:auto来滚动。

你的问题更复杂,因为你想要在两个轴上“冻结窗格”,并支持在两个轴上滚动(我有更多的房地产可以使用,而不必考虑水平滚动在所有)。不过,我想知道你是否可以从那个位置开始并从那里工作......

定义4个div:

  • NW:这个根本不滚动。它是您示例中的“产品名称”单元格
  • NE:这个只能水平滚动。它是示例中的顶部/标题行
  • SW:这个只能垂直滚动。这是示例中的左侧列
  • SE:这个向两个方向滚动。它是您示例中的主要数据网格

使用4个DIV,您将处理4个不同的表,因此我们需要保持其单元格宽度和单元格高度同步。理想情况下,我们可以在渲染时执行此操作,如果我们可以使它们成为固定值。否则,我们可能会编写一些客户端jquery / JS来在页面首次加载(或调整大小)时迭代SE表中的单元格,并强制其他表的大小与它们匹配。

使用4个DIV,我们还需要同步滚动:当SE滚动时,NE必须滚动到相同的位置。当SE垂直滚动时,SW必须滚动到相同的位置。我怀疑必须有一些我们可以挂钩的客户端滚动事件,以检测何时滚动SE。在这些事件中,我们应该能够以相同的方式强制滚动NE和/或SW。

对不起,这是一个模糊/抽象的回应。实现这样的事情的细节将花费更多的时间,而不是我可以轻松地从我的主要工作中偷走。但是这种情况在我脑子里一直在嘎嘎作响,所以我想与你分享。我希望它能让你至少更接近解决方案。干杯!

答案 1 :(得分:0)

这是tbody可以在固定大小的表内解决的问题吗?您似乎可以将overflow:auto放在tbody上。