4

I have table with 200 rows. The first row has headings(th tag). While i am scrolling down the heading is to be fixed and visible to all rows. Any help?

Thank You

NDM
  • 6,731
  • 3
  • 39
  • 52
RJ501
  • 167
  • 1
  • 2
  • 10
  • possible duplicate of http://stackoverflow.com/questions/11499973/how-to-fixed-table-header-no-jquery – mariomc Aug 02 '13 at 11:34
  • Maybe [DataTables](http://datatables.net/examples/basic_init/scroll_y.html) is something you want to try... – PoByBolek Aug 02 '13 at 11:36
  • 1
    You might want to take a look at this question: http://stackoverflow.com/questions/1030043/html-table-headers-always-visible-at-top-of-window-when-viewing-a-large-table – Matthijs Aug 02 '13 at 11:36
  • yea, the answer there uses javascript, it can be done without any JS – SpYk3HH Aug 02 '13 at 11:39
  • possible duplicate of [Freezing/Fixing the Top Header Row of a table](http://stackoverflow.com/questions/15307135/freezing-fixing-the-top-header-row-of-a-table) – NDM Aug 02 '13 at 11:47
  • another solutions can be found here: http://stackoverflow.com/questions/673153/html-table-with-fixed-headers/ – Stano Aug 02 '13 at 12:11
  • there are lots of answers for this question. you'll find your answer quicker if you searched. http://stackoverflow.com/search?q=freeze+table+header – Ray Cheng Aug 14 '13 at 22:54
  • Possible duplicate of [Freeze the top row for an html table only (Fixed Table Header Scrolling)](https://stackoverflow.com/questions/8423768/freeze-the-top-row-for-an-html-table-only-fixed-table-header-scrolling) – Mohamad Hamouday Aug 24 '18 at 09:42

1 Answers1

2

Easiest answer, check this out -> http://www.imaputz.com/cssStuff/bigFourVersion.html


One caveat: Does not work for IE 7-9 (Does work for 6 and 10). If you need a solution for 7-9, try jQuery Scrollable Table Plugin. You can even set it up to only use the JS for IE versions 7-9 by placing the javascript call for it inside IE if comments. Then you'd know anyone using a better browser would be using pure CSS (faster) and you'd have a solution for those using crap ... i mean IE 7,8, or 9.


It basically has to do with the CSS. One key is setting table-body to display: block. Another issue is going to be in dealing with fixed widths. Just check it out. It's REALLY easy to copy that example.

Really not much more I can say! This example is PURE CSS, no JS!

jsFiddle

CSS

/* define height and width of scrollable area. Add 16px to width for scrollbar          */
div.tableContainer {
    clear: both;
    border: 1px solid #963;
    height: 285px;
    overflow: auto;
    width: 756px
}

/* Reset overflow value to hidden for all non-IE browsers. */
html>body div.tableContainer {
    overflow: hidden;
    width: 756px
}

/* define width of table. IE browsers only                 */
div.tableContainer table {
    float: left;
    width: 740px
}

/* define width of table. Add 16px to width for scrollbar.           */
/* All other non-IE browsers.                                        */
html>body div.tableContainer table {
    width: 756px
}

/* set table header to a fixed position. WinIE 6.x only                                       */
/* In WinIE 6.x, any element with a position property set to relative and is a child of       */
/* an element that has an overflow property set, the relative value translates into fixed.    */
/* Ex: parent element DIV with a class of tableContainer has an overflow property set to auto */
thead.fixedHeader tr {
    position: relative
}

/* set THEAD element to have block level attributes. All other non-IE browsers            */
/* this enables overflow to work on TBODY element. All other non-IE, non-Mozilla browsers */
html>body thead.fixedHeader tr {
    display: block
}

/* make the TH elements pretty */
thead.fixedHeader th {
    background: #C96;
    border-left: 1px solid #EB8;
    border-right: 1px solid #B74;
    border-top: 1px solid #EB8;
    font-weight: normal;
    padding: 4px 3px;
    text-align: left
}

/* make the A elements pretty. makes for nice clickable headers                */
thead.fixedHeader a, thead.fixedHeader a:link, thead.fixedHeader a:visited {
    color: #FFF;
    display: block;
    text-decoration: none;
    width: 100%
}

/* make the A elements pretty. makes for nice clickable headers                */
/* WARNING: swapping the background on hover may cause problems in WinIE 6.x   */
thead.fixedHeader a:hover {
    color: #FFF;
    display: block;
    text-decoration: underline;
    width: 100%
}

/* define the table content to be scrollable                                              */
/* set TBODY element to have block level attributes. All other non-IE browsers            */
/* this enables overflow to work on TBODY element. All other non-IE, non-Mozilla browsers */
/* induced side effect is that child TDs no longer accept width: auto                     */
html>body tbody.scrollContent {
    display: block;
    height: 262px;
    overflow: auto;
    width: 100%
}

/* make TD elements pretty. Provide alternating classes for striping the table */
/* http://www.alistapart.com/articles/zebratables/                             */
tbody.scrollContent td, tbody.scrollContent tr.normalRow td {
    background: #FFF;
    border-bottom: none;
    border-left: none;
    border-right: 1px solid #CCC;
    border-top: 1px solid #DDD;
    padding: 2px 3px 3px 4px
}

tbody.scrollContent tr.alternateRow td {
    background: #EEE;
    border-bottom: none;
    border-left: none;
    border-right: 1px solid #CCC;
    border-top: 1px solid #DDD;
    padding: 2px 3px 3px 4px
}

/* define width of TH elements: 1st, 2nd, and 3rd respectively.          */
/* Add 16px to last TH for scrollbar padding. All other non-IE browsers. */
/* http://www.w3.org/TR/REC-CSS2/selector.html#adjacent-selectors        */
html>body thead.fixedHeader th {
    width: 200px
}

html>body thead.fixedHeader th + th {
    width: 240px
}

html>body thead.fixedHeader th + th + th {
    width: 316px
}

/* define width of TD elements: 1st, 2nd, and 3rd respectively.          */
/* All other non-IE browsers.                                            */
/* http://www.w3.org/TR/REC-CSS2/selector.html#adjacent-selectors        */
html>body tbody.scrollContent td {
    width: 200px
}

html>body tbody.scrollContent td + td {
    width: 240px
}

html>body tbody.scrollContent td + td + td {
    width: 300px
}

HTML

<div id="tableContainer" class="tableContainer">
    <table border="0" cellpadding="0" cellspacing="0" width="100%" class="scrollTable">
        <thead class="fixedHeader">
            <tr>
                <th><a href="#">Header 1</a></th>
                <th><a href="#">Header 2</a></th>
                <th><a href="#">Header 3</a></th>
            </tr>
        </thead>
        <tbody class="scrollContent">
            <tr>
                <td>Cell Content 1</td>
                <td>Cell Content 2</td>
                <td>Cell Content 3</td>
            </tr>
            <tr>
                <td>More Cell Content 1</td>
                <td>More Cell Content 2</td>
                <td>More Cell Content 3</td>
            </tr>
            <tr>
                <td>Even More Cell Content 1</td>
                <td>Even More Cell Content 2</td>
                <td>Even More Cell Content 3</td>
            </tr>
            <tr>
                <td>And Repeat 1</td>
                <td>And Repeat 2</td>
                <td>And Repeat 3</td>
            </tr>
            ...
            ...
            ...
            <tr>
                <td>End of Cell Content 1</td>
                <td>End of Cell Content 2</td>
                <td>End of Cell Content 3</td>
            </tr>
        </tbody>
    </table>
</div>
SpYk3HH
  • 22,272
  • 11
  • 70
  • 81
  • @Stano lol, because you set width to 100%. You'll need **fixed widths** to make it perfect – SpYk3HH Aug 02 '13 at 12:03
  • lol, yea, i left out the container div. That was why i provided the link, it has full example. Anyway, updating answer now to include a jsfiddle as well – SpYk3HH Aug 02 '13 at 12:13
  • I see that! lol, what's funny is it works in IE 5,6, and 10! But not in 7 through 9! Leave it to Microsoft. I'm sure a little CSS tweaking and you could find an IE 7-9 specific css setting to add. – SpYk3HH Aug 02 '13 at 12:27
  • I might have found a solution for your IE issue, i updated answer, but the link is: http://www.webtoolkit.info/scrollable-html-table-plugin-for-jquery.html – SpYk3HH Aug 14 '13 at 21:51
  • @Stano Not necessarily true. I've worked for several companies, as I do now, that refuse IE and only use Chrome or FF. Also, if you check, IE is losing a lot of market share and Chrome is most popular in world right now. Of course, most military and medical still use IE7 or 8, but even they will come around eventually. There is also the option of using the chromium plugin on your site if you want to ensure IE users get the same experience as chrome users. Plus you can simply use IE comments, as mentioned, to isolate plugin to only IE, thus giving better browsers, a better experience – SpYk3HH Aug 20 '13 at 20:04
  • @SearchForKnowledge Your fiddle doesn't show the headers staying in place. The idea is for the `table > head > tr` to not scroll – SpYk3HH Feb 05 '15 at 15:59