6

I have found the following solution for fixed header table:

table {
  width: 450px;
  border-collapse: collapse;
}

thead {
  display: block;
  width: 450px;
  overflow: auto;
  color: #fff;
  background: #000;
}

tbody {
  display: block;
  width: 450px;
  height: 200px;
  background: pink;
  overflow: auto;
}

th,
td {
  padding: 0;
  text-align: left;
  vertical-align: top;
  border-left: 1px solid #fff;
}
<table>
  <thead>
    <tr>
      <th style="width:200px">Header 1</th>
      <th style="width:200px">Header 2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="width:200px">Cell 1, Row 1</td>
      <td style="width:200px">Cell 2, Row 1</td>
    </tr>
    <tr>
      <td>Cell 1, Row 2</td>
      <td>Cell 2, Row 2</td>
    </tr>
    <tr>
      <td>Cell 1, Row 3</td>
      <td>Cell 2, Row 3</td>
    </tr>
    <tr>
      <td>Cell 1, Row 4</td>
      <td>Cell 2, Row 4</td>
    </tr>
    <tr>
      <td>Cell 1, Row 5</td>
      <td>Cell 2, Row 5</td>
    </tr>
    <tr>
      <td>Cell 1, Row 6</td>
      <td>Cell 2, Row 6</td>
    </tr>
    <tr>
      <td>Cell 1, Row 7</td>
      <td>Cell 2, Row 7</td>
    </tr>
    <tr>
      <td>Cell 1, Row 8</td>
      <td>Cell 2, Row 8</td>
    </tr>
    <tr>
      <td>Cell 1, Row 9</td>
      <td>Cell 2, Row 9</td>
    </tr>
    <tr>
      <td>Cell 1, Row 10</td>
      <td>Cell 2, Row 10</td>
    </tr>
    <tr>
      <td>Cell 1, Row 11</td>
      <td>Cell 2, Row 11</td>
    </tr>
    <tr>
      <td>Cell 1, Row 12</td>
      <td>Cell 2, Row 12</td>
    </tr>
  </tbody>
</table>

The problem with this solution is that it sets fixed width both for table and cells in pixels. However, I need <table style="width:100%"> and <td style="width:X%">. How to make fixed header table with table and cell width in percents in CSS using only one html table and without JS?

Pavel_K
  • 10,748
  • 13
  • 73
  • 186

7 Answers7

4

Check this solution posted on a different question. Fixed Header solution.

Or directly try out this Fiddle

The header content is placed inside a "div" in the "th". This div has position absolute and other styling to show the header as fixed.

html, body{
  margin:0;
  padding:0;
  height:100%;
}
section {
  position: relative;
  border: 1px solid #000;
  padding-top: 37px;
  background: #500;
}
section.positioned {
  position: absolute;
  top:100px;
  left:100px;
  width:800px;
  box-shadow: 0 0 15px #333;
}
.container {
  overflow-y: auto;
  height: 200px;
}
table {
  border-spacing: 0;
  width:100%;
}
td + td {
  border-left:1px solid #eee;
}
td, th {
  border-bottom:1px solid #eee;
  background: #ddd;
  color: #000;
  padding: 10px 25px;
}
th {
  height: 0;
  line-height: 0;
  padding-top: 0;
  padding-bottom: 0;
  color: transparent;
  border: none;
  white-space: nowrap;
}
th div{
  position: absolute;
  background: transparent;
  color: #fff;
  padding: 9px 25px;
  top: 0;
  margin-left: -25px;
  line-height: normal;
  border-left: 1px solid #800;
}
th:first-child div{
  border: none;
}
<section class="">
  <div class="container">
    <table>
      <thead>
        <tr class="header">
          <th>
            Table attribute name
            <div>Table attribute name</div>
          </th>
          <th>
            Value
            <div>Value</div>
          </th>
          <th>
            Description
            <div>Description</div>
          </th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>align</td>
          <td>left, center, right</td>
          <td>Not supported in HTML5. Deprecated in HTML 4.01. Specifies the alignment of a table according to surrounding text</td>
        </tr>
        <tr>
          <td>bgcolor</td>
          <td>rgb(x,x,x), #xxxxxx, colorname</td>
          <td>Not supported in HTML5. Deprecated in HTML 4.01. Specifies the background color for a table</td>
        </tr>
        <tr>
          <td>border</td>
          <td>1,""</td>
          <td>Specifies whether the table cells should have borders or not</td>
        </tr>
        <tr>
          <td>cellpadding</td>
          <td>pixels</td>
          <td>Not supported in HTML5. Specifies the space between the cell wall and the cell content</td>
        </tr>
        <tr>
          <td>cellspacing</td>
          <td>pixels</td>
          <td>Not supported in HTML5. Specifies the space between cells</td>
        </tr>
        <tr>
          <td>frame</td>
          <td>void, above, below, hsides, lhs, rhs, vsides, box, border</td>
          <td>Not supported in HTML5. Specifies which parts of the outside borders that should be visible</td>
        </tr>
        <tr>
          <td>rules</td>
          <td>none, groups, rows, cols, all</td>
          <td>Not supported in HTML5. Specifies which parts of the inside borders that should be visible</td>
        </tr>
        <tr>
          <td>summary</td>
          <td>text</td>
          <td>Not supported in HTML5. Specifies a summary of the content of a table</td>
        </tr>
        <tr>
          <td>width</td>
          <td>pixels, %</td>
          <td>Not supported in HTML5. Specifies the width of a table</td>
        </tr>
      </tbody>
    </table>
  </div>
</section>
Tom
  • 1,779
  • 2
  • 15
  • 19
  • Could you explain what is `section.positioned`? – Pavel_K Apr 10 '18 at 11:45
  • And could you explain why duplicate text in th and div, I mean this `Table attribute name
    Table attribute name
    `?
    – Pavel_K Apr 10 '18 at 12:06
  • @Pavel_K The section.positioned is not used in the fiddle. It is just some styling for the section. `Table attribute name
    Table attribute name
    ` The div is what gives the fixed header effect. The `` content is repeated in the `
    ` which is then given position absolute.
    – Tom Apr 10 '18 at 12:08
  • 2
    If you just copy-paste the source code of another answer as an answer, this is not OK, you could just put the link of that answer in comments. But you can take help from an answer with due reference and make your own answer that works on the snippet provided by OP, that will be worthy of a new answer. – Munim Munna Apr 11 '18 at 09:35
3

Well, here is my solution.

For HTML you just need to wrap in two div wrappers and in the thead th you need to have some code duplication - I will shortly explain why.

You need the .table-outer wrapper in order to create the necessary padding-top and position:relative that will accommodate the fixed table header.

The .table-wrap wrapper is used to scroll the table contents. One wrapper alone could not be used to absolutely position the header because it would scroll with the parent.

Now I have duplicated and wrapped the th contents inside a p and a span. The span element is used to style and position the header properly. The p might seem unnecessary at first, but here is what it does - it ensures that the th expands properly in cases where th content has content of larger width than the largest td content.

HTML

<div class="table-outer">
  <div class="table-wrap">
    <table>
      <thead>
        <tr>
          <th>
            <p>Header 1</p><span>Header 1</span></th>
          <th>
            <p>Header 1</p><span>Header 2</span></th>
        </tr>
      </thead>
      <tbody>
       ...
      </tbody>
    </table>
  </div>
</div>

CSS

.table-outer {
  padding-top: 20px;
  position: relative;
  height: 100px;
  overflow: hidden;
}

.table-wrap {
  overflow-x: auto;
  overflow-y: scroll;
  width: 100%;
  height: 100%;
}
thead th p {
  overflow: hidden;
  height: 0;
  margin: 0;
  padding: 0;
}

thead th span {
  position: absolute;
  top: 0;
  display: block;
  background: #000;
  color: #fff;
  width: 100%;
}

Here is a working fiddle, along with a small update that shows different content within the table: https://jsfiddle.net/8fa1w922/ https://jsfiddle.net/8fa1w922/2/

scooterlord
  • 15,124
  • 11
  • 49
  • 68
2

Elements with some kind of display:table can't have scrollbars, but you could create another tabel inside a <div> which could do the overflow part.

table {
  width: 300px;
  border-collapse: collapse;
}

#scroll {
  overflow-y: auto;
  height: 200px;
  width: fit-content;
}

thead {
  color: #fff;
  background: #000;
}

tbody {
  background: pink;
}

th,
td {
  padding: 0;
  text-align: left;
  vertical-align: top;
  border-left: 1px solid #fff;
}
<table>
  <thead>
    <tr>
      <th style="width:40%">Header 1</th>
      <th style="width:60%">Header 2</th>
    </tr>
  </thead>
</table>
<div id="scroll">
  <table>
    <tbody>
      <tr>
        <td style="width:40%">Cell 1, Row 1</td>
        <td style="width:60%">Cell 2, Row 1</td>
      </tr>
      <tr>
        <td>Cell 1, Row 2</td>
        <td>Cell 2, Row 2</td>
      </tr>
      <tr>
        <td>Cell 1, Row 3</td>
        <td>Cell 2, Row 3</td>
      </tr>
      <tr>
        <td>Cell 1, Row 4</td>
        <td>Cell 2, Row 4</td>
      </tr>
      <tr>
        <td>Cell 1, Row 5</td>
        <td>Cell 2, Row 5</td>
      </tr>
      <tr>
        <td>Cell 1, Row 6</td>
        <td>Cell 2, Row 6</td>
      </tr>
      <tr>
        <td>Cell 1, Row 7</td>
        <td>Cell 2, Row 7</td>
      </tr>
      <tr>
        <td>Cell 1, Row 8</td>
        <td>Cell 2, Row 8</td>
      </tr>
      <tr>
        <td>Cell 1, Row 9</td>
        <td>Cell 2, Row 9</td>
      </tr>
      <tr>
        <td>Cell 1, Row 10</td>
        <td>Cell 2, Row 10</td>
      </tr>
      <tr>
        <td>Cell 1, Row 11</td>
        <td>Cell 2, Row 11</td>
      </tr>
      <tr>
        <td>Cell 1, Row 12</td>
        <td>Cell 2, Row 12</td>
      </tr>
      <tr>
        <td>Cell 1, Row 12</td>
        <td>Cell 2, Row 12</td>
      </tr>
      <tr>
        <td>Cell 1, Row 12</td>
        <td>Cell 2, Row 12</td>
      </tr>
      <tr>
        <td>Cell 1, Row 12</td>
        <td>Cell 2, Row 12</td>
      </tr>
    </tbody>
  </table>
Sebastian Speitel
  • 7,166
  • 2
  • 19
  • 38
1

You can get this using a display: flex style for the table rows. And then setting the width of the first element with flex-basis (in percentage , as you requested)

There is , however, a hidden problem. Since the body has a scrollbar, and the head doesn't, the dimension of body is smaller than the dimension of head (in the amount of the width of the scrollbar).

So, setting the width to 50% in the head gives a different result that the same in the body.

To make the problem worse, every browser has a different scrollbar width.

To solve this, I forced a scrollbar also on the head.

You can set some trick to hide it, like a pseudo element positioned on the top right corner

table {
  width: 450px;
  border-collapse: collapse;
}

thead {
  display: block;
  width: 450px;
  overflow: auto;
  color: #fff;
  background: #000;
}

tbody {
  display: block;
  width: 450px;
  height: 200px;
  background: pink;
  overflow: auto;
}

tr {
  display: flex;
}
thead tr {
  overflow-y: scroll;
}

th,
td {
  padding: 0;
  text-align: left;
  vertical-align: top;
  border-left: 1px solid #fff;
}

th:first-child,
td:first-child {
   flex-basis: 50%;
}
<table>
  <thead>
    <tr>
      <th>Header 1</th>
      <th>Header 2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Cell 1, Row 1</td>
      <td>Cell 2, Row 1</td>
    </tr>
    <tr>
      <td>Cell 1, Row 2</td>
      <td>Cell 2, Row 2</td>
    </tr>
    <tr>
      <td>Cell 1, Row 3</td>
      <td>Cell 2, Row 3</td>
    </tr>
    <tr>
      <td>Cell 1, Row 4</td>
      <td>Cell 2, Row 4</td>
    </tr>
    <tr>
      <td>Cell 1, Row 5</td>
      <td>Cell 2, Row 5</td>
    </tr>
    <tr>
      <td>Cell 1, Row 6</td>
      <td>Cell 2, Row 6</td>
    </tr>
    <tr>
      <td>Cell 1, Row 7</td>
      <td>Cell 2, Row 7</td>
    </tr>
    <tr>
      <td>Cell 1, Row 8</td>
      <td>Cell 2, Row 8</td>
    </tr>
    <tr>
      <td>Cell 1, Row 9</td>
      <td>Cell 2, Row 9</td>
    </tr>
    <tr>
      <td>Cell 1, Row 10</td>
      <td>Cell 2, Row 10</td>
    </tr>
    <tr>
      <td>Cell 1, Row 11</td>
      <td>Cell 2, Row 11</td>
    </tr>
    <tr>
      <td>Cell 1, Row 12</td>
      <td>Cell 2, Row 12</td>
    </tr>
  </tbody>
</table>
vals
  • 61,425
  • 11
  • 89
  • 138
1

I know OP asked solution without js... but maybe this could help you out. I wrote a jQuery function since I had a lot of table headers to stick... Check the jsFiddle: https://jsfiddle.net/qa4q12Lw/18/

jQuery.fn.stickTableHeaders = function() {
  return this.each(function()
  {
    if(!$(this).is('[data-stick-headers="false"]') && !$(this).is('.table-sticked')) {
      var table = $(this),
            header = table.children('thead'),
            sticked = $('<table></table>').addClass('table table-sticked').css({'margin':'0'}).append(header.clone());

                // Manualy aply styles to the cloned thead and everything in it. Don't know if you'll need this?
      sticked.find('th').css({'backgroundColor': '#fff'}).removeAttr('width');

    $(window).resize(function() {
      // Be sure it recalculates stuff on window resize
      sticked.find('th').each(function() {
          var headerTH = header.find('th').eq($(this).index());
          if(headerTH.is('[width]') || headerTH.is(':first-child') || headerTH.is(':last-child')) {
            $(this).width(header.find('th').eq($(this).index()).width());
          }
          else {
            $(this).width(header.find('th').eq($(this).index()).width());
          }
        });

        table.css({'marginTop':-header.height()});

    }).trigger('resize');
                // top property should be position where to stay sticky
      sticked.css({'display':'table','width':'100%','position':'sticky','top':0, 'zIndex':'10'});

      $(this).before(sticked);
    }
  });
};

To get the best result you should set widths to most th's though.

Brainfeeder
  • 2,604
  • 2
  • 19
  • 37
1

Preamble: On general principles, I believe any approach of the following type:

  • markup has to look like this
  • this language or technique is allowed, and the other is not

... is flawed.

Web is a matter of presenting content.
Whatever technology is used behind the scenes is completely irrelevant. The only thing that matters is the result: the end user experience, the market share of browsers/devices supporting the solution and, ultimately, the success of the product/code (it's a matter of effort vs results).

This should be the only argument.


Let's look at this from a practical point of view:

You want the functionality of a <table>, which is pretty neat: it automatically adjusts the width of all cells in a column, based on content. On the fly. Of course, that's at the cost of tables being incredibly slow, compared to anything else. And that's why they should be avoided and only used when you really need this auto-width magic and you don't need responsiveness. By the way: nowadays, not having responsive content costs you a lot: Google detects it and they decide your content is not suited for touch/narrow devices and, just for this reason, drop you in the search results of any such devices (and, guess what - they're more than 50% of traffic!).

But, wait: you throw all of the auto-width magic away and fix your cell width at 50%. Which means it doesn't (technically) make any sense to use <table>s at all here. You can easily achieve this layout (including the fixed header) using <div>s, your page will be much faster and you'll also have more options for responsiveness. The only quite minor advantage of tables here is having border-collapse. But that's easily achievable using a negative margin equal to border-width on :not(:first-child) or on :first-childon the "cells".


For the sake of argument, here's how I'd do it (as a homework exercise):

.wrapper {
  max-height: 150px;
  overflow-y: auto; 
  display: inline-block;
  padding-top: 19px;
}
table {
  width: 100vw;
  border-collapse: collapse;
}
th, td {
  width: 50%;
}
thead tr{
  position:fixed;
  width: 100vw;
  overflow: hidden;
  color: #fff;
  background: #000;
  display: -webkit-box;
  display: -webkit-flex;
  display: -moz-box;
  display: -ms-flexbox;
  display: flex;
  top: 0;
  height: 18px;
  border-bottom: 1px solid #fff;
}

tbody {
  background: pink;
  overflow: auto;
}

th,
td {
  padding: 0;
  text-align: left;
  vertical-align: top;
  border-left: 1px solid #fff;
}

body {
  margin: 0;
  overflow-x: hidden
}
<div class="wrapper">
<table>
  <thead>
    <tr>
      <th>Header 1</th>
      <th>Header 2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Cell 1, Row 1</td>
      <td>Cell 2, Row 1</td>
    </tr>
    <tr>
      <td>Cell 1, Row 2</td>
      <td>Cell 2, Row 2 Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet</td>
    </tr>
    <tr>
      <td>Cell 1, Row 3</td>
      <td>Cell 2, Row 3</td>
    </tr>
    <tr>
      <td>Cell 1, Row 4</td>
      <td>Cell 2, Row 4</td>
    </tr>
    <tr>
      <td>Cell 1, Row 5</td>
      <td>Cell 2, Row 5</td>
    </tr>
    <tr>
      <td>Cell 1, Row 6</td>
      <td>Cell 2, Row 6</td>
    </tr>
    <tr>
      <td>Cell 1, Row 7</td>
      <td>Cell 2, Row 7</td>
    </tr>
    <tr>
      <td>Cell 1, Row 8</td>
      <td>Cell 2, Row 8</td>
    </tr>
    <tr>
      <td>Cell 1, Row 9</td>
      <td>Cell 2, Row 8</td>
    </tr>
    <tr>
      <td>Cell 1, Row 10</td>
      <td>Cell 2, Row 10</td>
    </tr>
    <tr>
      <td>Cell 1, Row 11</td>
      <td>Cell 2, Row 11</td>
    </tr>
    <tr>
      <td>Cell 1, Row 12</td>
      <td>Cell 2, Row 12</td>
    </tr>
  </tbody>
</table>
</div>

But, in reality, given you don't care about cells auto-adjusting width based on the rest of their column siblings, the only solution that makes sense technically and performance wise is <div>s (regardless of what you put inside it).

Which means I would try to make it clear this is costing you real money (your page is sluggish on x % of target devices - driving your clients away to another website, which probably uses something that's technically sound. Is it a <table>? Most, if not all of your clients, will say it's a table. A smooth one, for a change.

.table {
  width: 100vw;
  padding-top: 19px;
  position: relative;
}
.thead >div >span, .tbody>div > span {
  width: 50%;
}
.thead:after {
  position: absolute;
  background: black;
  content: '';
  width: 17px;
  height: 18px;
  right: 0;
  top: 0;
}
.thead > div{
  position:fixed;
  width: 100vw;
  max-width: 100%;
  color: #fff;
  background: #000;
  display: flex;
  top: 0;
  height: 18px;
  border-bottom: 1px solid rgba(255,255,255,.65);
  overflow-y: scroll;
  overflow-x: hidden;
}

.tbody{
  background: pink;
  display: flex;
  flex-direction: column;
  overflow-y: scroll;
  max-height: 150px;
}
.tbody > div {
  display: flex;
  flex: 1 0 auto;
  border-bottom: 1px solid rgba(255,255,255,.21);
}
.tbody > div> span, .thead>div>span {
  flex: 0 0 50%;
  padding: 0;
  text-align: left;
}
.thead > div > span:not(:first-child) ,
.tbody > div > span:not(:first-child) {
  margin-left: -1px;
  border-left: 1px solid rgba(255,255,255,.21);
}

body {
  margin: 0;
  overflow-x: hidden
}
<div class="table">
  <div class="thead">
    <div>
      <span>Header 1</span>
      <span>Header 2</span>
    </div>
  </div>
  <div class="tbody">
    <div>
      <span>Cell 1, Row 1</span>
      <span>Cell 2, Row 1</span>
    </div>
    <div>
      <span>Cell 1, Row 2</span>
      <span>Cell 2, Row 2 Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet</span>
    </div>
    <div>
      <span>Cell 1, Row 3</span>
      <span>Cell 2, Row 3</span>
    </div>
    <div>
      <span>Cell 1, Row 4</span>
      <span>Cell 2, Row 4</span>
    </div>
    <div>
      <span>Cell 1, Row 5</span>
      <span>Cell 2, Row 5</span>
    </div>
    <div>
      <span>Cell 1, Row 6</span>
      <span>Cell 2, Row 6</span>
    </div>
    <div>
      <span>Cell 1, Row 7</span>
      <span>Cell 2, Row 7</span>
    </div>
    <div>
      <span>Cell 1, Row 8</span>
      <span>Cell 2, Row 8</span>
    </div>
    <div>
      <span>Cell 1, Row 9</span>
      <span>Cell 2, Row 8</span>
    </div>
    <div>
      <span>Cell 1, Row 10</span>
      <span>Cell 2, Row 10</span>
    </div>
    <div>
      <span>Cell 1, Row 11</span>
      <span>Cell 2, Row 11</span>
    </div>
    <div>
      <span>Cell 1, Row 12</span>
      <span>Cell 2, Row 12</span>
    </div>
  </div>
</div>

Most people, when thinking tabular data, automatically picture Excel. Of all products, you'd think MS Excel online is the one place where <table>s make sense, right? Turns out they're too slow and using absolutely positioned <div>s provides a better user experience.

But maybe MS are not the best example, after all, they did lose the browser wars, right? Let's look at Google Sheets. You've guessed it: they're Google <div>s.

tao
  • 82,996
  • 16
  • 114
  • 150
  • Sorry, I didn't understand. I am asking about solution with widths of table and cells in `%`. Your solution is in `px`. Please, explain. – Pavel_K Apr 15 '18 at 07:51
  • You mean [this](https://jsfiddle.net/mjw0gc8m/)? The width of the table is irrelevant. It can well be the size of its parent. The columns are percents. That's what you asked for, right? – tao Apr 15 '18 at 07:54
  • Oh, I have not noticed that you use `div` instead of `table`. But how you will align `Header 2` left border with `tbody` borders? I mean there is some offset because of the scrolling. – Pavel_K Apr 15 '18 at 07:59
  • Perhaps you should read it. When you have some time :) – tao Apr 15 '18 at 08:00
  • I edited my comment. – Pavel_K Apr 15 '18 at 08:02
  • The correct technical solution, (keeping the most valuable asset of table layout - which is ability to adjust column widths to content) which also works cross-browser/cross-device, unlike anything you can achieve with CSS alone, implies having divs as header and updating their widths when table changes or window resizes. In here I simply added scrollbar to both header and table, so they're same width. Any professional solution (payed plugin) for fixed table layouts uses JavaScript. Why do you think that is? – tao Apr 15 '18 at 08:07
  • Ok. Thank you for your solution. It is interesting. – Pavel_K Apr 15 '18 at 08:08
0

Edit: A workaround with a better compatibility, but you need to adjust the header on windows, maybe add an overflow scroll then negative margin and same size positive padding to hide the scrollbar.

If you don't care about Internet Explorer, you can use position: sticky. https://developer.mozilla.org/en-US/docs/Web/CSS/position No JS needed.

.wrapwrap {
    position: relative;
}

.wrapper {
    height: 100px;
    overflow: auto;
}

table {
  width: 100%;
  border-collapse: collapse;
}

thead {
  position: absolute;
  top: 0;
  width: 100%;
  display: inherit;

}

tbody {
  background: pink;
}

th {
    background: #000;
    color: #FFF;
}

th,
td {
  padding: 0;
  text-align: left;
  vertical-align: top;
  border-left: 1px solid #fff;
}
<h1>Position Sticky</h1>
<div class="wrapwrap">><div class="wrapper"><table>
  <thead>
    <tr>
      <th>Header 1</th>
      <th>Header 2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Cell 1, Row 1</td>
      <td>Cell 2, Row 1</td>
    </tr>
    <tr>
      <td>Cell 1, Row 2</td>
      <td>Cell 2, Row 2</td>
    </tr>
    <tr>
      <td>Cell 1, Row 3</td>
      <td>Cell 2, Row 3</td>
    </tr>
    <tr>
      <td>Cell 1, Row 4</td>
      <td>Cell 2, Row 4</td>
    </tr>
    <tr>
      <td>Cell 1, Row 5</td>
      <td>Cell 2, Row 5</td>
    </tr>
    <tr>
      <td>Cell 1, Row 6</td>
      <td>Cell 2, Row 6</td>
    </tr>
    <tr>
      <td>Cell 1, Row 7</td>
      <td>Cell 2, Row 7</td>
    </tr>
    <tr>
      <td>Cell 1, Row 8</td>
      <td>Cell 2, Row 8</td>
    </tr>
    <tr>
      <td>Cell 1, Row 9</td>
      <td>Cell 2, Row 9</td>
    </tr>
    <tr>
      <td>Cell 1, Row 10</td>
      <td>Cell 2, Row 10</td>
    </tr>
    <tr>
      <td>Cell 1, Row 11</td>
      <td>Cell 2, Row 11</td>
    </tr>
    <tr>
      <td>Cell 1, Row 12</td>
      <td>Cell 2, Row 12</td>
    </tr>
  </tbody>
</table></div></div>
romuleald
  • 1,406
  • 16
  • 31