🗂️ Tables in HTML
Tables in HTML are used to display data in a structured, row-column format — just like how you'd see in Excel.
Let’s break down the main parts:
🧱 <table> – The container for the entire table
This tag wraps around everything — rows, headers, data.
Think of it like the frame that holds all the table info.
🧩 <tr> – Table Row
Short for "table row"
Each row in your table goes inside one <tr> tag.
📦 <td> – Table Data Cell
This is the actual data inside the row.
Every cell (not header) is created with <td>
🏷️ <th> – Table Header
This defines the heading of a column.
Usually bold and centered by default.
✅ Example Code
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Table Anatomy</title>
<style>
.infographic-table {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
box-sizing: border-box;
margin: 0 auto;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
background: var(--paper);
color: var(--ink);
border-radius: 14px;
overflow: hidden;
}
.infographic-table[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.ha-layout { display: flex; flex-direction: column; gap: 1.5rem; }
.ha-code-wrap {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
overflow: hidden;
}
.ha-filetabs {
display: flex;
background: #161616;
border-bottom: 1px solid #2a2a2a;
}
.ha-filetab {
border: none;
background: transparent;
color: #8a8a8a;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.78rem;
font-weight: 700;
padding: 0.6rem 1rem;
cursor: pointer;
border-bottom: 2px solid #5b8def;
}
.ha-code {
padding: 1rem 1.8rem 1rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.8rem;
line-height: 1.8;
overflow-x: auto;
}
.ha-line {
display: block;
white-space: pre;
color: #8a8a8a;
border-radius: 5px;
padding: 0.05rem 0.4rem;
}
.ha-line.ha-clickable {
cursor: pointer;
color: #e5e5e5;
transition: background 0.15s ease, box-shadow 0.15s ease;
}
.ha-line.ha-clickable:hover { background: #1c2333; }
.ha-line.ha-active {
background: #1c2333;
box-shadow: inset 3px 0 0 #5b8def;
color: #ffffff;
}
.ha-tag { color: #60a5fa; font-weight: 700; }
.ha-attr { color: #f2b96b; }
.ha-str { color: #9ece6a; }
.ha-th-tag { color: #f472b6; font-weight: 700; }
.ha-browser {
border: 1px solid var(--line);
border-radius: 10px;
overflow: hidden;
background: var(--paper);
}
.ha-browser-bar {
background: var(--paper-alt);
padding: 0.5rem 0.7rem;
display: flex;
align-items: center;
gap: 0.5rem;
border-bottom: 1px solid var(--line);
}
.ha-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line); }
.ha-tab {
background: var(--paper);
border: 1px solid var(--line);
border-bottom: none;
border-radius: 6px 6px 0 0;
font-size: 0.72rem;
color: var(--ink-soft);
padding: 0.25rem 0.6rem;
}
.ha-urlrow {
background: var(--paper-alt);
padding: 0.35rem 0.7rem 0.6rem;
font-size: 0.72rem;
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
}
.ha-screen {
background: #ffffff;
color: #111;
padding: 1.2rem 1.4rem 1.4rem;
font-family: Georgia, "Times New Roman", serif;
}
.ha-out-table { border-collapse: collapse; font-size: 0.88rem; }
.ha-out-table th, .ha-out-table td {
border: 1px solid #111;
padding: 0.25rem 0.6rem;
transition: background 0.2s ease, outline 0.2s ease;
}
.ha-out-th { font-weight: 700; }
.ha-out-lit { background: var(--accent-soft); outline: 2px solid var(--accent); outline-offset: -2px; }
</style>
</head>
<body>
<div class="infographic-table" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-code-wrap">
<div class="ha-filetabs">
<button class="ha-filetab">index.html</button>
</div>
<div class="ha-code">
<span class="ha-line"><<span class="ha-tag">table</span> <span class="ha-attr">border</span>=<span class="ha-str">"1"</span>></span>
<span class="ha-line ha-clickable" data-part="head"> <<span class="ha-tag">tr</span>></span>
<span class="ha-line ha-clickable" data-part="head"> <<span class="ha-th-tag">th</span>>Name</<span class="ha-th-tag">th</span>></span>
<span class="ha-line ha-clickable" data-part="head"> <<span class="ha-th-tag">th</span>>Age</<span class="ha-th-tag">th</span>></span>
<span class="ha-line ha-clickable" data-part="head"> <<span class="ha-th-tag">th</span>>City</<span class="ha-th-tag">th</span>></span>
<span class="ha-line ha-clickable" data-part="head"> </<span class="ha-tag">tr</span>></span>
<span class="ha-line ha-clickable" data-part="row1"> <<span class="ha-tag">tr</span>></span>
<span class="ha-line ha-clickable" data-part="row1"> <<span class="ha-tag">td</span>>Aliya</<span class="ha-tag">td</span>></span>
<span class="ha-line ha-clickable" data-part="row1"> <<span class="ha-tag">td</span>>22</<span class="ha-tag">td</span>></span>
<span class="ha-line ha-clickable" data-part="row1"> <<span class="ha-tag">td</span>>Delhi</<span class="ha-tag">td</span>></span>
<span class="ha-line ha-clickable" data-part="row1"> </<span class="ha-tag">tr</span>></span>
<span class="ha-line ha-clickable" data-part="row2"> <<span class="ha-tag">tr</span>></span>
<span class="ha-line ha-clickable" data-part="row2"> <<span class="ha-tag">td</span>>Rehan</<span class="ha-tag">td</span>></span>
<span class="ha-line ha-clickable" data-part="row2"> <<span class="ha-tag">td</span>>25</<span class="ha-tag">td</span>></span>
<span class="ha-line ha-clickable" data-part="row2"> <<span class="ha-tag">td</span>>Mumbai</<span class="ha-tag">td</span>></span>
<span class="ha-line ha-clickable" data-part="row2"> </<span class="ha-tag">tr</span>></span>
<span class="ha-line"></<span class="ha-tag">table</span>></span>
</div>
</div>
<div class="ha-browser">
<div class="ha-browser-bar">
<span class="ha-dot"></span><span class="ha-dot"></span><span class="ha-dot"></span>
<div class="ha-tab">🌐 Basic Table</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/basicstructure.html</div>
<div class="ha-screen">
<table class="ha-out-table">
<tr id="row-head">
<th class="ha-out-th">Name</th>
<th class="ha-out-th">Age</th>
<th class="ha-out-th">City</th>
</tr>
<tr id="row-row1">
<td>Aliya</td>
<td>22</td>
<td>Delhi</td>
</tr>
<tr id="row-row2">
<td>Rehan</td>
<td>25</td>
<td>Mumbai</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('ha-root');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
(function () {
const outMap = { head: 'row-head', row1: 'row-row1', row2: 'row-row2' };
document.querySelectorAll('.ha-line.ha-clickable').forEach(line => {
line.addEventListener('click', () => {
const part = line.getAttribute('data-part');
document.querySelectorAll('.ha-line').forEach(l => {
l.classList.toggle('ha-active', l.getAttribute('data-part') === part);
});
document.querySelectorAll('#row-head td, #row-head th, #row-row1 td, #row-row2 td').forEach(cell => cell.classList.remove('ha-out-lit'));
const row = document.getElementById(outMap[part]);
row.querySelectorAll('td, th').forEach(cell => cell.classList.add('ha-out-lit'));
});
});
})();
</script>
</body>
</html>.demo {
font-family: system-ui, sans-serif;
padding: 16px;
}
.demo h1 {
color: #2563eb;
margin: 0 0 8px;
}
.demo p {
color: #4b5563;
margin: 0;
}document.querySelector('.demo h1')?.addEventListener('click', () => {
alert('Hello from live preview!');
});🔍 Result:
Name | Age | City |
|---|---|---|
Aliya | 22 | Delhi |
Rehan | 25 | Mumbai |
✅ What are rowspan and colspan?
Attribute | Purpose |
|---|---|
| Merges rows (vertical merge) |
| Merges columns (horizontal merge) |
Example with rowspan
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Rowspan Anatomy</title>
<style>
.infographic-rowspan {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
box-sizing: border-box;
margin: 0 auto;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
background: var(--paper);
color: var(--ink);
border-radius: 14px;
overflow: hidden;
}
.infographic-rowspan[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.ha-layout { display: flex; flex-direction: column; gap: 1.5rem; }
.ha-code-wrap {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
overflow: hidden;
}
.ha-filetabs {
display: flex;
background: #161616;
border-bottom: 1px solid #2a2a2a;
}
.ha-filetab {
border: none;
background: transparent;
color: #8a8a8a;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.78rem;
font-weight: 700;
padding: 0.6rem 1rem;
cursor: pointer;
border-bottom: 2px solid #5b8def;
}
.ha-code {
padding: 1rem 1.8rem 1rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.82rem;
line-height: 1.8;
overflow-x: auto;
}
.ha-line {
display: block;
white-space: pre;
color: #8a8a8a;
border-radius: 5px;
padding: 0.05rem 0.4rem;
}
.ha-line.ha-clickable {
cursor: pointer;
color: #e5e5e5;
transition: background 0.15s ease, box-shadow 0.15s ease;
}
.ha-line.ha-clickable:hover { background: #1c2333; }
.ha-line.ha-active {
background: #1c2333;
box-shadow: inset 3px 0 0 #5b8def;
color: #ffffff;
}
.ha-tag { color: #60a5fa; font-weight: 700; }
.ha-attr { color: #f2b96b; }
.ha-str { color: #9ece6a; }
.ha-th-tag { color: #f472b6; font-weight: 700; }
.ha-span-attr { color: #ffd166; font-weight: 800; }
.ha-span-val { color: #ffd166; font-weight: 800; }
.ha-browser {
border: 1px solid var(--line);
border-radius: 10px;
overflow: hidden;
background: var(--paper);
}
.ha-browser-bar {
background: var(--paper-alt);
padding: 0.5rem 0.7rem;
display: flex;
align-items: center;
gap: 0.5rem;
border-bottom: 1px solid var(--line);
}
.ha-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line); }
.ha-tab {
background: var(--paper);
border: 1px solid var(--line);
border-bottom: none;
border-radius: 6px 6px 0 0;
font-size: 0.72rem;
color: var(--ink-soft);
padding: 0.25rem 0.6rem;
}
.ha-urlrow {
background: var(--paper-alt);
padding: 0.35rem 0.7rem 0.6rem;
font-size: 0.72rem;
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
}
.ha-screen {
background: #ffffff;
color: #111;
padding: 1.2rem 1.4rem 1.4rem;
font-family: Georgia, "Times New Roman", serif;
}
.ha-out-table { border-collapse: collapse; font-size: 0.9rem; }
.ha-out-table th, .ha-out-table td {
border: 1px solid #111;
padding: 0.3rem 0.7rem;
transition: background 0.2s ease, outline 0.2s ease;
}
.ha-out-th { font-weight: 700; }
.ha-out-lit { background: var(--accent-soft); outline: 2px solid var(--accent); outline-offset: -2px; }
</style>
</head>
<body>
<div class="infographic-rowspan" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-code-wrap">
<div class="ha-filetabs">
<button class="ha-filetab">index.html</button>
</div>
<div class="ha-code">
<span class="ha-line"><<span class="ha-tag">table</span> <span class="ha-attr">border</span>=<span class="ha-str">"1"</span>></span>
<span class="ha-line"> <<span class="ha-tag">tr</span>></span>
<span class="ha-line ha-clickable" data-part="name"> <<span class="ha-th-tag">th</span>>Name</<span class="ha-th-tag">th</span>></span>
<span class="ha-line ha-clickable ha-active" data-part="age"> <<span class="ha-th-tag">th</span> <span class="ha-span-attr">rowspan</span>=<span class="ha-str">"<span class="ha-span-val">2</span>"</span>>Age</<span class="ha-th-tag">th</span>></span>
<span class="ha-line"> </<span class="ha-tag">tr</span>></span>
<span class="ha-line"> <<span class="ha-tag">tr</span>></span>
<span class="ha-line ha-clickable" data-part="alice"> <<span class="ha-tag">td</span>>Alice</<span class="ha-tag">td</span>></span>
<span class="ha-line"> </<span class="ha-tag">tr</span>></span>
<span class="ha-line"></<span class="ha-tag">table</span>></span>
</div>
</div>
<div class="ha-browser">
<div class="ha-browser-bar">
<span class="ha-dot"></span><span class="ha-dot"></span><span class="ha-dot"></span>
<div class="ha-tab">🌐 127.0.0.1:5500/html</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/html</div>
<div class="ha-screen">
<table class="ha-out-table">
<tr>
<th class="ha-out-th" id="out-name">Name</th>
<th class="ha-out-th ha-out-lit" id="out-age" rowspan="2">Age</th>
</tr>
<tr>
<td id="out-alice">Alice</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('ha-root');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
(function () {
const outMap = { name: 'out-name', age: 'out-age', alice: 'out-alice' };
document.querySelectorAll('.ha-line.ha-clickable').forEach(line => {
line.addEventListener('click', () => {
const part = line.getAttribute('data-part');
document.querySelectorAll('.ha-line').forEach(l => {
l.classList.toggle('ha-active', l.getAttribute('data-part') === part);
});
document.querySelectorAll('#out-name, #out-age, #out-alice').forEach(el => el.classList.remove('ha-out-lit'));
document.getElementById(outMap[part]).classList.add('ha-out-lit');
});
});
})();
</script>
</body>
</html>.demo {
font-family: system-ui, sans-serif;
padding: 16px;
}
.demo h1 {
color: #2563eb;
margin: 0 0 8px;
}
.demo p {
color: #4b5563;
margin: 0;
}document.querySelector('.demo h1')?.addEventListener('click', () => {
alert('Hello from live preview!');
});Explanation: Age spans 2 rows.
Example with colspan
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Colspan Anatomy</title>
<style>
.infographic-colspan {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
box-sizing: border-box;
margin: 0 auto;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
background: var(--paper);
color: var(--ink);
border-radius: 14px;
overflow: hidden;
}
.infographic-colspan[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.ha-layout { display: flex; flex-direction: column; gap: 1.5rem; }
.ha-code-wrap {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
overflow: hidden;
}
.ha-filetabs {
display: flex;
background: #161616;
border-bottom: 1px solid #2a2a2a;
}
.ha-filetab {
border: none;
background: transparent;
color: #8a8a8a;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.78rem;
font-weight: 700;
padding: 0.6rem 1rem;
cursor: pointer;
border-bottom: 2px solid #5b8def;
}
.ha-code {
padding: 1rem 1.8rem 1rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.82rem;
line-height: 1.8;
overflow-x: auto;
}
.ha-line {
display: block;
white-space: pre;
color: #8a8a8a;
border-radius: 5px;
padding: 0.05rem 0.4rem;
}
.ha-line.ha-clickable {
cursor: pointer;
color: #e5e5e5;
transition: background 0.15s ease, box-shadow 0.15s ease;
}
.ha-line.ha-clickable:hover { background: #1c2333; }
.ha-line.ha-active {
background: #1c2333;
box-shadow: inset 3px 0 0 #5b8def;
color: #ffffff;
}
.ha-tag { color: #60a5fa; font-weight: 700; }
.ha-attr { color: #f2b96b; }
.ha-str { color: #9ece6a; }
.ha-th-tag { color: #f472b6; font-weight: 700; }
.ha-span-attr { color: #ffd166; font-weight: 800; }
.ha-span-val { color: #ffd166; font-weight: 800; }
.ha-browser {
border: 1px solid var(--line);
border-radius: 10px;
overflow: hidden;
background: var(--paper);
}
.ha-browser-bar {
background: var(--paper-alt);
padding: 0.5rem 0.7rem;
display: flex;
align-items: center;
gap: 0.5rem;
border-bottom: 1px solid var(--line);
}
.ha-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line); }
.ha-tab {
background: var(--paper);
border: 1px solid var(--line);
border-bottom: none;
border-radius: 6px 6px 0 0;
font-size: 0.72rem;
color: var(--ink-soft);
padding: 0.25rem 0.6rem;
}
.ha-urlrow {
background: var(--paper-alt);
padding: 0.35rem 0.7rem 0.6rem;
font-size: 0.72rem;
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
}
.ha-screen {
background: #ffffff;
color: #111;
padding: 1.2rem 1.4rem 1.4rem;
font-family: Georgia, "Times New Roman", serif;
}
.ha-out-table { border-collapse: collapse; font-size: 0.9rem; }
.ha-out-table th, .ha-out-table td {
border: 1px solid #111;
padding: 0.3rem 0.7rem;
transition: background 0.2s ease, outline 0.2s ease;
}
.ha-out-th { font-weight: 700; text-align: center; }
.ha-out-lit { background: var(--accent-soft); outline: 2px solid var(--accent); outline-offset: -2px; }
</style>
</head>
<body>
<div class="infographic-colspan" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-code-wrap">
<div class="ha-filetabs">
<button class="ha-filetab">index.html</button>
</div>
<div class="ha-code">
<span class="ha-line"><<span class="ha-tag">table</span> <span class="ha-attr">border</span>=<span class="ha-str">"1"</span>></span>
<span class="ha-line"> <<span class="ha-tag">tr</span>></span>
<span class="ha-line ha-clickable ha-active" data-part="header"> <<span class="ha-th-tag">th</span> <span class="ha-span-attr">colspan</span>=<span class="ha-str">"<span class="ha-span-val">2</span>"</span>>User Info</<span class="ha-th-tag">th</span>></span>
<span class="ha-line"> </<span class="ha-tag">tr</span>></span>
<span class="ha-line"> <<span class="ha-tag">tr</span>></span>
<span class="ha-line ha-clickable" data-part="name"> <<span class="ha-tag">td</span>>Name</<span class="ha-tag">td</span>></span>
<span class="ha-line ha-clickable" data-part="alice"> <<span class="ha-tag">td</span>>Alice</<span class="ha-tag">td</span>></span>
<span class="ha-line"> </<span class="ha-tag">tr</span>></span>
<span class="ha-line"></<span class="ha-tag">table</span>></span>
</div>
</div>
<div class="ha-browser">
<div class="ha-browser-bar">
<span class="ha-dot"></span><span class="ha-dot"></span><span class="ha-dot"></span>
<div class="ha-tab">🌐 127.0.0.1:5500/html</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/html</div>
<div class="ha-screen">
<table class="ha-out-table">
<tr>
<th class="ha-out-th ha-out-lit" id="out-header" colspan="2">User Info</th>
</tr>
<tr>
<td id="out-name">Name</td>
<td id="out-alice">Alice</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('ha-root');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
(function () {
const outMap = { header: 'out-header', name: 'out-name', alice: 'out-alice' };
document.querySelectorAll('.ha-line.ha-clickable').forEach(line => {
line.addEventListener('click', () => {
const part = line.getAttribute('data-part');
document.querySelectorAll('.ha-line').forEach(l => {
l.classList.toggle('ha-active', l.getAttribute('data-part') === part);
});
document.querySelectorAll('#out-header, #out-name, #out-alice').forEach(el => el.classList.remove('ha-out-lit'));
document.getElementById(outMap[part]).classList.add('ha-out-lit');
});
});
})();
</script>
</body>
</html>.demo {
font-family: system-ui, sans-serif;
padding: 16px;
}
.demo h1 {
color: #2563eb;
margin: 0 0 8px;
}
.demo p {
color: #4b5563;
margin: 0;
}document.querySelector('.demo h1')?.addEventListener('click', () => {
alert('Hello from live preview!');
});✅ Combined Example
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Rowspan + Colspan Anatomy</title>
<style>
.infographic-combospan {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
box-sizing: border-box;
margin: 0 auto;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
background: var(--paper);
color: var(--ink);
border-radius: 14px;
overflow: hidden;
}
.infographic-combospan[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.ha-layout { display: flex; flex-direction: column; gap: 1.5rem; }
.ha-code-wrap {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
overflow: hidden;
}
.ha-filetabs {
display: flex;
background: #161616;
border-bottom: 1px solid #2a2a2a;
}
.ha-filetab {
border: none;
background: transparent;
color: #8a8a8a;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.78rem;
font-weight: 700;
padding: 0.6rem 1rem;
cursor: pointer;
border-bottom: 2px solid #5b8def;
}
.ha-code {
padding: 1rem 1.8rem 1rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.8rem;
line-height: 1.8;
overflow-x: auto;
}
.ha-line {
display: block;
white-space: pre;
color: #8a8a8a;
border-radius: 5px;
padding: 0.05rem 0.4rem;
}
.ha-line.ha-clickable {
cursor: pointer;
color: #e5e5e5;
transition: background 0.15s ease, box-shadow 0.15s ease;
}
.ha-line.ha-clickable:hover { background: #1c2333; }
.ha-line.ha-active {
background: #1c2333;
box-shadow: inset 3px 0 0 #5b8def;
color: #ffffff;
}
.ha-tag { color: #60a5fa; font-weight: 700; }
.ha-attr { color: #f2b96b; }
.ha-str { color: #9ece6a; }
.ha-th-tag { color: #f472b6; font-weight: 700; }
.ha-span-attr { color: #ffd166; font-weight: 800; }
.ha-span-val { color: #ffd166; font-weight: 800; }
.ha-browser {
border: 1px solid var(--line);
border-radius: 10px;
overflow: hidden;
background: var(--paper);
}
.ha-browser-bar {
background: var(--paper-alt);
padding: 0.5rem 0.7rem;
display: flex;
align-items: center;
gap: 0.5rem;
border-bottom: 1px solid var(--line);
}
.ha-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--line); }
.ha-tab {
background: var(--paper);
border: 1px solid var(--line);
border-bottom: none;
border-radius: 6px 6px 0 0;
font-size: 0.72rem;
color: var(--ink-soft);
padding: 0.25rem 0.6rem;
}
.ha-urlrow {
background: var(--paper-alt);
padding: 0.35rem 0.7rem 0.6rem;
font-size: 0.72rem;
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
}
.ha-screen {
background: #ffffff;
color: #111;
padding: 1.2rem 1.4rem 1.4rem;
font-family: Georgia, "Times New Roman", serif;
}
.ha-out-table { border-collapse: collapse; font-size: 0.88rem; }
.ha-out-table th, .ha-out-table td {
border: 1px solid #111;
padding: 0.28rem 0.65rem;
transition: background 0.2s ease, outline 0.2s ease;
}
.ha-out-th { font-weight: 700; text-align: center; }
.ha-out-lit { background: var(--accent-soft); outline: 2px solid var(--accent); outline-offset: -2px; }
</style>
</head>
<body>
<div class="infographic-combospan" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-code-wrap">
<div class="ha-filetabs">
<button class="ha-filetab">index.html</button>
</div>
<div class="ha-code">
<span class="ha-line"><<span class="ha-tag">table</span> <span class="ha-attr">border</span>=<span class="ha-str">"1"</span>></span>
<span class="ha-line"> <<span class="ha-tag">tr</span>></span>
<span class="ha-line ha-clickable ha-active" data-part="name"> <<span class="ha-th-tag">th</span> <span class="ha-span-attr">rowspan</span>=<span class="ha-str">"<span class="ha-span-val">2</span>"</span>>Name</<span class="ha-th-tag">th</span>></span>
<span class="ha-line ha-clickable" data-part="details"> <<span class="ha-th-tag">th</span> <span class="ha-span-attr">colspan</span>=<span class="ha-str">"<span class="ha-span-val">2</span>"</span>>Details</<span class="ha-th-tag">th</span>></span>
<span class="ha-line"> </<span class="ha-tag">tr</span>></span>
<span class="ha-line"> <<span class="ha-tag">tr</span>></span>
<span class="ha-line ha-clickable" data-part="age"> <<span class="ha-th-tag">th</span>>Age</<span class="ha-th-tag">th</span>></span>
<span class="ha-line ha-clickable" data-part="city"> <<span class="ha-th-tag">th</span>>City</<span class="ha-th-tag">th</span>></span>
<span class="ha-line"> </<span class="ha-tag">tr</span>></span>
<span class="ha-line"> <<span class="ha-tag">tr</span>></span>
<span class="ha-line ha-clickable" data-part="alice"> <<span class="ha-tag">td</span>>Alice</<span class="ha-tag">td</span>></span>
<span class="ha-line ha-clickable" data-part="24"> <<span class="ha-tag">td</span>>24</<span class="ha-tag">td</span>></span>
<span class="ha-line ha-clickable" data-part="delhi"> <<span class="ha-tag">td</span>>Delhi</<span class="ha-tag">td</span>></span>
<span class="ha-line"> </<span class="ha-tag">tr</span>></span>
<span class="ha-line"></<span class="ha-tag">table</span>></span>
</div>
</div>
<div class="ha-browser">
<div class="ha-browser-bar">
<span class="ha-dot"></span><span class="ha-dot"></span><span class="ha-dot"></span>
<div class="ha-tab">🌐 127.0.0.1:5500/html</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/html</div>
<div class="ha-screen">
<table class="ha-out-table">
<tr>
<th class="ha-out-th ha-out-lit" id="out-name" rowspan="2">Name</th>
<th class="ha-out-th" id="out-details" colspan="2">Details</th>
</tr>
<tr>
<th class="ha-out-th" id="out-age">Age</th>
<th class="ha-out-th" id="out-city">City</th>
</tr>
<tr>
<td id="out-alice">Alice</td>
<td id="out-24">24</td>
<td id="out-delhi">Delhi</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.getElementById('ha-root');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
(function () {
const outMap = {
name: 'out-name', details: 'out-details', age: 'out-age', city: 'out-city',
alice: 'out-alice', '24': 'out-24', delhi: 'out-delhi'
};
const allIds = Object.values(outMap);
document.querySelectorAll('.ha-line.ha-clickable').forEach(line => {
line.addEventListener('click', () => {
const part = line.getAttribute('data-part');
document.querySelectorAll('.ha-line').forEach(l => {
l.classList.toggle('ha-active', l.getAttribute('data-part') === part);
});
allIds.forEach(id => document.getElementById(id).classList.remove('ha-out-lit'));
document.getElementById(outMap[part]).classList.add('ha-out-lit');
});
});
})();
</script>
</body>
</html>.demo {
font-family: system-ui, sans-serif;
padding: 16px;
}
.demo h1 {
color: #2563eb;
margin: 0 0 8px;
}
.demo p {
color: #4b5563;
margin: 0;
}document.querySelector('.demo h1')?.addEventListener('click', () => {
alert('Hello from live preview!');
});✨ Pro Tips
You can add border, cellpadding, cellspacing, and styles using CSS to make it look better.
Always use <th> for headings — it improves accessibility and SEO.