Table Titles and Figure Descriptions: Mastering HTML Captions


  1. Table Caption (<caption> element)
    This caption provides a title or description for a table. It improves accessibility by allowing screen readers to announce the caption before the table data. The <caption> element goes inside the opening <table> tag, but it should be the first child element.
<table>
  <caption>Sales Report for Q1</caption>
  </table>
  1. Figure Caption (figcaption element)
    This caption is used with the <figure> element to describe an image, figure, or other media content. Unlike table captions, <figcaption> can be placed anywhere within the <figure> element.
<figure>
  <img src="image.jpg" alt="Product image">
  <figcaption>A beautiful landscape photo.</figcaption>
</figure>
  • For layout purposes, it's recommended to use CSS for positioning elements instead of relying on tables with captions.
  • You can style captions with CSS just like any other HTML element.
  • While both captions improve accessibility, they serve different purposes. Use <caption> for tables and figcaption for figures.


Table Caption with CSS styling

This example shows a table caption with some basic CSS styling for font size and alignment:

<table>
  <caption>Products in Stock</caption>
  <tr>
    <th>Product Name</th>
    <th>Quantity</th>
  </tr>
  <tr>
    <td>T-Shirt</td>
    <td>50</td>
  </tr>
  <tr>
    <td>Mug</td>
    <td>20</td>
  </tr>
</table>

<style>
  caption {
    font-size: 1.2em;  /* Increase caption font size */
    text-align: center; /* Center align the caption text */
  }
</style>

Figure Caption with Bootstrap class

This example uses the Bootstrap class text-muted to style the caption text:

<figure class="d-flex justify-content-center">
  <img src="image.jpg" class="img-fluid" alt="Cat">
  <figcaption class="text-muted text-center">A fluffy cat napping in the sun.</figcaption>
</figure>

Nesting Captions

While not super common, you can nest captions. This example shows a figure nested within a table, each with its own caption:

<table>
  <caption>Customer Information</caption>
  <tr>
    <td>Name</td>
    <td>John Doe</td>
  </tr>
  <tr>
    <td>Image</td>
    <td>
      <figure>
        <img src="profile_pic.jpg" alt="John Doe's profile picture">
        <figcaption>John Doe's Profile Picture</figcaption>
      </figure>
    </td>
  </tr>
</table>


Headings (<h1> to <h6>)

For simple tables with a short title, you can consider using heading elements like <h1> to <h6>. However, this approach has limitations:

  • Semantics
    Headings are meant for hierarchical page structure, not specifically for captions.
  • Accessibility
    Screen readers might not announce headings as table titles unless you use aria-describedby to link the heading to the table.

Descriptive Text within the Table

For very basic tables with a self-explanatory structure, you can include a descriptive sentence within the first table row using table cells (<td>). This is not ideal for complex tables as it can affect layout.

ARIA Attributes

For more complex scenarios, you can use ARIA attributes like aria-label or aria-labelledby to associate a hidden element (like a <span>) containing the caption with the table. This improves accessibility but requires additional code and might not be visually appealing.

AlternativeAccessibilitySemanticsVisual AppealUse Case
Heading (<h1> to <h6>)Might need ARIANot idealGoodVery simple tables
Text within TableNot idealNot idealDepends on layoutBasic, self-explanatory tables
ARIA AttributesGoodRequires extra codeNot idealComplex scenarios
  • Alternatives can be considered in specific situations, but evaluate the trade-offs in terms of accessibility and code complexity.
  • The <caption> element remains the best practice for most table captions due to its semantic meaning and accessibility benefits.