Table header to stay fixed at the top when user scrolls it out of view with jQuery

后端 未结 25 2135
悲&欢浪女
悲&欢浪女 2020-11-22 05:38

I am trying to design an HTML table where the header will stay at the top of the page when AND ONLY when the user scrolls it out of view. For example, the table may be 500

相关标签:
25条回答
  • 2020-11-22 06:36

    Well, I was trying to obtain the same effect without resorting to fixed size columns or having a fixed height for the entire table.

    The solution I came up with is a hack. It consists of duplicating the entire table then hiding everything but the header, and making that have a fixed position.

    HTML

    <div id="table-container">
    <table id="maintable">
        <thead>
            <tr>
                <th>Col1</th>
                <th>Col2</th>
                <th>Col3</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>info</td>
                <td>info</td>
                <td>info</td>
            </tr>
            <tr>
                <td>info</td>
                <td>info</td>
                <td>info</td>
            </tr>
            <tr>
                <td>info</td>
                <td>some really long line here instead</td>
                <td>info</td>
            </tr>
            <tr>
                <td>info</td>
                <td>info</td>
                <td>info</td>
            </tr>
                    <tr>
                <td>info</td>
                <td>info</td>
                <td>info</td>
            </tr>
                    <tr>
                <td>info</td>
                <td>info</td>
                <td>info</td>
            </tr>
            <tr>
                <td>info</td>
                <td>info</td>
                <td>info</td>
            </tr>
        </tbody>
    </table>
    <div id="bottom_anchor"></div>
    </div>
    

    CSS

    body { height: 1000px; }
    thead{
        background-color:white;
    }
    

    javascript

    function moveScroll(){
        var scroll = $(window).scrollTop();
        var anchor_top = $("#maintable").offset().top;
        var anchor_bottom = $("#bottom_anchor").offset().top;
        if (scroll>anchor_top && scroll<anchor_bottom) {
        clone_table = $("#clone");
        if(clone_table.length == 0){
            clone_table = $("#maintable").clone();
            clone_table.attr('id', 'clone');
            clone_table.css({position:'fixed',
                     'pointer-events': 'none',
                     top:0});
            clone_table.width($("#maintable").width());
            $("#table-container").append(clone_table);
            $("#clone").css({visibility:'hidden'});
            $("#clone thead").css({'visibility':'visible','pointer-events':'auto'});
        }
        } else {
        $("#clone").remove();
        }
    }
    $(window).scroll(moveScroll); 
    

    See here: http://jsfiddle.net/QHQGF/7/

    Edit: updated the code so that the thead can receive pointer events(so buttons and links in the header still work). This fixes the problem reported by luhfluh and Joe M.

    New jsfiddle here: http://jsfiddle.net/cjKEx/

    0 讨论(0)
提交回复
热议问题