What was wrong with a <table> inside a <div style="max-height: ...; overflow: scroll">?
Update: I remember now: The rows were drawn on top of the header. Their background must have been transparent or something.
Now you all must be right: This must have been fixable somehow. Now the application contains 10+ years of CSS evolution, maintained by at least 4 predecessors and a bunch of quick and dirty maintenance hacks. It's a huge tower of exceptions built on exceptions . I had already blow way past my time budget for something I had estimated easy, and creating a table wasn't even the core of the job. So I cut my losses.