HTML <tbody> Tag

Learn about the HTML <tbody> tag (in both tl;dr and normal format), including its definition, syntax, use-cases and plenty of examples to go along with it.
Josh Hartman
Josh Hartman
Last updated: Apr 04, 2024

Purpose and Function

The <tbody> HTML tag plays a crucial role in organizing and structuring the main data content of an HTML table. Unlike <thead> that focuses on header information, <tbody> is dedicated to grouping the primary data rows within a table. This segregation enhances the semantic clarity of the HTML code, making it more comprehensible and maintainable.


To integrate the <tbody> tag, you nest it within the <table> element, encapsulating the main data rows. Here's a basic example:

<table> <thead> <tr> <th>Header 1</th> <th>Header 2</th> </tr> </thead> <tbody> <tr> <td>Data 1</td> <td>Data 2</td> </tr> <!-- Additional rows --> </tbody> </table>
Header 1 Header 2
Data 1 Data 2

In this example, the <tbody> element contains a row with two data cells (<td>), representing the main data content of the table.

Real-World Use-Cases and Examples

Alternating Row Colors for Improved Readability

Consider a scenario where you want to enhance the readability of your table by applying alternating row colors:

<table> <thead> <tr> <th>Header 1</th> <th>Header 2</th> </tr> </thead> <tbody> <tr> <td>Data 1</td> <td>Data 2</td> </tr> <tr> <td>Data 3</td> <td>Data 4</td> </tr> </tbody> </table>
Header 1 Header 2
Data 1 Data 2
Data 3 Data 4

This example demonstrates the use of <tbody> to organize the main data rows and improve the table's visual structure.

Styling and Formatting

Styling within <tbody> elements can be achieved using CSS to enhance the visual appeal or ensure consistency:

tbody { font-size: 16px; color: #333; border-bottom: 1px solid #ddd; }

This CSS snippet sets the font size, text color, and a bottom border for the data rows within the <tbody> to provide a consistent and structured appearance.

Accessibility and SEO Considerations

For accessibility, ensure that the data rows within <tbody> are logically structured using <td> elements. This ensures a meaningful sequence of data and enhances the interpretability for screen readers.

For SEO, use relevant and descriptive content within <tbody>. While search engines primarily focus on the overall document structure, providing meaningful data can contribute to a better understanding of the page's content.

Common Mistakes

While it might seem straightforward, there are common mistakes that developers make when using this tag. Let's explore these pitfalls and understand how to avoid them.

1. Missing the <tbody> Tag When Using <thead> and <tfoot>

<table> <thead> <tr> <th>Header 1</th> <th>Header 2</th> </tr> </thead> <!-- Missing <tbody> tag --> <tr> <td>Data 1</td> <td>Data 2</td> </tr> <tfoot> <tr> <td>Footer 1</td> <td>Footer 2</td> </tr> </tfoot> </table>

It's essential to include the <tbody> tag to wrap the table's body content, even when <thead> and <tfoot> are present. This ensures proper structure and avoids unexpected rendering issues.

2. Incorrect Placement of <tbody> Tag

<table> <!-- Incorrect placement of <tbody> tag --> <tbody> <thead> <tr> <th>Header 1</th> <th>Header 2</th> </tr> </thead> <tr> <td>Data 1</td> <td>Data 2</td> </tr> <tfoot> <tr> <td>Footer 1</td> <td>Footer 2</td> </tr> </tfoot> </tbody> </table>

Ensure that the <tbody> tag is placed correctly. It should encapsulate the rows representing the main body of the table, not wrapping the entire table structure.

3. Nesting <tbody> Tags

<table> <tbody> <tr> <td>Data 1</td> <td>Data 2</td> </tr> <!-- Nested <tbody> tag --> <tbody> <tr> <td>Data 3</td> <td>Data 4</td> </tr> </tbody> </tbody> </table>

Avoid nesting <tbody> tags. The <tbody> tag should only be used once to group the main body content. Nesting can lead to unpredictable behavior and may not be interpreted correctly by browsers.

4. Using <tbody> Outside of a Table

<!-- Incorrect usage of <tbody> outside of a table --> <tbody> <tr> <td>Data 1</td> <td>Data 2</td> </tr> </tbody>

The <tbody> tag should only be used within the context of a <table>. Using it outside of a table structure is incorrect and may result in rendering issues.

5. Redundant Use of <tbody> with Only One Row

<table> <!-- Redundant <tbody> tag with only one row --> <tbody> <tr> <td>Data 1</td> <td>Data 2</td> </tr> </tbody> </table>

Avoid using a <tbody> tag if your table has only one row in the body. While not necessarily incorrect, it adds unnecessary markup, and it's cleaner to place the <tr> directly inside the <table>.

By being mindful of these common mistakes, you can ensure proper usage of the <tbody> tag in your HTML tables, leading to better code structure and rendering.


In conclusion, the <tbody> HTML tag is an essential component for structuring the main data content of tables. Its application contributes to improved semantic structure, enhancing both accessibility and the overall visual appeal of the table. By incorporating thoughtful styling and adhering to accessibility and SEO best practices, developers can create tables that not only look appealing but also provide a positive user experience and improved discoverability of content. Embrace the versatility of <tbody> to optimize your tables and elevate your web content.

Josh Hartman

Josh Hartman

I'm Josh, the founder of HTML Tables and eklipse Development, a Webflow Professional Partner. I've always loved seamless web experiences and take pride in merging code with creative design. Aside from this website, I'm currently building How Much Concrete, a state-of-the-art concrete calculator. Beyond the digital realm, I love the outdoors & fitness. Find me on a trail or in the gym!

More HTML Table Tags

Tag Description
<table> Creates a table element
<th> Creates a header cell in a <table>
<tr> Creates a row in a <table>
<td> Creates a cell for data in a <table>
<caption> Creates a caption in a <table>
<colgroup> Specifies a set of one or more columns within a <table> for formatting purposes
<col> Creates a column within a <colgroup> element
<thead> Groups the header content in a <table>
<tbody> Groups the body content in a <table>
<tfoot> Groups the footer content in a <table>