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

后端 未结 25 2137
悲&欢浪女
悲&欢浪女 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:22

    you can use this approach, pure HTML and CSS no JS needed :)

    .table-fixed-header {
      display: flex;
      justify-content: space-between;
      margin-right: 18px
    }
    
    .table-fixed {
      display: flex;
      justify-content: space-between;
      height: 150px;
      overflow: scroll;
    }
    
    .column {
      flex-basis: 24%;
      border-radius: 5px;
      padding: 5px;
      text-align: center;
    }
    .column .title {
      border-bottom: 2px grey solid;
      border-top: 2px grey solid;
      text-align: center;
      display: block;
      font-weight: bold;
    }
    
    .cell {
      padding: 5px;
      border-right: 1px solid;
      border-left: 1px solid;
    }
    
    .cell:nth-of-type(even) {
      background-color: lightgrey;
    }
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">
      <title>Fixed header Bin</title>
    </head>
    <body>
    <div class="table-fixed-header">
        
        <div class="column">
          <span class="title">col 1</span>
        </div>
        <div class="column">
          <span class="title">col 2</span>
        </div>
        <div class="column">
          <span class="title">col 3</span>
        </div>
        <div class="column">
          <span class="title">col 4</span>
        </div>
        
      </div>
      
      <div class="table-fixed">
        
        <div class="column">
          <div class="cell">alpha</div>
          <div class="cell">beta</div>
          <div class="cell">ceta</div>
        </div>
        
        <div class="column">
          <div class="cell">alpha</div>
          <div class="cell">beta</div>
          <div class="cell">ceta</div>
          <div class="cell">alpha</div>
          <div class="cell">beta</div>
          <div class="cell">ceta</div>
          <div class="cell">alpha</div>
          <div class="cell">beta</div>
          <div class="cell">ceta</div>
        </div>
        
        <div class="column">
          <div class="cell">alpha</div>
          <div class="cell">beta</div>
          <div class="cell">ceta</div>
          <div class="cell">beta</div>
          <div class="cell">beta</div>
          <div class="cell">beta</div>
          
        </div>
        
        <div class="column">
          <div class="cell">alpha</div>
          <div class="cell">beta</div>
          <div class="cell">ceta</div>
        </div>
        
      </div>
    </body>
    </html>

    0 讨论(0)
  • 2020-11-22 06:23

    Create extra table with same header as the main table. Just put thead in the new table with one row and all the headers in it. Do position absolute and background white. For main table put it in a div and use some height and overflow-y scroll. This way our new table will overcome the header of main table and stay there. Surround everything in a div. Below is the rough code to do it.

          <div class="col-sm-8">
    
            <table id="header-fixed" class="table table-bordered table-hover" style="width: 351px;position: absolute;background: white;">
            <thead>
            <tr>
                <th>Col1</th>
                <th>Col2</th>
                <th>Col3</th>
            </tr>
        </thead>
          </table>
    
    
        <div style="height: 300px;overflow-y: scroll;">
              <table id="tableMain" class="table table-bordered table-hover" style="table-layout:fixed;overflow-wrap: break-word;cursor:pointer">
    <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>info</td>
           <td>info</td>
         </tr>
      </tbody>
    
                                        </table>
                  </div>
            </div>
    
    0 讨论(0)
  • 2020-11-22 06:23

    I have tried it using transformation:translate. While it works good in Firefox and Chrome, there is simply no function in IE11. No double scroll bars. Supports table tfoot and caption. Pure Javascript, no jQuery.

    http://jsfiddle.net/wbLqzrfb/42/

    thead.style.transform="translate(0,"+(dY-top-1)+"px)";
    
    0 讨论(0)
  • 2020-11-22 06:24

    I wrote a plugin that does this. Ive been working on it for about a year now and I think it handles all the corner cases pretty well:

    • scrolling within a container with overflow
    • scrolling within a window
    • taking care of what happens when you resize the window
    • keeping your events bound to the header
    • most importantly it doesn't force you to change your table's css to make it work

    Here are some demos/docs:
    http://mkoryak.github.io/floatThead/

    0 讨论(0)
  • 2020-11-22 06:26

    Here is a solution that builds upon the accepted answer. It corrects for: column widths, matching table style, and when the table is scrolled in a container div.

    Usage

    Ensure your table has a <thead> tag because only thead content will be fixed.

    $("#header-fixed").fixHeader();
    

    JavaSript

    //Custom JQuery Plugin
    (function ($) {
        $.fn.fixHeader = function () {
            return this.each(function () {
                var $table = $(this);
                var $sp = $table.scrollParent();
                var tableOffset = $table.position().top;
                var $tableFixed = $("<table />")
                    .prop('class', $table.prop('class'))
                    .css({ position: "fixed", "table-layout": "fixed", display: "none", "margin-top": "0px" });
                $table.before($tableFixed);
                $tableFixed.append($table.find("thead").clone());
    
                $sp.bind("scroll", function () {
                    var offset = $(this).scrollTop();
    
                    if (offset > tableOffset && $tableFixed.is(":hidden")) {
                        $tableFixed.show();
                        var p = $table.position();
                        var offset = $sp.offset();
    
                        //Set the left and width to match the source table and the top to match the scroll parent
                        $tableFixed.css({ left: p.left + "px", top: (offset ? offset.top : 0) + "px", }).width($table.width());
    
                        //Set the width of each column to match the source table
                        $.each($table.find('th, td'), function (i, th) {
                            $($tableFixed.find('th, td')[i]).width($(th).width());
                        });
    
                    }
                    else if (offset <= tableOffset && !$tableFixed.is(":hidden")) {
                        $tableFixed.hide();
                    }
                });
            });
        };
    })(jQuery);
    
    0 讨论(0)
  • 2020-11-22 06:29

    Best solution is to use this jquery plugin:

    https://github.com/jmosbech/StickyTableHeaders

    This plugin worked great for us and we tried a lot other solutions. We tested it in IE, Chrome and Firefox

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