↔️ Labels and Buttons
When you're building a form or any kind of interactive webpage, two super important elements are labels and buttons. They might look small, but they make your site more user-friendly and accessible.
Master Code Block (This will be used for further examples)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Forms Example</title>
</head>
<body>
<!--All content to be added here-->
</body>
</html>🏷️ <label> — Describes What the Input Is For
Think of a label as a tag that tells the user what to enter in a particular input box.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Form Anatomy</title>
<style>
.infographic-loginform {
--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-loginform[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.78rem;
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-id-str { color: #f472b6; }
.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-h1 { font-size: 1.3rem; font-weight: 700; margin: 0 0 0.9rem; }
.ha-out-row { display: flex; align-items: center; gap: 0.4rem; margin-bottom: 0.9rem; }
.ha-out-wrap {
display: inline-flex;
align-items: center;
gap: 0.4rem;
border-radius: 8px;
padding: 2px;
transition: outline 0.2s ease;
}
.ha-out-lit { outline: 2px solid var(--accent); }
.ha-screen label { font-size: 0.88rem; }
.ha-screen input[type="text"] {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.85rem;
padding: 0.3rem 0.5rem;
border: 1px solid #999;
}
.ha-out-submit {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.85rem;
padding: 0.3rem 0.7rem;
border: 1px solid #999;
background: #f0f0f0;
cursor: pointer;
}
</style>
</head>
<body>
<div class="infographic-loginform" 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">body</span>></span>
<span class="ha-line ha-clickable" data-part="h1"> <<span class="ha-tag">h1</span>>Login Form</<span class="ha-tag">h1</span>></span>
<span class="ha-line"> </span>
<span class="ha-line"> <<span class="ha-tag">form</span> <span class="ha-attr">action</span>=<span class="ha-str">"/submit-login"</span> <span class="ha-attr">method</span>=<span class="ha-str">"post"</span>></span>
<span class="ha-line ha-clickable ha-active" data-part="label"> <<span class="ha-tag">label</span> <span class="ha-attr">for</span>=<span class="ha-id-str">"username"</span>>Username:</<span class="ha-tag">label</span>></span>
<span class="ha-line ha-clickable" data-part="input"> <<span class="ha-tag">input</span></span>
<span class="ha-line ha-clickable" data-part="input"> <span class="ha-attr">type</span>=<span class="ha-str">"text"</span></span>
<span class="ha-line ha-clickable" data-part="input"> <span class="ha-attr">id</span>=<span class="ha-id-str">"username"</span></span>
<span class="ha-line ha-clickable" data-part="input"> <span class="ha-attr">name</span>=<span class="ha-str">"username"</span></span>
<span class="ha-line ha-clickable" data-part="input"> <span class="ha-attr">placeholder</span>=<span class="ha-str">"Enter your username"</span></span>
<span class="ha-line ha-clickable" data-part="input"> <span class="ha-attr">required</span></span>
<span class="ha-line ha-clickable" data-part="input"> /></span>
<span class="ha-line"> </span>
<span class="ha-line"> <<span class="ha-tag">br</span> /><<span class="ha-tag">br</span> /></span>
<span class="ha-line"> </span>
<span class="ha-line ha-clickable" data-part="submit"> <<span class="ha-tag">input</span> <span class="ha-attr">type</span>=<span class="ha-str">"submit"</span> <span class="ha-attr">value</span>=<span class="ha-str">"Login"</span> /></span>
<span class="ha-line"> </<span class="ha-tag">form</span>></span>
<span class="ha-line"></<span class="ha-tag">body</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">🌐 Username Input Example</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/basicstructure.html</div>
<div class="ha-screen">
<div class="ha-out-h1" id="out-h1">Login Form</div>
<div class="ha-out-row">
<span class="ha-out-wrap" id="wrap-input">
<span class="ha-out-wrap ha-out-lit" id="wrap-label" style="padding:2px 4px;"><label>Username:</label></span>
<input type="text" placeholder="Enter your username">
</span>
</div>
<span class="ha-out-wrap" id="wrap-submit"><button class="ha-out-submit">Login</button></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 outMap = { h1: 'out-h1', label: 'wrap-label', input: 'wrap-input', submit: 'wrap-submit' };
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('.ha-out-wrap, #out-h1').forEach(el => el.classList.remove('ha-out-lit'));
const el = document.getElementById(outMap[part]);
if (el) el.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!');
});🔍 Why use for?
The for="username" in the label connects it to the input with id="username"
This helps screen readers and improves accessibility
Also, when you click the label, the input box gets focused — cool right?
📌 You can also wrap the input inside the label (another valid method):
<body>
<h1>Login Form</h1>
<form action="/submit-login" method="post">
<label>
Username:
<input
type="text"
name="username"
placeholder="Enter your username"
required
/>
</label>
<br /><br />
<input type="submit" value="Login" />
</form>
</body>🟩 <button> — Triggers an Action
Buttons are what the user clicks to do something — like submit a form, open a popup, or perform an action.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Submit Button Anatomy</title>
<style>
.infographic-submitbtn {
--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-submitbtn[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.78rem;
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-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-h1 { font-size: 1.3rem; font-weight: 700; margin: 0 0 0.9rem; }
.ha-out-row { display: flex; align-items: center; gap: 0.4rem; margin-bottom: 0.9rem; }
.ha-out-wrap {
display: inline-flex;
align-items: center;
gap: 0.4rem;
border-radius: 8px;
padding: 2px;
transition: outline 0.2s ease;
}
.ha-out-lit { outline: 2px solid var(--accent); }
.ha-screen label { font-size: 0.88rem; }
.ha-screen input[type="text"] {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.85rem;
padding: 0.3rem 0.5rem;
border: 1px solid #999;
}
.ha-out-submit {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.85rem;
padding: 0.3rem 0.7rem;
border: 1px solid #999;
background: #f0f0f0;
cursor: pointer;
}
</style>
</head>
<body>
<div class="infographic-submitbtn" 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">body</span>></span>
<span class="ha-line ha-clickable" data-part="h1"> <<span class="ha-tag">h1</span>>Simple Form</<span class="ha-tag">h1</span>></span>
<span class="ha-line"> <<span class="ha-tag">form</span> <span class="ha-attr">action</span>=<span class="ha-str">"/submit-form"</span> <span class="ha-attr">method</span>=<span class="ha-str">"post"</span>></span>
<span class="ha-line ha-clickable" data-part="label"> <<span class="ha-tag">label</span>></span>
<span class="ha-line ha-clickable" data-part="label"> Name:</span>
<span class="ha-line ha-clickable" data-part="input"> <<span class="ha-tag">input</span> <span class="ha-attr">type</span>=<span class="ha-str">"text"</span> <span class="ha-attr">name</span>=<span class="ha-str">"name"</span> <span class="ha-attr">placeholder</span>=<span class="ha-str">"Enter your name"</span> <span class="ha-attr">required</span> /></span>
<span class="ha-line ha-clickable" data-part="label"> </<span class="ha-tag">label</span>></span>
<span class="ha-line"> <<span class="ha-tag">br</span> /><<span class="ha-tag">br</span> /></span>
<span class="ha-line ha-clickable ha-active" data-part="submit"> <<span class="ha-tag">button</span> <span class="ha-attr">type</span>=<span class="ha-str">"submit"</span>>Submit</<span class="ha-tag">button</span>></span>
<span class="ha-line"> </<span class="ha-tag">form</span>></span>
<span class="ha-line"></<span class="ha-tag">body</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">🌐 Submit Button Example</div>
</div>
<div class="ha-urlrow">127.0.0.1:5500/basicstructure.html</div>
<div class="ha-screen">
<div class="ha-out-h1" id="out-h1">Simple Form</div>
<div class="ha-out-row">
<span class="ha-out-wrap" id="wrap-label">
<label>Name:</label>
<span class="ha-out-wrap" id="wrap-input"><input type="text" placeholder="Enter your name"></span>
</span>
</div>
<span class="ha-out-wrap ha-out-lit" id="wrap-submit"><button class="ha-out-submit" type="submit">Submit</button></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 outMap = { h1: 'out-h1', label: 'wrap-label', input: 'wrap-input', submit: 'wrap-submit' };
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('.ha-out-wrap, #out-h1').forEach(el => el.classList.remove('ha-out-lit'));
const el = document.getElementById(outMap[part]);
if (el) el.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!');
});🔘 Common type values
You can turn <input /> into a button-like control using its type attribute:
submit→ sends the form data to the serverreset→ clears all fields back to their default valuesbutton→ a plain button with no built-in behavior — you wire it up with JavaScriptimage→ renders as a clickable image that submits the form (needs asrcattribute, like an<img>)
The <button> element supports the same three behavioral types:
submit→ sends the form data (this is the default if you don't specifytypeat all — a common gotcha inside forms)reset→ clears the formbutton→ does nothing on its own until you attach JavaScript
So functionally, <input type="submit"> and <button type="submit"> do the same job — the difference is just what you're allowed to put inside them.
✨ Why <button> is more flexible
An <input>'s label is limited to a plain text value. A <button>, on the other hand, can hold real markup — icons, bold text, even nested elements
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Input & Button Type Values Anatomy</title>
<style>
.infographic-typevalues {
--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-typevalues[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.1rem; }
/* element toggle */
.ha-toggle {
display: flex;
background: var(--paper-alt);
border: 1px solid var(--line);
border-radius: 999px;
padding: 0.25rem;
gap: 0.25rem;
}
.ha-toggle button {
flex: 1;
border: none;
background: transparent;
color: var(--ink-soft);
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.8rem;
font-weight: 700;
padding: 0.5rem 0.7rem;
border-radius: 999px;
cursor: pointer;
transition: background 0.2s ease, color 0.2s ease;
}
.ha-toggle button.ha-on {
background: var(--accent);
color: #fff;
}
/* type pills */
.ha-pills {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.ha-pill {
border: 1px solid var(--line);
background: var(--paper);
color: var(--ink);
font-family: "SFMono-Regular", Consolas, monospace;
font-size: 0.78rem;
font-weight: 700;
padding: 0.4rem 0.8rem;
border-radius: 8px;
cursor: pointer;
transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.ha-pill:hover { border-color: var(--accent); }
.ha-pill.ha-on {
background: var(--accent);
border-color: var(--accent);
color: #fff;
}
.ha-code {
background: #0b0b0b;
border: 1px solid #2a2a2a;
border-radius: 10px;
padding: 0.9rem 1.8rem 0.9rem 0.9rem;
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
font-size: 0.85rem;
color: #e5e5e5;
overflow-x: auto;
}
.ha-tag { color: #60a5fa; font-weight: 700; }
.ha-attr { color: #f2b96b; }
.ha-str { color: #9ece6a; }
.ha-val-hl { 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;
padding: 1.4rem;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 0.8rem;
min-height: 90px;
}
#out-control {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.9rem;
padding: 0.45rem 1rem;
border: 1px solid #999;
border-radius: 4px;
background: #f0f0f0;
cursor: pointer;
}
#out-control.ha-primary { background: #2563eb; color: #fff; border-color: #2563eb; }
.ha-note {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.8rem;
color: var(--ink-soft);
}
</style>
</head>
<body>
<div class="infographic-typevalues" id="ha-root">
<div class="ha-inner">
<div class="ha-layout">
<div class="ha-toggle" id="element-toggle">
<button class="ha-on" data-el="input"><input /></button>
<button data-el="button"><button></button>
</div>
<div class="ha-pills" id="type-pills"></div>
<div class="ha-code" id="code-line"></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">
<span id="out-holder"></span>
<span class="ha-note" id="out-note"></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 data = {
input: {
submit: {
code: '<<span class="ha-tag">input</span> <span class="ha-attr">type</span>=<span class="ha-str">"<span class="ha-val-hl">submit</span>"</span> <span class="ha-attr">value</span>=<span class="ha-str">"Send"</span>>',
label: 'Send',
note: 'Sends the form data to the server.',
primary: true
},
reset: {
code: '<<span class="ha-tag">input</span> <span class="ha-attr">type</span>=<span class="ha-str">"<span class="ha-val-hl">reset</span>"</span> <span class="ha-attr">value</span>=<span class="ha-str">"Clear"</span>>',
label: 'Clear',
note: 'Resets every field back to its default value.',
primary: false
},
button: {
code: '<<span class="ha-tag">input</span> <span class="ha-attr">type</span>=<span class="ha-str">"<span class="ha-val-hl">button</span>"</span> <span class="ha-attr">value</span>=<span class="ha-str">"Click"</span>>',
label: 'Click',
note: 'Does nothing by itself — needs JavaScript to do anything.',
primary: false
},
image: {
code: '<<span class="ha-tag">input</span> <span class="ha-attr">type</span>=<span class="ha-str">"<span class="ha-val-hl">image</span>"</span> <span class="ha-attr">src</span>=<span class="ha-str">"go.png"</span>>',
label: '🖼️ (acts like submit)',
note: 'Renders as a clickable image that submits the form.',
primary: true
}
},
button: {
submit: {
code: '<<span class="ha-tag">button</span> <span class="ha-attr">type</span>=<span class="ha-str">"<span class="ha-val-hl">submit</span>"</span>>🚀 <<span class="ha-tag">strong</span>>Send</<span class="ha-tag">strong</span>></<span class="ha-tag">button</span>>',
label: '🚀 Send',
labelBold: true,
note: 'Sends the form — and this is the default if you omit type entirely.',
primary: true
},
reset: {
code: '<<span class="ha-tag">button</span> <span class="ha-attr">type</span>=<span class="ha-str">"<span class="ha-val-hl">reset</span>"</span>>Clear</<span class="ha-tag">button</span>>',
label: 'Clear',
note: 'Resets the form, same as input type="reset".',
primary: false
},
button: {
code: '<<span class="ha-tag">button</span> <span class="ha-attr">type</span>=<span class="ha-str">"<span class="ha-val-hl">button</span>"</span>><<span class="ha-tag">strong</span>>Click Me!</<span class="ha-tag">strong</span>></<span class="ha-tag">button</span>>',
label: 'Click Me!',
labelBold: true,
note: 'Plain button — no built-in behavior until you add JavaScript.',
primary: false
}
}
};
const elToggle = document.getElementById('element-toggle');
const pillsWrap = document.getElementById('type-pills');
const codeLine = document.getElementById('code-line');
const outHolder = document.getElementById('out-holder');
const outNote = document.getElementById('out-note');
let currentEl = 'input';
let currentType = 'submit';
function renderPills() {
const types = Object.keys(data[currentEl]);
pillsWrap.innerHTML = '';
types.forEach(t => {
const btn = document.createElement('button');
btn.className = 'ha-pill' + (t === currentType ? ' ha-on' : '');
btn.textContent = t;
btn.addEventListener('click', () => {
currentType = t;
render();
});
pillsWrap.appendChild(btn);
});
}
function render() {
if (!data[currentEl][currentType]) currentType = Object.keys(data[currentEl])[0];
renderPills();
const entry = data[currentEl][currentType];
codeLine.innerHTML = entry.code;
outHolder.innerHTML = '';
const control = document.createElement(currentEl === 'input' ? 'input' : 'button');
control.id = 'out-control';
if (entry.primary) control.classList.add('ha-primary');
if (currentEl === 'input') {
control.type = 'button';
control.value = entry.label;
} else {
control.innerHTML = entry.labelBold
? entry.label.replace(/^([^\s]*\s?)(.*)$/, (m, emoji, rest) => emoji + '<strong>' + rest + '</strong>')
: entry.label;
}
outHolder.appendChild(control);
outNote.textContent = entry.note;
}
elToggle.querySelectorAll('button').forEach(btn => {
btn.addEventListener('click', () => {
elToggle.querySelectorAll('button').forEach(b => b.classList.remove('ha-on'));
btn.classList.add('ha-on');
currentEl = btn.getAttribute('data-el');
currentType = 'submit';
render();
});
});
render();
})();
</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!');
});✅ input type="submit" vs button type="submit"
Both are used to submit a form, but there are key differences in syntax, styling, and flexibility.
🟠 1. <input type="submit">
<input type="submit" value="Send">✅ Pros:
Simple and short
Works immediately
No closing tag
⚠️ Limitations:
Can’t include inner HTML (like icons or bold text)
Limited styling flexibility
🟢 2. <button type="submit">
<button type="submit">📩 <strong>Send</strong> Form</button>✅ Pros:
Can contain HTML content (icons, images, bold/italic text)
Easier to style and customize
Can also be used as
type="button"ortype="reset"
⚠️ Considerations:
Slightly more verbose
🎯 When to Use What?
Use Case | Use This |
|---|---|
Simple forms, no special content |
|
Custom design, icons, or rich text |
|
Need JavaScript + no form submission |
|
✅ Example Showing Both
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Input vs Button Submit Anatomy</title>
<style>
.infographic-submitcompare {
--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-submitcompare[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-comment { color: #5c6370; font-style: italic; }
.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;
display: flex;
gap: 0.7rem;
}
.ha-out-wrap {
display: inline-block;
border-radius: 8px;
padding: 2px;
transition: outline 0.2s ease;
}
.ha-out-lit { outline: 2px solid var(--accent); }
.ha-out-input {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.88rem;
padding: 0.4rem 0.9rem;
border: 1px solid #999;
background: #f0f0f0;
cursor: pointer;
border-radius: 3px;
}
.ha-out-button {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
font-size: 0.88rem;
padding: 0.4rem 0.9rem;
border: 1px solid #999;
background: #ffffff;
cursor: pointer;
border-radius: 3px;
}
</style>
</head>
<body>
<div class="infographic-submitcompare" 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">form</span>></span>
<span class="ha-line ha-comment"> <!-- Input submit --></span>
<span class="ha-line ha-clickable" data-part="input"> <<span class="ha-tag">input</span> <span class="ha-attr">type</span>=<span class="ha-str">"submit"</span> <span class="ha-attr">value</span>=<span class="ha-str">"Simple Submit"</span>></span>
<span class="ha-line"> </span>
<span class="ha-line ha-comment"> <!-- Button submit --></span>
<span class="ha-line ha-clickable" data-part="button"> <<span class="ha-tag">button</span> <span class="ha-attr">type</span>=<span class="ha-str">"submit"</span>></span>
<span class="ha-line ha-clickable" data-part="button"> 🚀 <<span class="ha-tag">strong</span>>Styled Submit</<span class="ha-tag">strong</span>></span>
<span class="ha-line ha-clickable" data-part="button"> </<span class="ha-tag">button</span>></span>
<span class="ha-line"></<span class="ha-tag">form</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">
<span class="ha-out-wrap" id="wrap-input"><input class="ha-out-input" type="submit" value="Simple Submit"></span>
<span class="ha-out-wrap" id="wrap-button"><button class="ha-out-button" type="submit">🚀 <strong>Styled Submit</strong></button></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 outMap = { input: 'wrap-input', button: 'wrap-button' };
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('.ha-out-wrap').forEach(el => el.classList.remove('ha-out-lit'));
const el = document.getElementById(outMap[part]);
if (el) el.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!');
});