β after() - insert a node after an element.
πΉ What is after()?
after()is a DOM method of the Element interface.It inserts one or more nodes immediately after a selected element in the DOM.
βοΈ Syntax
element.after(node);
element.after(node1, node2, ...nodeN);
element.after(text1, text2, ...textN);π Key Points
Inserts content after the element itself, not inside it.
Accepts:
DOM nodes (elements)
Strings (treated as text nodes)
Returns:
undefinedThrows HierarchyRequestError if insertion is invalid.
1οΈβ£ Insert a single element
<h1>Hello World</h1>
<script>
const h1 = document.querySelector('h1');
const p = document.createElement('p');
p.textContent = 'Inserted using after()';
h1.after(p);
</script><h1>Hello World</h1>
<p>Inserted using after()</p>π The <p> is added after the <h1>.
2οΈβ£ Insert multiple elements
<ul>
<li>Angular</li>
<li>Vue</li>
</ul>
<script>
const ul = document.querySelector('ul');
const items = ['React', 'Meteor', 'Polymer'].map(text => {
const li = document.createElement('li');
li.textContent = text;
return li;
});
ul.lastElementChild.after(...items);
</script><ul>
<li>Angular</li>
<li>Vue</li>
<li>React</li>
<li>Meteor</li>
<li>Polymer</li>
</ul>π Multiple nodes are inserted after the last <li>.
3οΈβ£ Insert text using after()
<button>Donate</button>
<script>
const btn = document.querySelector('button');
btn.firstChild.after(' π§‘');
</script>Donate π§‘π Strings are automatically converted to text nodes.
<div class="infographic-afterinsert">
<style>
.infographic-afterinsert {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--good: #1a8a5f;
--good-soft: #e1f2ea;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: 'Inter', system-ui, sans-serif;
color: var(--ink);
background: var(--paper);
overflow-x: hidden;
}
.infographic-afterinsert[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--good: #4fbf8f;
--good-soft: #16281f;
}
.infographic-afterinsert * { box-sizing: border-box; }
.infographic-afterinsert h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-afterinsert p { margin: 0; }
.infographic-afterinsert button { font-family: inherit; }
.af-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.af-hero { text-align: center; margin-bottom: 1.2rem; }
.af-hero h1 { font-size: clamp(1.35rem, 4.5vw, 1.85rem); }
.af-hero p { color: var(--ink-soft); margin-top: 0.4rem; font-size: 0.84rem; }
.af-tabs { display: flex; flex-wrap: wrap; gap: 0.4rem; justify-content: center; margin-bottom: 1.2rem; }
.af-tab { border: 1px solid var(--line); background: var(--paper-alt); color: var(--ink-soft); padding: 0.36rem 0.65rem; font-size: 0.65rem; font-weight: 700; cursor: pointer; font-family: 'IBM Plex Mono', monospace; }
.af-tab.is-active { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); }
.af-tab:hover:not(.is-active) { border-color: var(--ink-soft); color: var(--ink); }
.af-panel { display: none; }
.af-panel.is-active { display: block; }
.af-code { background: #1e1e1e; color: #d4d4d4; border-radius: 5px; padding: 0.6rem 0.8rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.66rem; line-height: 1.6; margin-bottom: 1rem; white-space: pre; overflow-x: auto; }
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-str { color: #ce9178; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.af-page { border: 1.5px solid var(--line); background: var(--paper-alt); border-radius: 6px; overflow: hidden; margin-bottom: 1rem; }
.af-page-bar { background: #2b2b2b; padding: 0.4rem 0.6rem; display: flex; gap: 0.3rem; }
.af-page-dot { width: 8px; height: 8px; border-radius: 50%; background: #555; }
.af-page-body { padding: 0.9rem 1rem; background: var(--paper); }
.af-item { border: 1.5px solid var(--line); border-radius: 4px; padding: 0.32rem 0.55rem; font-size: 0.8rem; margin-bottom: 0.3rem; transition: border-color 0.35s ease, background 0.35s ease; }
.af-item.is-anchor { border-color: var(--accent); background: var(--accent-soft); }
.af-item.is-new { opacity: 0; transform: translateY(-8px) scale(0.95); transition: opacity 0.4s ease, transform 0.4s ease, border-color 0.4s ease, background 0.4s ease; }
.af-item.is-new.is-shown { opacity: 1; transform: translateY(0) scale(1); border-color: var(--good); background: var(--good-soft); }
.af-btn-line { display: flex; align-items: center; gap: 0.3rem; font-size: 0.85rem; border: 1.5px solid var(--line); border-radius: 5px; padding: 0.4rem 0.7rem; display: inline-flex; }
.af-btn-line.is-anchor { border-color: var(--accent); background: var(--accent-soft); }
.af-emoji { opacity: 0; transition: opacity 0.35s ease; color: var(--good); font-weight: 700; }
.af-emoji.is-shown { opacity: 1; }
.af-play { display: block; margin: 0 auto; border: none; background: var(--accent); color: #fff; padding: 0.5rem 1.2rem; font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.af-play:active { transform: scale(0.96); }
.af-note { text-align: center; font-size: 0.78rem; color: var(--ink-soft); padding: 1.3rem; }
.af-note strong { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
.infographic-afterinsert *, .infographic-afterinsert *::before, .infographic-afterinsert *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="af-wrap">
<div class="af-hero">
<h1>element.after()</h1>
<p>Drops one or more nodes in, right next to an existing one β no container needed.</p>
</div>
<div class="af-tabs">
<button class="af-tab is-active" data-tab="single" type="button">single element</button>
<button class="af-tab" data-tab="multi" type="button">multiple elements</button>
<button class="af-tab" data-tab="text" type="button">text</button>
</div>
<!-- single element -->
<div class="af-panel is-active" data-panel="single">
<div class="af-code"><span class="tok-kw">const</span> <span class="tok-var">h1</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">querySelector</span><span class="tok-punc">(</span><span class="tok-str">'h1'</span><span class="tok-punc">);</span>
<span class="tok-kw">const</span> <span class="tok-var">p</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">createElement</span><span class="tok-punc">(</span><span class="tok-str">'p'</span><span class="tok-punc">);</span>
<span class="tok-var">p</span><span class="tok-punc">.</span><span class="tok-var">textContent</span> <span class="tok-punc">=</span> <span class="tok-str">'Inserted using after()'</span><span class="tok-punc">;</span>
<span class="tok-var">h1</span><span class="tok-punc">.</span><span class="tok-fn">after</span><span class="tok-punc">(</span><span class="tok-var">p</span><span class="tok-punc">);</span></div>
<div class="af-page">
<div class="af-page-bar"><div class="af-page-dot"></div><div class="af-page-dot"></div><div class="af-page-dot"></div></div>
<div class="af-page-body">
<div class="af-item is-anchor"><span style="font-family:'IBM Plex Mono',monospace;font-size:0.58rem;color:var(--ink-soft);display:block;"><h1></span>Hello World</div>
<div class="af-item is-new" id="singleNew"><span style="font-family:'IBM Plex Mono',monospace;font-size:0.58rem;color:var(--ink-soft);display:block;"><p></span>Inserted using after()</div>
</div>
</div>
<button class="af-play" data-run="single" type="button">run</button>
<p class="af-note">The new <strong><p></strong> lands immediately after <strong><h1></strong> β as a sibling, not a child.</p>
</div>
<!-- multiple elements -->
<div class="af-panel" data-panel="multi">
<div class="af-code"><span class="tok-kw">const</span> <span class="tok-var">ul</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">querySelector</span><span class="tok-punc">(</span><span class="tok-str">'ul'</span><span class="tok-punc">);</span>
<span class="tok-kw">const</span> <span class="tok-var">items</span> <span class="tok-punc">=</span> <span class="tok-punc">[</span><span class="tok-str">'React'</span><span class="tok-punc">,</span> <span class="tok-str">'Meteor'</span><span class="tok-punc">,</span> <span class="tok-str">'Polymer'</span><span class="tok-punc">].</span><span class="tok-fn">map</span><span class="tok-punc">(</span><span class="tok-var">text</span> <span class="tok-punc">=> {</span>
<span class="tok-kw">const</span> <span class="tok-var">li</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">createElement</span><span class="tok-punc">(</span><span class="tok-str">'li'</span><span class="tok-punc">);</span>
<span class="tok-var">li</span><span class="tok-punc">.</span><span class="tok-var">textContent</span> <span class="tok-punc">=</span> <span class="tok-var">text</span><span class="tok-punc">;</span>
<span class="tok-kw">return</span> <span class="tok-var">li</span><span class="tok-punc">;</span>
<span class="tok-punc">});</span>
<span class="tok-var">ul</span><span class="tok-punc">.</span><span class="tok-var">lastElementChild</span><span class="tok-punc">.</span><span class="tok-fn">after</span><span class="tok-punc">(...</span><span class="tok-var">items</span><span class="tok-punc">);</span></div>
<div class="af-page">
<div class="af-page-bar"><div class="af-page-dot"></div><div class="af-page-dot"></div><div class="af-page-dot"></div></div>
<div class="af-page-body">
<span style="font-family:'IBM Plex Mono',monospace;font-size:0.6rem;color:var(--ink-soft);display:block;margin-bottom:0.4rem;"><ul></span>
<div class="af-item">Angular</div>
<div class="af-item is-anchor" id="multiAnchor">Vue</div>
<div class="af-item is-new" id="multi1">React</div>
<div class="af-item is-new" id="multi2">Meteor</div>
<div class="af-item is-new" id="multi3">Polymer</div>
</div>
</div>
<button class="af-play" data-run="multi" type="button">run</button>
<p class="af-note"><strong>after()</strong> takes any number of nodes β all three land in one call, in order, right after <strong>Vue</strong>.</p>
</div>
<!-- text -->
<div class="af-panel" data-panel="text">
<div class="af-code"><span class="tok-kw">const</span> <span class="tok-var">btn</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">querySelector</span><span class="tok-punc">(</span><span class="tok-str">'button'</span><span class="tok-punc">);</span>
<span class="tok-var">btn</span><span class="tok-punc">.</span><span class="tok-var">firstChild</span><span class="tok-punc">.</span><span class="tok-fn">after</span><span class="tok-punc">(</span><span class="tok-str">' π§‘'</span><span class="tok-punc">);</span></div>
<div class="af-page">
<div class="af-page-bar"><div class="af-page-dot"></div><div class="af-page-dot"></div><div class="af-page-dot"></div></div>
<div class="af-page-body">
<div class="af-btn-line is-anchor">Donate<span class="af-emoji" id="textNew"> π§‘</span></div>
</div>
</div>
<button class="af-play" data-run="text" type="button">run</button>
<p class="af-note"><strong>after()</strong> isn't just for elements β plain text works too, right after the button's existing text node.</p>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-afterinsert')
|| document.querySelector('.infographic-afterinsert');
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');
wrapper.querySelectorAll('.af-tab').forEach(tab => {
tab.addEventListener('click', () => {
wrapper.querySelectorAll('.af-tab').forEach(t => t.classList.remove('is-active'));
wrapper.querySelectorAll('.af-panel').forEach(p => p.classList.remove('is-active'));
tab.classList.add('is-active');
wrapper.querySelector('.af-panel[data-panel="' + tab.dataset.tab + '"]').classList.add('is-active');
});
});
wrapper.querySelector('[data-run="single"]').addEventListener('click', () => {
const el = wrapper.querySelector('#singleNew');
el.classList.remove('is-shown');
void el.offsetWidth;
setTimeout(() => el.classList.add('is-shown'), 120);
});
wrapper.querySelector('[data-run="multi"]').addEventListener('click', () => {
const items = ['multi1', 'multi2', 'multi3'].map(id => wrapper.querySelector('#' + id));
items.forEach(i => i.classList.remove('is-shown'));
void items[0].offsetWidth;
items.forEach((item, i) => setTimeout(() => item.classList.add('is-shown'), 150 + i * 220));
});
wrapper.querySelector('[data-run="text"]').addEventListener('click', () => {
const el = wrapper.querySelector('#textNew');
el.classList.remove('is-shown');
void el.offsetWidth;
setTimeout(() => el.classList.add('is-shown'), 120);
});
})();
</script>β append() β insert a node after the last child node of a parent node.
πΉ What is append()?
append()is a DOM method used to add content inside an element, after its last child.It works on parent nodes.
βοΈ Syntax
parentNode.append(node);
parentNode.append(node1, node2, ...nodeN);
parentNode.append(text1, text2, ...textN);π Key Points
Appends content at the end of an element.
Accepts:
DOM nodes (elements)
Strings (converted to text nodes)
Can insert multiple items at once
Returns:
undefined
1οΈβ£ Append elements to a parent
βοΈ HTML
<ul id="app">
<li>JavaScript</li>
</ul>π§ JavaScript
const app = document.querySelector('#app');
const langs = ['TypeScript', 'HTML', 'CSS'];
const nodes = langs.map(lang => {
const li = document.createElement('li');
li.textContent = lang;
return li;
});
app.append(...nodes);<ul id="app">
<li>JavaScript</li>
<li>TypeScript</li>
<li>HTML</li>
<li>CSS</li>
</ul>π All <li> elements are added inside <ul> at the end.
2οΈβ£ Append text to an element
βοΈ HTML
<div id="app"></div>π§ JavaScript
const app = document.querySelector('#app');
app.append('append() Text Demo');
// behind the scend converts to document.createTextNode("append () Text Demo")
console.log(app.textContent);<div id="app">append() Text Demo</div>π Strings are automatically converted to text nodes.
<div class="infographic-appendel">
<style>
.infographic-appendel {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--good: #1a8a5f;
--good-soft: #e1f2ea;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: 'Inter', system-ui, sans-serif;
color: var(--ink);
background: var(--paper);
overflow-x: hidden;
}
.infographic-appendel[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--good: #4fbf8f;
--good-soft: #16281f;
}
.infographic-appendel * { box-sizing: border-box; }
.infographic-appendel h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-appendel p { margin: 0; }
.infographic-appendel button { font-family: inherit; }
.ap2-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.ap2-hero { text-align: center; margin-bottom: 1.2rem; }
.ap2-hero h1 { font-size: clamp(1.35rem, 4.5vw, 1.85rem); }
.ap2-hero p { color: var(--ink-soft); margin-top: 0.4rem; font-size: 0.84rem; }
.ap2-tabs { display: flex; flex-wrap: wrap; gap: 0.4rem; justify-content: center; margin-bottom: 1.2rem; }
.ap2-tab { border: 1px solid var(--line); background: var(--paper-alt); color: var(--ink-soft); padding: 0.36rem 0.65rem; font-size: 0.68rem; font-weight: 700; cursor: pointer; font-family: 'IBM Plex Mono', monospace; }
.ap2-tab.is-active { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); }
.ap2-tab:hover:not(.is-active) { border-color: var(--ink-soft); color: var(--ink); }
.ap2-panel { display: none; }
.ap2-panel.is-active { display: block; }
.ap2-code { background: #1e1e1e; color: #d4d4d4; border-radius: 5px; padding: 0.6rem 0.8rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.66rem; line-height: 1.6; margin-bottom: 1rem; white-space: pre; overflow-x: auto; }
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-str { color: #ce9178; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.ap2-page { border: 1.5px solid var(--line); background: var(--paper-alt); border-radius: 6px; overflow: hidden; margin-bottom: 1rem; }
.ap2-page-bar { background: #2b2b2b; padding: 0.4rem 0.6rem; display: flex; gap: 0.3rem; }
.ap2-page-dot { width: 8px; height: 8px; border-radius: 50%; background: #555; }
.ap2-page-body { padding: 0.9rem 1rem; background: var(--paper); }
.ap2-item { border: 1.5px solid var(--line); border-radius: 4px; padding: 0.32rem 0.55rem; font-size: 0.8rem; margin-bottom: 0.3rem; transition: opacity 0.4s ease, transform 0.4s ease, border-color 0.4s ease, background 0.4s ease; }
.ap2-item.is-new { opacity: 0; transform: translateY(-8px) scale(0.95); }
.ap2-item.is-new.is-shown { opacity: 1; transform: translateY(0) scale(1); border-color: var(--good); background: var(--good-soft); }
.ap2-container { border: 1.5px dashed var(--line); border-radius: 5px; padding: 0.6rem; min-height: 2.2em; display: flex; align-items: center; }
.ap2-empty-tag { font-family: 'IBM Plex Mono', monospace; font-size: 0.7rem; color: var(--ink-soft); opacity: 1; transition: opacity 0.3s ease; }
.ap2-container.has-content .ap2-empty-tag { opacity: 0; position: absolute; }
.ap2-text-result { font-size: 0.82rem; opacity: 0; transition: opacity 0.4s ease; color: var(--good); font-weight: 600; }
.ap2-text-result.is-shown { opacity: 1; }
.ap2-play { display: block; margin: 0 auto; border: none; background: var(--accent); color: #fff; padding: 0.5rem 1.2rem; font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.ap2-play:active { transform: scale(0.96); }
.ap2-console { margin: 1rem auto 0; max-width: 320px; text-align: left; border: 1.5px solid var(--line); background: var(--paper-alt); padding: 0.5rem 0.75rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.68rem; min-height: 1.8em; }
.ap2-console .ap2-cline { opacity: 0; transition: opacity 0.25s ease; color: var(--good); display: block; }
.ap2-console .ap2-cline.is-shown { opacity: 1; }
.ap2-note { text-align: center; font-size: 0.78rem; color: var(--ink-soft); padding-top: 1.3rem; }
.ap2-note strong { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
.infographic-appendel *, .infographic-appendel *::before, .infographic-appendel *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="ap2-wrap">
<div class="ap2-hero">
<h1>element.append()</h1>
<p>Adds inside, as the last child β not next to it, like after() does.</p>
</div>
<div class="ap2-tabs">
<button class="ap2-tab is-active" data-tab="elements" type="button">appending elements</button>
<button class="ap2-tab" data-tab="text" type="button">appending text</button>
</div>
<!-- elements -->
<div class="ap2-panel is-active" data-panel="elements">
<div class="ap2-code"><span class="tok-kw">const</span> <span class="tok-var">app</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">querySelector</span><span class="tok-punc">(</span><span class="tok-str">'#app'</span><span class="tok-punc">);</span>
<span class="tok-kw">const</span> <span class="tok-var">langs</span> <span class="tok-punc">=</span> <span class="tok-punc">[</span><span class="tok-str">'TypeScript'</span><span class="tok-punc">,</span> <span class="tok-str">'HTML'</span><span class="tok-punc">,</span> <span class="tok-str">'CSS'</span><span class="tok-punc">];</span>
<span class="tok-kw">const</span> <span class="tok-var">nodes</span> <span class="tok-punc">=</span> <span class="tok-var">langs</span><span class="tok-punc">.</span><span class="tok-fn">map</span><span class="tok-punc">(</span><span class="tok-var">lang</span> <span class="tok-punc">=> {</span>
<span class="tok-kw">const</span> <span class="tok-var">li</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">createElement</span><span class="tok-punc">(</span><span class="tok-str">'li'</span><span class="tok-punc">);</span>
<span class="tok-var">li</span><span class="tok-punc">.</span><span class="tok-var">textContent</span> <span class="tok-punc">=</span> <span class="tok-var">lang</span><span class="tok-punc">;</span>
<span class="tok-kw">return</span> <span class="tok-var">li</span><span class="tok-punc">;</span>
<span class="tok-punc">});</span>
<span class="tok-var">app</span><span class="tok-punc">.</span><span class="tok-fn">append</span><span class="tok-punc">(...</span><span class="tok-var">nodes</span><span class="tok-punc">);</span></div>
<div class="ap2-page">
<div class="ap2-page-bar"><div class="ap2-page-dot"></div><div class="ap2-page-dot"></div><div class="ap2-page-dot"></div></div>
<div class="ap2-page-body">
<span style="font-family:'IBM Plex Mono',monospace;font-size:0.6rem;color:var(--ink-soft);display:block;margin-bottom:0.4rem;"><ul id="app"></span>
<div class="ap2-item">JavaScript</div>
<div class="ap2-item is-new" id="el1">TypeScript</div>
<div class="ap2-item is-new" id="el2">HTML</div>
<div class="ap2-item is-new" id="el3">CSS</div>
</div>
</div>
<button class="ap2-play" data-run="elements" type="button">run</button>
<p class="ap2-note">All three land <strong>inside</strong> <ul>, after the last existing <li> β one call, multiple nodes.</p>
</div>
<!-- text -->
<div class="ap2-panel" data-panel="text">
<div class="ap2-code"><span class="tok-kw">const</span> <span class="tok-var">app</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">querySelector</span><span class="tok-punc">(</span><span class="tok-str">'#app'</span><span class="tok-punc">);</span>
<span class="tok-var">app</span><span class="tok-punc">.</span><span class="tok-fn">append</span><span class="tok-punc">(</span><span class="tok-str">'append() Text Demo'</span><span class="tok-punc">);</span>
<span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">app</span><span class="tok-punc">.</span><span class="tok-var">textContent</span><span class="tok-punc">);</span></div>
<div class="ap2-page">
<div class="ap2-page-bar"><div class="ap2-page-dot"></div><div class="ap2-page-dot"></div><div class="ap2-page-dot"></div></div>
<div class="ap2-page-body">
<span style="font-family:'IBM Plex Mono',monospace;font-size:0.6rem;color:var(--ink-soft);display:block;margin-bottom:0.4rem;"><div id="app"></span>
<div class="ap2-container" id="textContainer">
<span class="ap2-empty-tag" id="emptyTag">β empty β</span>
<span class="ap2-text-result" id="textResult">append() Text Demo</span>
</div>
</div>
</div>
<button class="ap2-play" data-run="text" type="button">run</button>
<div class="ap2-console"><span class="ap2-cline" id="outText">"append() Text Demo"</span></div>
<p class="ap2-note">A plain string gets <strong>auto-wrapped</strong> into a text node β no <strong>createTextNode()</strong> needed.</p>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-appendel')
|| document.querySelector('.infographic-appendel');
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');
wrapper.querySelectorAll('.ap2-tab').forEach(tab => {
tab.addEventListener('click', () => {
wrapper.querySelectorAll('.ap2-tab').forEach(t => t.classList.remove('is-active'));
wrapper.querySelectorAll('.ap2-panel').forEach(p => p.classList.remove('is-active'));
tab.classList.add('is-active');
wrapper.querySelector('.ap2-panel[data-panel="' + tab.dataset.tab + '"]').classList.add('is-active');
});
});
wrapper.querySelector('[data-run="elements"]').addEventListener('click', () => {
const items = ['el1', 'el2', 'el3'].map(id => wrapper.querySelector('#' + id));
items.forEach(i => i.classList.remove('is-shown'));
void items[0].offsetWidth;
items.forEach((item, i) => setTimeout(() => item.classList.add('is-shown'), 150 + i * 220));
});
wrapper.querySelector('[data-run="text"]').addEventListener('click', () => {
const container = wrapper.querySelector('#textContainer');
const result = wrapper.querySelector('#textResult');
const out = wrapper.querySelector('#outText');
container.classList.remove('has-content');
result.classList.remove('is-shown');
out.classList.remove('is-shown');
void container.offsetWidth;
setTimeout(() => {
container.classList.add('has-content');
result.classList.add('is-shown');
}, 150);
setTimeout(() => out.classList.add('is-shown'), 500);
});
})();
</script>π append() vs appendChild()
Feature |
|
|
|---|---|---|
Return value |
| Appended node |
Accepts multiple items | β Yes | β No |
Accepts text | β Yes | β No |
Modern & flexible | β Yes | β οΈ Older |
β prepend() β insert a node before the first child node of a parent node.
πΉ What is prepend()?
prepend()is a DOM method used to add content inside an element, before its first child.It works on parent nodes.
βοΈ Syntax
parentNode.prepend(node);
parentNode.prepend(node1, node2, ...nodeN);
parentNode.prepend(text1, text2, ...textN);π Key Points
Inserts content at the beginning of an element.
Accepts:
DOM nodes (elements)
Strings (automatically converted to text nodes)
Can insert multiple items at once
Returns:
undefined
1οΈβ£ Prepend elements to a parent
βοΈ HTML
<ul id="app">
<li>HTML</li>
</ul>π§ JavaScript
const app = document.querySelector('#app');
const langs = ['CSS', 'JavaScript', 'TypeScript'];
const nodes = langs.map(lang => {
const li = document.createElement('li');
li.textContent = lang;
return li;
});
app.prepend(...nodes);<ul id="app">
<li>CSS</li>
<li>JavaScript</li>
<li>TypeScript</li>
<li>HTML</li>
</ul>π New <li> elements are added before the existing first item.
2οΈβ£ Prepend text to an element
βοΈ HTML
<div id="app"></div>π§ JavaScript
const app = document.querySelector('#app');
app.prepend('prepend() Text Demo');
console.log(app.textContent);<div id="app">prepend() Text Demo</div>π Text is automatically converted into a Text node and added at the start.
<div class="infographic-prependel">
<style>
.infographic-prependel {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--good: #1a8a5f;
--good-soft: #e1f2ea;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: 'Inter', system-ui, sans-serif;
color: var(--ink);
background: var(--paper);
overflow-x: hidden;
}
.infographic-prependel[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--good: #4fbf8f;
--good-soft: #16281f;
}
.infographic-prependel * { box-sizing: border-box; }
.infographic-prependel h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-prependel p { margin: 0; }
.infographic-prependel button { font-family: inherit; }
.pp-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.pp-hero { text-align: center; margin-bottom: 1.2rem; }
.pp-hero h1 { font-size: clamp(1.35rem, 4.5vw, 1.85rem); }
.pp-hero p { color: var(--ink-soft); margin-top: 0.4rem; font-size: 0.84rem; }
.pp-tabs { display: flex; flex-wrap: wrap; gap: 0.4rem; justify-content: center; margin-bottom: 1.2rem; }
.pp-tab { border: 1px solid var(--line); background: var(--paper-alt); color: var(--ink-soft); padding: 0.36rem 0.65rem; font-size: 0.68rem; font-weight: 700; cursor: pointer; font-family: 'IBM Plex Mono', monospace; }
.pp-tab.is-active { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); }
.pp-tab:hover:not(.is-active) { border-color: var(--ink-soft); color: var(--ink); }
.pp-panel { display: none; }
.pp-panel.is-active { display: block; }
.pp-code { background: #1e1e1e; color: #d4d4d4; border-radius: 5px; padding: 0.6rem 0.8rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.66rem; line-height: 1.6; margin-bottom: 1rem; white-space: pre; overflow-x: auto; }
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-str { color: #ce9178; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.pp-page { border: 1.5px solid var(--line); background: var(--paper-alt); border-radius: 6px; overflow: hidden; margin-bottom: 1rem; }
.pp-page-bar { background: #2b2b2b; padding: 0.4rem 0.6rem; display: flex; gap: 0.3rem; }
.pp-page-dot { width: 8px; height: 8px; border-radius: 50%; background: #555; }
.pp-page-body { padding: 0.9rem 1rem; background: var(--paper); display: flex; flex-direction: column; }
.pp-item { border: 1.5px solid var(--line); border-radius: 4px; padding: 0.32rem 0.55rem; font-size: 0.8rem; margin-bottom: 0.3rem; transition: opacity 0.4s ease, transform 0.4s ease, border-color 0.4s ease, background 0.4s ease; order: 10; }
.pp-item.is-new { opacity: 0; transform: translateY(8px) scale(0.95); }
.pp-item.is-new.is-shown { opacity: 1; transform: translateY(0) scale(1); border-color: var(--good); background: var(--good-soft); }
.pp-container { border: 1.5px dashed var(--line); border-radius: 5px; padding: 0.6rem; min-height: 2.2em; display: flex; align-items: center; position: relative; }
.pp-empty-tag { font-family: 'IBM Plex Mono', monospace; font-size: 0.7rem; color: var(--ink-soft); opacity: 1; transition: opacity 0.3s ease; }
.pp-container.has-content .pp-empty-tag { opacity: 0; position: absolute; }
.pp-text-result { font-size: 0.82rem; opacity: 0; transition: opacity 0.4s ease; color: var(--good); font-weight: 600; }
.pp-text-result.is-shown { opacity: 1; }
.pp-play { display: block; margin: 0 auto; border: none; background: var(--accent); color: #fff; padding: 0.5rem 1.2rem; font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.pp-play:active { transform: scale(0.96); }
.pp-console { margin: 1rem auto 0; max-width: 320px; text-align: left; border: 1.5px solid var(--line); background: var(--paper-alt); padding: 0.5rem 0.75rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.68rem; min-height: 1.8em; }
.pp-console .pp-cline { opacity: 0; transition: opacity 0.25s ease; color: var(--good); display: block; }
.pp-console .pp-cline.is-shown { opacity: 1; }
.pp-note { text-align: center; font-size: 0.78rem; color: var(--ink-soft); padding-top: 1.3rem; }
.pp-note strong { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
.infographic-prependel *, .infographic-prependel *::before, .infographic-prependel *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="pp-wrap">
<div class="pp-hero">
<h1>element.prepend()</h1>
<p>Same idea as append() β inside the container, just at the front instead.</p>
</div>
<div class="pp-tabs">
<button class="pp-tab is-active" data-tab="elements" type="button">prepending elements</button>
<button class="pp-tab" data-tab="text" type="button">prepending text</button>
</div>
<!-- elements -->
<div class="pp-panel is-active" data-panel="elements">
<div class="pp-code"><span class="tok-kw">const</span> <span class="tok-var">app</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">querySelector</span><span class="tok-punc">(</span><span class="tok-str">'#app'</span><span class="tok-punc">);</span>
<span class="tok-kw">const</span> <span class="tok-var">langs</span> <span class="tok-punc">=</span> <span class="tok-punc">[</span><span class="tok-str">'CSS'</span><span class="tok-punc">,</span> <span class="tok-str">'JavaScript'</span><span class="tok-punc">,</span> <span class="tok-str">'TypeScript'</span><span class="tok-punc">];</span>
<span class="tok-kw">const</span> <span class="tok-var">nodes</span> <span class="tok-punc">=</span> <span class="tok-var">langs</span><span class="tok-punc">.</span><span class="tok-fn">map</span><span class="tok-punc">(</span><span class="tok-var">lang</span> <span class="tok-punc">=> {</span>
<span class="tok-kw">const</span> <span class="tok-var">li</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">createElement</span><span class="tok-punc">(</span><span class="tok-str">'li'</span><span class="tok-punc">);</span>
<span class="tok-var">li</span><span class="tok-punc">.</span><span class="tok-var">textContent</span> <span class="tok-punc">=</span> <span class="tok-var">lang</span><span class="tok-punc">;</span>
<span class="tok-kw">return</span> <span class="tok-var">li</span><span class="tok-punc">;</span>
<span class="tok-punc">});</span>
<span class="tok-var">app</span><span class="tok-punc">.</span><span class="tok-fn">prepend</span><span class="tok-punc">(...</span><span class="tok-var">nodes</span><span class="tok-punc">);</span></div>
<div class="pp-page">
<div class="pp-page-bar"><div class="pp-page-dot"></div><div class="pp-page-dot"></div><div class="pp-page-dot"></div></div>
<div class="pp-page-body">
<span style="font-family:'IBM Plex Mono',monospace;font-size:0.6rem;color:var(--ink-soft);display:block;margin-bottom:0.4rem;order:0;"><ul id="app"></span>
<div class="pp-item is-new" id="el1" style="order:1;">CSS</div>
<div class="pp-item is-new" id="el2" style="order:2;">JavaScript</div>
<div class="pp-item is-new" id="el3" style="order:3;">TypeScript</div>
<div class="pp-item" style="order:4;">HTML</div>
</div>
</div>
<button class="pp-play" data-run="elements" type="button">run</button>
<p class="pp-note">All three land <strong>before</strong> the existing <li> β same relative order as the array, right at the front.</p>
</div>
<!-- text -->
<div class="pp-panel" data-panel="text">
<div class="pp-code"><span class="tok-kw">const</span> <span class="tok-var">app</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">querySelector</span><span class="tok-punc">(</span><span class="tok-str">'#app'</span><span class="tok-punc">);</span>
<span class="tok-var">app</span><span class="tok-punc">.</span><span class="tok-fn">prepend</span><span class="tok-punc">(</span><span class="tok-str">'prepend() Text Demo'</span><span class="tok-punc">);</span>
<span class="tok-var">console</span><span class="tok-punc">.</span><span class="tok-fn">log</span><span class="tok-punc">(</span><span class="tok-var">app</span><span class="tok-punc">.</span><span class="tok-var">textContent</span><span class="tok-punc">);</span></div>
<div class="pp-page">
<div class="pp-page-bar"><div class="pp-page-dot"></div><div class="pp-page-dot"></div><div class="pp-page-dot"></div></div>
<div class="pp-page-body">
<span style="font-family:'IBM Plex Mono',monospace;font-size:0.6rem;color:var(--ink-soft);display:block;margin-bottom:0.4rem;"><div id="app"></span>
<div class="pp-container" id="textContainer">
<span class="pp-empty-tag" id="emptyTag">β empty β</span>
<span class="pp-text-result" id="textResult">prepend() Text Demo</span>
</div>
</div>
</div>
<button class="pp-play" data-run="text" type="button">run</button>
<div class="pp-console"><span class="pp-cline" id="outText">"prepend() Text Demo"</span></div>
<p class="pp-note">Just like <strong>append()</strong>, a plain string is auto-converted to a text node β placed at the <strong>start</strong> this time.</p>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-prependel')
|| document.querySelector('.infographic-prependel');
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');
wrapper.querySelectorAll('.pp-tab').forEach(tab => {
tab.addEventListener('click', () => {
wrapper.querySelectorAll('.pp-tab').forEach(t => t.classList.remove('is-active'));
wrapper.querySelectorAll('.pp-panel').forEach(p => p.classList.remove('is-active'));
tab.classList.add('is-active');
wrapper.querySelector('.pp-panel[data-panel="' + tab.dataset.tab + '"]').classList.add('is-active');
});
});
wrapper.querySelector('[data-run="elements"]').addEventListener('click', () => {
const items = ['el1', 'el2', 'el3'].map(id => wrapper.querySelector('#' + id));
items.forEach(i => i.classList.remove('is-shown'));
void items[0].offsetWidth;
items.forEach((item, i) => setTimeout(() => item.classList.add('is-shown'), 150 + i * 220));
});
wrapper.querySelector('[data-run="text"]').addEventListener('click', () => {
const container = wrapper.querySelector('#textContainer');
const result = wrapper.querySelector('#textResult');
const out = wrapper.querySelector('#outText');
container.classList.remove('has-content');
result.classList.remove('is-shown');
out.classList.remove('is-shown');
void container.offsetWidth;
setTimeout(() => {
container.classList.add('has-content');
result.classList.add('is-shown');
}, 150);
setTimeout(() => out.classList.add('is-shown'), 500);
});
})();
</script>π prepend() vs append()
Method | Inserts |
|---|---|
| Inside element, at the start |
| Inside element, at the end |