🧐 Tags and Elements
If you’re new to web development, these two words will pop up a lot. They might seem a little confusing at first, but once you understand them, everything starts to make sense.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tag vs Element</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Newsreader:ital,opsz,wght@0,6..72,500;0,6..72,600;1,6..72,500&family=Inter:wght@400;500;600&family=IBM+Plex+Mono:wght@500&display=swap');
.infographic-tve {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #faf8f4;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-deep:#1741a6;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--display-font: 'Newsreader', serif;
--body-font: 'Inter', sans-serif;
--mono-font: 'IBM Plex Mono', monospace;
font-family: var(--body-font);
color: var(--ink);
max-width: 880px;
margin: 0 auto;
box-sizing: border-box;
background: transparent;
}
.infographic-tve[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-deep:#8fb3ff;
--accent-soft:#202942;
--line: #2c313d;
}
.infographic-tve * { box-sizing: border-box; }
.infographic-tve .tve-kicker {
font-family: var(--mono-font);
font-size: 0.72rem;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--accent);
margin: 0 0 0.4rem;
}
.infographic-tve h1 {
font-family: var(--display-font);
font-weight: 600;
font-size: clamp(1.6rem, 4vw, 2.2rem);
margin: 0 0 0.5rem;
line-height: 1.15;
color: var(--ink);
}
.infographic-tve .tve-sub {
color: var(--ink-soft);
font-size: 0.95rem;
margin: 0 0 2rem;
text-align: center;
}
/* ---- the markup specimen ---- */
.tve-specimen-wrap {
background: var(--paper-alt);
border: 1px solid var(--line);
padding: clamp(1.25rem, 4vw, 2rem);
margin-bottom: 1.5rem;
overflow-x: auto;
transition: background 0.2s ease, border-color 0.2s ease;
}
.tve-specimen {
font-family: var(--mono-font);
font-size: clamp(0.95rem, 2.6vw, 1.25rem);
white-space: nowrap;
display: inline-block;
color: var(--ink);
}
.tve-specimen span { transition: background 0.15s, color 0.15s; padding: 0.1em 0; }
.tve-specimen .tve-bracket { color: var(--ink-soft); }
.tve-specimen [data-part] { cursor: pointer; border-radius: 2px; }
.tve-specimen [data-part]:not(.is-active) { opacity: 0.5; }
.tve-specimen [data-part].is-active { background: var(--accent-soft); color: var(--accent-deep); opacity: 1; }
.tve-specimen .tve-wrap-element { display: inline; }
.tve-specimen .tve-wrap-element.is-active-outer { box-shadow: 0 2px 0 var(--accent); }
/* ---- legend / parts list ---- */
.tve-legend {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 0.6rem;
margin-bottom: 2.25rem;
}
.tve-legend-item {
display: flex;
align-items: flex-start;
gap: 0.65rem;
border: 1px solid var(--line);
background: var(--paper);
padding: 0.85rem 0.9rem;
cursor: pointer;
text-align: left;
font: inherit;
color: var(--ink);
border-left: 3px solid transparent;
transition: border-color 0.15s, background 0.15s;
}
.tve-legend-item:hover { border-color: var(--line); }
.tve-legend-item.is-active { border-left-color: var(--accent); background: var(--accent-soft); }
.tve-legend-swatch {
flex: 0 0 auto;
width: 0.85rem; height: 0.85rem;
border-radius: 50%;
margin-top: 0.25rem;
background: var(--ink-soft);
transition: background 0.15s;
}
.tve-legend-item.is-active .tve-legend-swatch { background: var(--accent); }
.tve-legend-text strong { display: block; font-size: 0.88rem; margin-bottom: 0.15rem; color: var(--ink); }
.tve-legend-text span { font-size: 0.8rem; color: var(--ink-soft); line-height: 1.35; }
@media (max-width: 560px) {
.tve-legend { grid-template-columns: 1fr; }
}
@media (prefers-reduced-motion: reduce) {
.infographic-tve *, .infographic-tve *::before, .infographic-tve *::after {
transition-duration: 0.001ms !important;
}
}
</style>
</head>
<body>
<div class="infographic-tve">
<p class="tve-sub">Click any piece of the markup below — or a label — to see exactly what it refers to.</p>
<div class="tve-specimen-wrap">
<div class="tve-specimen" id="tve-specimen">
<span class="tve-wrap-element" data-part="element" id="tve-element-wrap">
<span data-part="opening-tag"><p></span><span data-part="content">Hello, world!</span><span data-part="closing-tag"></p></span>
</span>
</div>
</div>
<div class="tve-legend">
<button class="tve-legend-item" data-part="element">
<span class="tve-legend-swatch"></span>
<span class="tve-legend-text"><strong>Element</strong><span>Everything: opening tag, content, and closing tag together</span></span>
</button>
<button class="tve-legend-item" data-part="opening-tag">
<span class="tve-legend-swatch"></span>
<span class="tve-legend-text"><strong>Opening tag</strong><span>The tag name wrapped in < >, marks where the element starts</span></span>
</button>
<button class="tve-legend-item" data-part="closing-tag">
<span class="tve-legend-swatch"></span>
<span class="tve-legend-text"><strong>Closing tag</strong><span>Same name with a slash, marks where the element ends</span></span>
</button>
<button class="tve-legend-item" data-part="content">
<span class="tve-legend-swatch"></span>
<span class="tve-legend-text"><strong>Content</strong><span>What sits between the two tags</span></span>
</button>
</div>
</div>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-tve')
|| document.querySelector('.infographic-tve');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') {
dark = true;
} else if (bodyAttr === 'false') {
dark = false;
} else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
})();
(function() {
var specimenEl = document.getElementById('tve-specimen');
var legendItems = document.querySelectorAll('.infographic-tve .tve-legend-item');
function clearSpecimen() {
specimenEl.querySelectorAll('[data-part]').forEach(function(el) {
el.classList.remove('is-active');
});
}
function activatePart(part) {
clearSpecimen();
legendItems.forEach(function(item) {
item.classList.toggle('is-active', item.dataset.part === part);
});
if (part === 'element') {
// highlight every sub-part to show the element is the whole thing
specimenEl.querySelectorAll('[data-part]').forEach(function(el) {
el.classList.add('is-active');
});
} else {
specimenEl.querySelectorAll('[data-part="' + part + '"]').forEach(function(el) {
el.classList.add('is-active');
});
}
}
legendItems.forEach(function(item) {
item.addEventListener('click', function() {
var alreadyActive = item.classList.contains('is-active');
if (alreadyActive) {
clearSpecimen();
legendItems.forEach(function(i) { i.classList.remove('is-active'); });
} else {
activatePart(item.dataset.part);
}
});
});
// clicking directly on the specimen also works
specimenEl.querySelectorAll('[data-part]').forEach(function(el) {
el.addEventListener('click', function(e) {
e.stopPropagation();
activatePart(el.dataset.part);
});
});
})();
</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!');
});❓So, What Exactly is a Tag?
A tag is basically a label that tells the browser what something is on your page. Think of it like a command that says, “Hey browser, this is a paragraph!” or “This is a heading!”
Tags are written in angle brackets like this:
- <p> ... </p>
- Most tags come in pairs:
- An opening tag: <p>
- A closing tag: </p>
- The only difference? The closing tag has a forward slash (/).🌱 And What is an Element?
An element is the full thing: the opening tag, the content inside, and the closing tag.
Here’s an example:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>H1 Tag Anatomy</title>
<style>
.infographic-h1anatomy {
--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-h1anatomy[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 {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
padding: 1rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.95rem;
line-height: 2;
overflow-x: auto;
}
.ha-code-line { white-space: pre; }
.ha-comment {
display: block;
white-space: pre;
color: #5c6370;
font-size: 0.82rem;
}
.ha-part {
padding: 0.1rem 0.25rem;
border-radius: 5px;
cursor: pointer;
transition: background 0.15s ease, color 0.15s ease;
}
.ha-part:hover {
background: #1c2333;
}
.ha-part.ha-active {
background: #1c2333;
box-shadow: inset 0 0 0 1px #5b8def;
}
.ha-open { color: #60a5fa; font-weight: 700; }
.ha-content { color: #e5e5e5; }
.ha-close { color: #60a5fa; 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;
display: flex;
align-items: center;
gap: 0.35rem;
}
.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.3rem 1.4rem 1.6rem;
min-height: 90px;
}
.ha-out-h1 {
font-family: Georgia, "Times New Roman", serif;
font-size: 1.9rem;
font-weight: 700;
margin: 0;
border-radius: 6px;
padding: 0.1rem 0.3rem;
margin-left: -0.3rem;
display: inline-block;
transition: background 0.2s ease, outline 0.2s ease;
}
.ha-out-lit {
background: var(--accent-soft);
outline: 2px solid var(--accent);
}
</style>
</head>
<body>
<div class="infographic-h1anatomy" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-code">
<span class="ha-code-line"><span class="ha-part ha-open" data-part="tag" id="ha-open"><h1></span><span class="ha-part ha-content" data-part="content" id="ha-content">Hello World</span><span class="ha-part ha-close" data-part="tag" id="ha-close"></h1></span></span>
<br>
<span class="ha-comment"><!--</span>
<span class="ha-comment"><h1> is the opening tag</span>
<span class="ha-comment">Hello World is the content</span>
<span class="ha-comment"></h1> is the closing tag</span>
<span class="ha-comment">--></span>
</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">🌐 <span>My First Page</span></div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/basicstructure.html</div>
<div class="ha-screen">
<span class="ha-out-h1" id="ha-out-h1">Hello World</span>
</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 outH1 = document.getElementById('ha-out-h1');
const parts = document.querySelectorAll('.ha-part');
parts.forEach(part => {
part.addEventListener('click', () => {
document.querySelectorAll('.ha-part').forEach(p => p.classList.remove('ha-active'));
const group = part.getAttribute('data-part');
document.querySelectorAll('[data-part="' + group + '"]').forEach(p => p.classList.add('ha-active'));
outH1.classList.add('ha-out-lit');
setTimeout(() => outH1.classList.remove('ha-out-lit'), 900);
});
});
})();
</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!');
});Put all of that together and you have an h1 element. Easy, right?
🚫 Some Tags Don’t Need a Closing
Not all tags come in pairs. Some are what we call self-closing tags — they stand on their own and don’t wrap around any content.
A few common ones:
<img>, <br>, <hr>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Void Elements Anatomy</title>
<style>
.infographic-voidelements {
--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-voidelements[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 {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
padding: 1rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.82rem;
line-height: 1.9;
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-comment { color: #5c6370; font-style: italic; }
.ha-void { 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.3rem 1.4rem;
}
.ha-out-el {
border-radius: 6px;
transition: background 0.2s ease, outline 0.2s ease;
padding: 0.15rem 0.3rem;
margin-left: -0.3rem;
}
.ha-out-h1 {
font-family: Georgia, "Times New Roman", serif;
font-size: 1.35rem;
font-weight: 700;
margin: 0 0 0.5rem;
display: block;
}
.ha-out-hr {
border: none;
border-top: 1px solid #bbb;
margin: 0.6rem 0;
}
.ha-out-p {
font-family: Georgia, "Times New Roman", serif;
font-size: 0.82rem;
margin: 0.5rem 0;
display: block;
}
.ha-out-imgwrap {
display: block;
margin: 0.6rem -1.3rem;
width: calc(100% + 2.6rem);
}
.ha-out-br {
display: block;
height: 0.6rem;
border-radius: 4px;
}
.ha-out-lit {
background: var(--accent-soft);
outline: 2px solid var(--accent);
}
</style>
</head>
<body>
<div class="infographic-voidelements" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-code">
<span class="ha-line"><<span class="ha-tag">body</span>></span>
<span class="ha-line"> </span>
<span class="ha-line ha-clickable" data-part="h1"> <<span class="ha-tag">h1</span>>Void Elements Styled with CSS</<span class="ha-tag">h1</span>></span>
<span class="ha-line ha-clickable" data-part="hr"> <<span class="ha-void">hr</span> <span class="ha-attr">class</span>=<span class="ha-str">"styled-hr"</span>></span>
<span class="ha-line ha-clickable" data-part="p1"> <<span class="ha-tag">p</span>>This is some text above the image.</<span class="ha-tag">p</span>></span>
<span class="ha-line"> </span>
<span class="ha-line ha-comment"> <!-- Using local image file --></span>
<span class="ha-line ha-clickable" data-part="img"> <<span class="ha-void">img</span> <span class="ha-attr">src</span>=<span class="ha-str">"image.jpg"</span> <span class="ha-attr">alt</span>=<span class="ha-str">"Placeholder Image"</span> <span class="ha-attr">class</span>=<span class="ha-str">"styled-img"</span>></span>
<span class="ha-line ha-clickable" data-part="br"> <<span class="ha-void">br</span> <span class="ha-attr">class</span>=<span class="ha-str">"styled-br"</span>></span>
<span class="ha-line ha-clickable" data-part="p2"> <<span class="ha-tag">p</span>>This is some text below the image.</<span class="ha-tag">p</span>></span>
<span class="ha-line"> </span>
<span class="ha-line"></<span class="ha-tag">body</span>></span>
</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">🌐 Void Elements Styled with CSS</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/basicstructure.html</div>
<div class="ha-screen">
<span class="ha-out-el ha-out-h1" id="out-h1">Void Elements Styled with CSS</span>
<hr class="ha-out-el ha-out-hr" id="out-hr">
<p class="ha-out-el ha-out-p" id="out-p1">This is some text above the image.</p>
<span class="ha-out-el ha-out-imgwrap" id="out-img">
<svg width="100%" height="180" viewBox="0 0 800 320" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid slice" style="display:block;">
<defs>
<linearGradient id="skyGrad" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#ffb85c"/>
<stop offset="55%" stop-color="#ff8f6b"/>
<stop offset="100%" stop-color="#f5efe3"/>
</linearGradient>
<linearGradient id="lakeGrad" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#3d6d8c"/>
<stop offset="100%" stop-color="#274a63"/>
</linearGradient>
</defs>
<rect width="800" height="320" fill="url(#skyGrad)"/>
<circle cx="400" cy="130" r="55" fill="#fff4d6"/>
<path d="M0,190 L140,90 L230,170 L340,60 L470,190 L560,110 L680,180 L800,120 L800,210 L0,210 Z" fill="#5a4a6e"/>
<path d="M0,210 L150,150 L260,205 L380,140 L520,210 L650,160 L800,205 L800,235 L0,235 Z" fill="#3f3358"/>
<rect y="235" width="800" height="85" fill="url(#lakeGrad)"/>
<ellipse cx="400" cy="235" rx="55" ry="10" fill="#ffdca0" opacity="0.55"/>
</svg>
</span>
<span class="ha-out-el ha-out-br" id="out-br"></span>
<p class="ha-out-el ha-out-p" id="out-p2">This is some text below the image.</p>
</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 = {
h1: 'out-h1', hr: 'out-hr', p1: 'out-p1',
img: 'out-img', br: 'out-br', p2: 'out-p2'
};
const lines = document.querySelectorAll('.ha-line.ha-clickable');
lines.forEach(line => {
line.addEventListener('click', () => {
document.querySelectorAll('.ha-line').forEach(l => l.classList.remove('ha-active'));
document.querySelectorAll('.ha-out-el').forEach(o => o.classList.remove('ha-out-lit'));
line.classList.add('ha-active');
const part = line.getAttribute('data-part');
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!');
});These are used for things like images or line breaks. They end with a slash and a closing angle bracket (/>).
💡 Quick Recap
Term | What It Means |
|---|---|
Tag | The label inside < >, like <p> or <h1> |
Opening Tag | Starts the element — e.g., <p> |
Closing Tag | Ends the element — e.g., </p> |
Element | Full structure: tag + content + tag |
Self-closing | Doesn’t need a closing tag — like <img /> |
🧠 Tip
When you look at a web page, everything you see — the text, the images, the headings — is made up of these tags and elements. Once you get comfortable with them, the rest of HTML becomes much easier.