Search code examples
tablesorter

Tablesorter stickyheaders inside jQuery UI tabs


I have run into some odd behavior using the Sticky Headers plugin from within a jQuery UI tabs widget. I have tried to attach the sticky header to a wrapper element inside the tab, but the positioning of the header is incorrect. It begins at the top of the widget and moves down as I scroll the table?

The following illustrates the problem. When selecting tab "Two" and scrolling the table, the header moves vertically within the widget.

http://jsfiddle.net/gws000/74ja6gdj/5/

<div id="tabs">
    <ul>
        <li><a href="#fragment-1"><span>One</span></a></li>
        <li><a href="#fragment-2"><span>Two</span></a></li>
        <li><a href="#fragment-3"><span>Three</span></a></li>
    </ul>
    <div id="fragment-1">
        <p>First tab is active by default:</p><span>test1</span>
 <pre><code>$( "#tabs" ).tabs(); </code></pre>

    </div>
    <div id="fragment-2">Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
        <div id='mywrapper' style='height:200px;overflow-y:scroll;'>
        <table class="tablesorter">
            <thead>
                <tr>
                    <th>AlphaNumeric</th>
                    <th class='filter-select'>Numeric</th>
                    <th>Animals</th>
                    <th>Sites</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>abc 123</td>
                    <td>10</td>
                    <td>Koala</td>
                    <td>http://www.google.com</td>
                </tr>
                <tr>
                    <td>abc 1</td>
                    <td>234</td>
                    <td>Ox</td>
                    <td>http://www.yahoo.com</td>
                </tr>
                <tr>
                    <td>abc 9</td>
                    <td>10</td>
                    <td>Girafee</td>
                    <td>http://www.facebook.com</td>
                </tr>
                <tr>
                    <td>zyx 24</td>
                    <td>767</td>
                    <td>Bison</td>
                    <td>http://www.whitehouse.gov/</td>
                </tr>
                <tr>
                    <td>abc 11</td>
                    <td>3</td>
                    <td>Chimp</td>
                    <td>http://www.ucla.edu/</td>
                </tr>
                <tr>
                    <td>abc 2</td>
                    <td>56</td>
                    <td>Elephant</td>
                    <td>http://www.wikipedia.org/</td>
                </tr>
                <tr>
                    <td>abc 9</td>
                    <td>155</td>
                    <td>Lion</td>
                    <td>http://www.nytimes.com/</td>
                </tr>
                <tr>
                    <td>ABC 10</td>
                    <td>87</td>
                    <td>Zebra</td>
                    <td>http://www.google.com</td>
                </tr>
                <tr>
                    <td>zyx 1</td>
                    <td>999</td>
                    <td>Koala</td>
                    <td>http://www.mit.edu/</td>
                </tr>
                <tr>
                    <td>zyx 12</td>
                    <td>0</td>
                    <td>Llama</td>
                    <td>http://www.nasa.gov/</td>
                </tr>
            </tbody>
        </table>
        </div>
    </div>
    <div id="fragment-3">Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.<span>test3</span>
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.</div>
</div>
$("#tabs").tabs({
    activate: function (event, ui) {
        var $t = ui.newPanel.find('table');
        if ($t.length) {
            if ($t[0].config) {
                $t.trigger('applyWidgets');
            } else {
                $t.tablesorter({
                    theme: 'blue',
                    widgets: ["zebra", "filter", "stickyheaders"],
                    widgetOptions: {
                        stickyHeaders_attachTo: "#mywrapper"
                    }
                });
            }
        }
    }
});

Any help would be appreciated.


Solution

  • It looks like the issue is that the #mywrapper element is missing a position:relative; definition. The sticky header is using position:absolute, so it ends up getting its positioned calculated based on the #tabs element, which is the only parent element with a position:relative assigned (by the jQuery tabs widget) (updated demo).

    <div id='mywrapper' style='height:200px;overflow-y:scroll;position:relative;'>