Muhammad Awais Iqbal
Muhammad Awais Iqbal

Reputation: 171

Fix Bootstrap tbody scroll with parent

I've created a codepen with fixed table header but there is an issue. When table columns are increased the it shows vertical scroll after scrolling to right side.

How it tbody vertical scroll can be fixed to the parent so it is always visible.

https://codepen.io/cybentizen/pen/eXBaor

@media (max-width:991px) {
  table.table-sticky tbody {
    overflow-x: hidden;
  }

  table.table-sticky th,
  table.table-sticky td {
    min-width: 100px !important;
    width: 100px;
  }
}

@media (min-width:768px) {
table.table-sticky tr {
    table-layout: fixed;
}
}

@media (max-width:767px) {
table.table-sticky th,
table.table-sticky td {
    min-width: 150px !important;
}

table.table-sticky tbody {
    overflow-x: hidden;
}
}
table.table-sticky tr {
  width: 100%;
  display: inline-table;
  float: left;}
  table.table-sticky th {
  padding-left: 0;
}

table.table-sticky {
height: 190px;
position: relative;
margin-bottom: 0;
}

table.table-sticky thead {
position: sticky;
width: calc(100% - 17px) !important;
}

table.table-sticky thead th:last-of-type {
border-right: 0;
}

table.table-sticky tbody {
overflow-y: scroll;
overflow-x: hidden;
display: inline-block;
height: 150px;
width: 100%;
/* position: absolute; */
}

table.table-sticky-double tbody {
height: 142px;
}

table.table-sticky tr.collapse {
background-color: #eee;
display:none;
}

table.table-sticky tr.collapse.in {
background-color: #eee;
display: table;
}

table.table-sticky tr.collapse.in td {
border:0;
color: #666;
font-size: 11px;
padding: 0px;
}

table.table-sticky tr.collapse.in td input {
border: 0;
background: transparent;
box-shadow: none;
color: #666;
font-size: 11px;
}

table.table-sticky tr.collapsing {
-webkit-transition: none;
transition: none;
display: none;
}

I've also added responsive queries in it and styling for TD and TR.

Upvotes: 1

Views: 67

Answers (1)

Udara Kasun
Udara Kasun

Reputation: 2216

I used simple trick for your problem. check and try this

function myf(){     
   var el = document.getElementById('mybody');
   document.getElementById('myhead').scrollLeft=el.scrollLeft;
}
th, td{
   width:80px;
   text-align:left;
}

@media (max-width:991px) {
    table.table-sticky tbody {
        overflow-x: hidden;
    }

    table.table-sticky th,
    table.table-sticky td {
        min-width: 100px !important;
        width: 100px;
    }
}

@media (min-width:768px) {
    table.table-sticky tr {
        table-layout: fixed;
    }
}

@media (max-width:767px) {
    table.table-sticky th,
    table.table-sticky td {
        min-width: 150px !important;
    }

    table.table-sticky tbody {
        overflow-x: hidden;
    }
}

table.table-sticky tr {
    width: 100%;
    display: inline-table;
    float: left;
}

table.table-sticky th {
    padding-left: 0;
}

table.table-sticky {
    height: 190px;
    position: relative;
  margin-bottom: 0;
}

table.table-sticky thead {
    
}

table.table-sticky thead th:last-of-type {
    border-right: 0;
}

table.table-sticky tbody {
    overflow-y: scroll;
    overflow-x: scroll;
    display: inline-block;
    height: 150px;
    width: 400px;
    /* position: absolute; */
}

/*.table-responsive {
    overflow-x: inherit;
}*/

table.table-sticky-double tbody {
    height: 142px;
}

table.table-sticky tr.collapse {
    background-color: #eee;
    display:none;
}

table.table-sticky tr.collapse.in {
    background-color: #eee;
    display: table;
}

table.table-sticky tr.collapse.in td {
    border:0;
    color: #666;
    font-size: 11px;
    padding: 0px;
}

table.table-sticky tr.collapse.in td input {
    border: 0;
    background: transparent;
    box-shadow: none;
    color: #666;
    font-size: 11px;
}

table.table-sticky tr.collapsing {
    -webkit-transition: none;
    transition: none;
    display: none;
}

thead{   
    width: 400px;
    display: inline-block;
    overflow: hidden;
}

 
<div style="width: 600px;">
  <div class="table-responsive">
    <table class="table table-striped table-sticky">
      <thead id="myhead">
        <tr>
          <th style="width: 80px; min-width: 80px;">Serial</th>
          <th style="width: 100px; min-width: 100px;">Item code</th>
          <th style="width: 100px; min-width: 100px;">Item name</th>
          <th style="width: 80px; min-width: 80px;">Mfg. Date</th>
          <th style="width: 100px; min-width: 100px;">Expiry Date</th>
          <th style="width: 80px; min-width: 80px;">Length</th>
          <th style="width: 80px; min-width: 80px;">Width</th>
          <th style="width: 80px; min-width: 80px;">Height</th>
          <th style="width: 80px; min-width: 80px;">Action</th>
        </tr>
      </thead>
      <tbody onscroll="myf()" id="mybody">
        <tr>
          <td style="width: 80px; min-width: 80px;">0001</td>
          <td style="width: 100px; min-width: 100px;">00010001</td>
          <td style="width: 100px; min-width: 100px;">Item 1</td>
          <td style="width: 80px; min-width: 80px;">01/01/2019</td>
          <td style="width: 100px; min-width: 100px;">01/01/2020</td>
          <td style="width: 80px; min-width: 80px;">5.0</td>
          <td style="width: 80px; min-width: 80px;">3.0</td>
          <td style="width: 80px; min-width: 80px;">0.0</td>
          <td style="width: 80px; min-width: 80px;">x</td>
        </tr>
        <tr>
          <td style="width: 80px; min-width: 80px;">0001</td>
          <td style="width: 100px; min-width: 100px;">00010001</td>
          <td style="width: 100px; min-width: 100px;">Item 1</td>
          <td style="width: 80px; min-width: 80px;">01/01/2019</td>
          <td style="width: 100px; min-width: 100px;">01/01/2020</td>
          <td style="width: 80px; min-width: 80px;">5.0</td>
          <td style="width: 80px; min-width: 80px;">3.0</td>
          <td style="width: 80px; min-width: 80px;">0.0</td>
          <td style="width: 80px; min-width: 80px;">x</td>
        </tr>
        <tr>
          <td style="width: 80px; min-width: 80px;">0001</td>
          <td style="width: 100px; min-width: 100px;">00010001</td>
          <td style="width: 100px; min-width: 100px;">Item 1</td>
          <td style="width: 80px; min-width: 80px;">01/01/2019</td>
          <td style="width: 100px; min-width: 100px;">01/01/2020</td>
          <td style="width: 80px; min-width: 80px;">5.0</td>
          <td style="width: 80px; min-width: 80px;">3.0</td>
          <td style="width: 80px; min-width: 80px;">0.0</td>
          <td style="width: 80px; min-width: 80px;">x</td>
        </tr>
        <tr>
          <td style="width: 80px; min-width: 80px;">0001</td>
          <td style="width: 100px; min-width: 100px;">00010001</td>
          <td style="width: 100px; min-width: 100px;">Item 1</td>
          <td style="width: 80px; min-width: 80px;">01/01/2019</td>
          <td style="width: 100px; min-width: 100px;">01/01/2020</td>
          <td style="width: 80px; min-width: 80px;">5.0</td>
          <td style="width: 80px; min-width: 80px;">3.0</td>
          <td style="width: 80px; min-width: 80px;">0.0</td>
          <td style="width: 80px; min-width: 80px;">x</td>
        </tr>
        <tr>
          <td style="width: 80px; min-width: 80px;">0001</td>
          <td style="width: 100px; min-width: 100px;">00010001</td>
          <td style="width: 100px; min-width: 100px;">Item 1</td>
          <td style="width: 80px; min-width: 80px;">01/01/2019</td>
          <td style="width: 100px; min-width: 100px;">01/01/2020</td>
          <td style="width: 80px; min-width: 80px;">5.0</td>
          <td style="width: 80px; min-width: 80px;">3.0</td>
          <td style="width: 80px; min-width: 80px;">0.0</td>
          <td style="width: 80px; min-width: 80px;">x</td>
        </tr>
        <tr>
          <td style="width: 80px; min-width: 80px;">0001</td>
          <td style="width: 100px; min-width: 100px;">00010001</td>
          <td style="width: 100px; min-width: 100px;">Item 1</td>
          <td style="width: 80px; min-width: 80px;">01/01/2019</td>
          <td style="width: 100px; min-width: 100px;">01/01/2020</td>
          <td style="width: 80px; min-width: 80px;">5.0</td>
          <td style="width: 80px; min-width: 80px;">3.0</td>
          <td style="width: 80px; min-width: 80px;">0.0</td>
          <td style="width: 80px; min-width: 80px;">x</td>
        </tr>
        <tr>
          <td style="width: 80px; min-width: 80px;">0001</td>
          <td style="width: 100px; min-width: 100px;">00010001</td>
          <td style="width: 100px; min-width: 100px;">Item 1</td>
          <td style="width: 80px; min-width: 80px;">01/01/2019</td>
          <td style="width: 100px; min-width: 100px;">01/01/2020</td>
          <td style="width: 80px; min-width: 80px;">5.0</td>
          <td style="width: 80px; min-width: 80px;">3.0</td>
          <td style="width: 80px; min-width: 80px;">0.0</td>
          <td style="width: 80px; min-width: 80px;">x</td>
        </tr>
      </tbody>
    </table>
  </div>
</div>

Code Pen Example 1

Code Pen Example 2

Upvotes: 1

Related Questions