272

Is it possible to create a table without a header in Markdown?

The HTML would look like this:

<table>
<tr>
    <td>Key 1</td>
    <td>Value 1</td>
</tr>
<tr>
    <td>Key 2</td>
    <td>Value 2</td>
</tr>
</table>
0

14 Answers 14

167

If you don't mind wasting a line by leaving it empty, consider the following hack (it is a hack, and use this only if you don't like adding any additional plugins).

|   |   |
|---|---|
|__Bold Key__| Value1 |
| Normal Key | Value2 |
Bold Key Value1
Normal Key Value2

To view how the above one could look, copy the above and visit https://stackedit.io/app

It worked with GitLab/GitHub's Markdown implementations.

7
  • 2
    What implementation does that work with? It doesn't work with Perl's Text::MultiMarkdown but I think it might work with some PHP MultiMarkdown implementations. Commented Feb 5, 2015 at 16:41
  • 2
    It worked with gitlab/github's markdown implementations. I am not sure about perl's Text::MultiMarkdown Commented Feb 6, 2015 at 5:16
  • 51
    This will create an empty table header and an empty row.
    – Gajus
    Commented Dec 29, 2015 at 0:25
  • 1
    This actually works great with pandoc markdown to pdf. Commented Jan 25, 2019 at 14:35
  • 1
    Thanks! This works with Laravel 5.8 (multi) markdown as well. No headers are visible - only a line. Looks like a divider, which may can be removed using some CSS in the theme.
    – checker284
    Commented Jun 25, 2019 at 18:43
164

Most Markdown parsers don't support tables without headers. That means the separation line for headers is mandatory.

Parsers that do not support tables without headers

Parsers that do support tables without headers.

CSS solution

If you're able to change the CSS of the HTML output you can however leverage the :empty pseudo class to hide an empty header and make it look like there is no header at all.

2
44

Universal Solution

Many of the suggestions unfortunately do not work for all Markdown viewers/editors, for instance, the popular Markdown Viewer Chrome extension, but they do work with iA Writer.

What does seem to work across both of these popular programs (and might work for your particular application) is to use HTML comment blocks ('<!-- -->'):

| <!-- -->    | <!-- -->    |
|-------------|-------------|
| Foo         | Bar         |
Foo Bar

Like some of the earlier suggestions stated, this does add an empty header row in your Markdown viewer/editor. In iA Writer, it's aesthetically small enough that it doesn't get in my way too much.

12
  • 1
    This completely defats the point of using Markdown, as when viewed as text-only, the comments will be stripped and the columns won't even align anymore.
    – hackel
    Commented May 3, 2020 at 5:50
  • 4
    I think @hackel misunderstood. This does not align the columns using fixed widths. Rather, it gives a nice workaround to have valid but empty column headers. It was a great workaround in my situation. The table still rendered as intended/expected; it simply had no header row.
    – mdahlman
    Commented May 11, 2020 at 20:32
  • 2
    Nice, yet this really isn't a universal solution
    – Ulysse BN
    Commented Apr 19, 2021 at 7:41
  • 1
    This will create an empty table header and an empty row.
    – 41 72 6c
    Commented Jun 30, 2021 at 12:49
  • 1
    @TonyBarganski I must have missed a typo. You are right it does work. And actually without the <!-- --> in the header line. Leaving empty spaces
    – theking2
    Commented Feb 10, 2022 at 15:52
20

I got this working with Bitbucket's Markdown by using a empty link:

[]()  | 
------|------
Row 1 | row 2
3
  • 2
    Will also prompt an empty header line. At least its only half the height as an normal line. Worked for me as Hack in github too
    – Londane
    Commented Jul 12, 2016 at 20:49
  • This hack worked for me when writing documentation in Insomnia. Still creates a header line, but it's a lot shorter than if I put text in there. Thanks! Commented Apr 2, 2018 at 20:25
  • Brilliant! I still see a little vertical space with Github Markdown, but it's better than before. Commented Oct 1, 2019 at 12:14
18

At least for the GitHub Flavoured Markdown, you can give the illusion by making all the non‑header row entries bold with the regular __ or ** formatting:

|Regular | text | in header | turns bold |
|-|-|-|-|
| __So__ | __bold__ | __all__ | __table entries__ |
| __and__ | __it looks__ | __like a__ | __"headerless table"__ |
Regular text in header turns bold
So bold all table entries
and it looks like a "headerless table"
4
  • I was looking for something that'd work in GFM and this hack is a creative one!
    – Mrchief
    Commented Jun 29, 2019 at 15:03
  • There's a problem when rendered tables have a different color for header row (e.g. StackExchange).
    – Ruslan
    Commented Apr 17, 2021 at 12:19
  • 2
    By default, the header texts are center aligned, you may want to align them to the left if you don't want the header to standout. In your second line, change it to |:-|:-|:-|:-| Commented Apr 28, 2022 at 11:11
  • To perfect the illusion, you should also make the text outside the table bold so that the table won't stand out 😃. Commented Jun 3 at 9:03
12

You may be able to hide a heading if you can add the following CSS:

<style>
    th {
        display: none;
    }
</style>

This is a bit heavy-handed and doesn’t distinguish between tables, but it may do for a simple task.

Update

HTML output varies between Markdown editors, but if the table includes a thead element, you can target the empty header cells more specifically with:

thead th:empty {
    border: thin solid red !important;
    display: none;
}

This works if your header row contains no visible content. Spaces between the bars are OK.

1
10

Omitting the header above the divider produces a headerless table in at least Perl Text::MultiMarkdown and in FletcherPenney MultiMarkdown

|-------------|--------|
|**Name:**    |John Doe|
|**Position:**|CEO     |

See PHP Markdown feature request


Empty headers in PHP Parsedown produce tables with empty headers that are usually invisible (depending on your CSS) and so look like headerless tables.

|     |     |
|-----|-----|
|Foo  |37   |
|Bar  |101  |
2
  • About the use of Parsedown, actually the header is still here, just check the HTML. If you have a CSS padding on cells you will see the header cells. But I guess that table th:empty { padding: 0; } would fix that.
    – AymDev
    Commented Sep 15, 2018 at 15:09
  • All of these is now included in adius' answer.
    – Olivier
    Commented Mar 20, 2023 at 7:51
8

The following works well for me in GitHub. The first row is no longer bolded as it is not a header:

<table align="center">
    <tr>
        <td align="center"><img src="docs/img1.png?raw=true" alt="some text"></td>
        <td align="center">Some other text</td>
        <td align="center">More text</td>
    </tr>
    <tr>
        <td align="center"><img src="docs/img2.png?raw=true" alt="some text"></td>
        <td align="center">Some other text 2</td>
        <td align="center">More text 2</td>
    </tr>
</table>

Check a sample HTML table without a header here.

2
4
$ cat foo.md
Key 1 | Value 1
Key 2 | Value 2
$ kramdown foo.md
<table>
  <tbody>
    <tr>
      <td>Key 1</td>
      <td>Value 1</td>
    </tr>
    <tr>
      <td>Key 2</td>
      <td>Value 2</td>
    </tr>
  </tbody>
</table>
1
  • 1
    This seems not to work with github.com/chjj/marked . Is there a reference, in which I can look up if this is even the expected behavior?
    – adius
    Commented Jul 9, 2013 at 7:50
2
<style>
    .headerless th {
        display: none;
    }
</style>

<div class="headerless">

| | |
|---|---|
|Some |table |
| WITHOUT | header |
</div>

|This|is|
|---|---|
|Some |table |
| WITH |header |
1
  • Remember that Stack Overflow isn't just intended to solve the immediate problem, but also to help future readers find solutions to similar problems, which requires understanding the underlying code. This is especially important for members of our community who are beginners, and not familiar with the syntax. Given that, can you edit your answer to include an explanation of what you're doing and why you believe it is the best approach? Commented Nov 15, 2022 at 0:34
2

what works in GitHub issue editor is

&nbsp; |&nbsp;
------ | ---
Foo    | Bar

But it does show an empty header

   
Foo Bar
1
  • 1
    As someone with a quasi-Markdown parser that does tables I'm wondering if I should "special case" the first row being non-breaking space cells - and just suppress the header row. My target (PowerPoint slides) would happily support a headerless table. Or would this be considered a deviation too far? (I already have a section in the manual for such deviations - so could add this as "some other parsers might not...") Commented Dec 24, 2022 at 12:10
1

I use <span> in the first column header:

 <span> |
---     |    ---
Value   |  Value
Value   |  Value

It creates an empty header with border, but with 1/2 the size.

Value
Value
0

Pure CSS solution (working as of 2023-12-19 for all browsers)

  1. IF any empty ths exist, AND
  2. no any th elements with content, THEN
  3. display: none;

/* PURE CSS SOLUTION */

table > thead:has(> tr > th:empty):not(:has(> tr > th:not(:empty))) {
  display: none;
}
<h1>Compiled Markdown</h1>
<div id="markdown-compiled"></div>

<hr>

<h1>Raw Markdown</h1>
<pre><code id="markdown-raw">
<!-- OR USE MARKDOWN INLINE CSS HTML STYLE -->
<style type="text/css" rel="stylesheet">
table > thead:has(> tr > th:empty):not(:has(> tr > th:not(:empty))) {
  display: none;
}
</style>
### Empty header

|       |       |
| ----- | ----- |
| Lorem | ipsum |
| dolor | sit   |

### Header with content

|       | not empty |
| ----- | --------- |
| Lorem | ipsum     |
| dolor | sit       |


</code></pre>

<!-- !!! IGNORE THE FOLLOWING !!! -->

<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>

<style>
/* Table styling from https://dev.to/dcodeyt/creating-beautiful-html-tables-with-css-428l */

table {
  border-collapse: collapse;
  margin: 25px 0;
  font-size: 0.9em;
  font-family: sans-serif;
  min-width: 400px;
  box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
}

table thead tr {
    background-color: #009879;
    color: #ffffff;
    text-align: left;
}

table th,
table td {
    padding: 12px 15px;
}

table tbody tr {
    border-bottom: 1px solid #dddddd;
}

table tbody tr:nth-of-type(even) {
    background-color: #f3f3f3;
}

table tbody tr:last-of-type {
    border-bottom: 2px solid #009879;
}
</style>
<script>
  document.getElementById('markdown-compiled').innerHTML =
      marked.parse(document.getElementById('markdown-raw').innerHTML);
</script>

0

Adding a CSS hack (source) to this collection of workarounds:

|<span style="font-weight:normal">This is not</span>|<span style="font-weight:normal">A Header</span>|
|:--------------------------------------------------|:-----------------------------------------------|
|              Achieved using a                     | CSS hack                                       |

This works with Hoedown, the markdown parser used by Macdown.

Doesn't work for Github markdown, for this there's already a very creative solution of making all text bold so that the header doesn't stands out.

Not the answer you're looking for? Browse other questions tagged or ask your own question.