DOM Styling lets JavaScript change how elements look on the page without reloading it.
🔹 1. Inline Styling using style property
What happens?
JavaScript accesses an element
Applies CSS directly on the element
This is called inline CSS
Syntax
element.style.propertyName = "value";📌 CSS properties with hyphens (font-size) become camelCase (fontSize)
<div class="infographic-stylecamel">
<style>
.infographic-stylecamel {
--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-stylecamel[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-stylecamel * { box-sizing: border-box; }
.infographic-stylecamel h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-stylecamel p { margin: 0; }
.infographic-stylecamel button { font-family: inherit; }
.sc-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.sc-hero { text-align: center; margin-bottom: 1.2rem; }
.sc-hero h1 { font-size: clamp(1.3rem, 4.5vw, 1.75rem); }
.sc-hero p { color: var(--ink-soft); margin-top: 0.4rem; font-size: 0.84rem; }
.sc-code { background: #1e1e1e; color: #d4d4d4; border-radius: 5px; padding: 0.6rem 0.8rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.72rem; line-height: 1.75; margin-bottom: 1rem; }
.sc-code .ln { display: block; padding: 0.05rem 0.3rem; border-radius: 3px; transition: background 0.3s ease, border-color 0.3s ease; border-left: 2px solid transparent; }
.sc-code .ln.key-line { border-left-color: rgba(37,99,235,0.4); padding-left: 0.5rem; margin-left: -0.2rem; }
.sc-code .ln.is-active { background: rgba(37,99,235,0.25); border-left-color: var(--accent); }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.tok-str { color: #ce9178; }
.tok-com { color: #6a9955; }
.tok-prop { color: #dcdcaa; }
.tok-tag { color: #569cd6; }
.tok-attr { color: #9cdcfe; }
.tok-aval { color: #ce9178; }
.sc-label { font-family: 'IBM Plex Mono', monospace; font-size: 0.6rem; color: var(--ink-soft); margin-bottom: 0.3rem; display: block; }
.sc-page { border: 1.5px solid var(--line); background: var(--paper-alt); border-radius: 6px; overflow: hidden; margin-bottom: 1rem; }
.sc-page-bar { background: #2b2b2b; padding: 0.4rem 0.6rem; display: flex; gap: 0.3rem; }
.sc-page-dot { width: 8px; height: 8px; border-radius: 50%; background: #555; }
.sc-page-body { padding: 1.2rem; background: var(--paper); text-align: center; }
.sc-target { color: var(--ink); font-size: 15px; transition: color 0.45s ease, font-size 0.45s ease; }
.sc-target.is-styled { color: #2563eb; font-size: 20px; font-weight: 600; }
.sc-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; }
.sc-play:active { transform: scale(0.96); }
.sc-note { text-align: center; font-size: 0.78rem; color: var(--ink-soft); padding-top: 1.3rem; }
.sc-note strong { color: var(--ink); }
.sc-note code { font-family: 'IBM Plex Mono', monospace; background: var(--paper-alt); padding: 0.05rem 0.3rem; border-radius: 3px; }
@media (prefers-reduced-motion: reduce) {
.infographic-stylecamel *, .infographic-stylecamel *::before, .infographic-stylecamel *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="sc-wrap">
<span class="sc-label">HTML</span>
<div class="sc-code"><<span class="tok-tag">p</span> <span class="tok-attr">id</span>=<span class="tok-aval">"text"</span>>Hello World</<span class="tok-tag">p</span>></div>
<span class="sc-label">JavaScript</span>
<div class="sc-code" id="scCode">
<div class="ln" data-line="1">const text = document.getElementById("text");</div>
<div class="ln key-line" data-line="2">text.style.<span class="tok-prop">color</span> = <span class="tok-aval">"blue"</span>;</div>
<div class="ln key-line" data-line="3">text.style.<span class="tok-prop">fontSize</span> = <span class="tok-aval">"20px"</span>;</div>
</div>
<div class="sc-page">
<div class="sc-page-bar"><div class="sc-page-dot"></div><div class="sc-page-dot"></div><div class="sc-page-dot"></div></div>
<div class="sc-page-body">
<p class="sc-target" id="scTarget">Hello World</p>
</div>
</div>
<button class="sc-play" id="scPlay" type="button">run</button>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-stylecamel')
|| document.querySelector('.infographic-stylecamel');
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');
const lines = wrapper.querySelectorAll('#scCode .ln');
const target = wrapper.querySelector('#scTarget');
const playBtn = wrapper.querySelector('#scPlay');
function setLine(n) {
lines.forEach(l => l.classList.toggle('is-active', Number(l.dataset.line) === n));
}
playBtn.addEventListener('click', () => {
playBtn.disabled = true;
target.classList.remove('is-styled');
setLine(1);
setTimeout(() => setLine(2), 300);
setTimeout(() => { target.style.color = '#2563eb'; }, 450);
setTimeout(() => setLine(3), 750);
setTimeout(() => { target.classList.add('is-styled'); }, 900);
setTimeout(() => { setLine(0); playBtn.disabled = false; }, 1400);
});
})();
</script>Explanation
getElementById("text")selects the<p>element.style.colorchanges the text color to blue.style.fontSizeincreases the font size.Styles are applied immediately.
🔹 2. Applying Multiple Styles using cssText
When to use?
When you want to apply many styles at once
<div class="infographic-csstext">
<style>
.infographic-csstext {
--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-csstext[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-csstext * { box-sizing: border-box; }
.infographic-csstext h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-csstext p { margin: 0; }
.infographic-csstext button { font-family: inherit; }
.ct-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.ct-label { font-family: 'IBM Plex Mono', monospace; font-size: 0.6rem; color: var(--ink-soft); margin-bottom: 0.3rem; display: block; }
.ct-code { background: #1e1e1e; color: #d4d4d4; border-radius: 5px; padding: 0.6rem 0.8rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.72rem; line-height: 1.75; margin-bottom: 1rem; white-space: pre; overflow-x: auto; }
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.tok-str { color: #ce9178; }
.tok-tag { color: #569cd6; }
.tok-attr { color: #9cdcfe; }
.tok-aval { color: #ce9178; }
.tok-prop { color: #dcdcaa; }
.ct-page { border: 1.5px solid var(--line); background: var(--paper-alt); border-radius: 6px; overflow: hidden; margin-bottom: 1rem; }
.ct-page-bar { background: #2b2b2b; padding: 0.4rem 0.6rem; display: flex; gap: 0.3rem; }
.ct-page-dot { width: 8px; height: 8px; border-radius: 50%; background: #555; }
.ct-page-body { padding: 1.2rem; background: var(--paper); text-align: center; }
.ct-target { display: inline-block; padding: 0.3rem 0.5rem; color: var(--ink); font-size: 15px; transition: color 0.4s ease, font-weight 0.4s ease, background-color 0.4s ease, padding 0.4s ease; }
.ct-target.is-styled { color: red; font-weight: bold; background-color: yellow; }
.ct-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; }
.ct-play:active { transform: scale(0.96); }
@media (prefers-reduced-motion: reduce) {
.infographic-csstext *, .infographic-csstext *::before, .infographic-csstext *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="ct-wrap">
<span class="ct-label">HTML</span>
<div class="ct-code"><<span class="tok-tag">p</span> <span class="tok-attr">id</span>=<span class="tok-aval">"text"</span>>Hello World</<span class="tok-tag">p</span>></div>
<span class="ct-label">JavaScript</span>
<div class="ct-code"><span class="tok-kw">const</span> <span class="tok-var">text</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">getElementById</span><span class="tok-punc">(</span><span class="tok-str">"text"</span><span class="tok-punc">);</span>
<span class="tok-var">text</span><span class="tok-punc">.</span><span class="tok-var">style</span><span class="tok-punc">.</span><span class="tok-prop">cssText</span> <span class="tok-punc">=</span> <span class="tok-str">"color:red; font-weight:bold; background:yellow;"</span><span class="tok-punc">;</span></div>
<div class="ct-page">
<div class="ct-page-bar"><div class="ct-page-dot"></div><div class="ct-page-dot"></div><div class="ct-page-dot"></div></div>
<div class="ct-page-body">
<p class="ct-target" id="ctTarget">Hello World</p>
</div>
</div>
<button class="ct-play" id="ctPlay" type="button">run</button>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-csstext')
|| document.querySelector('.infographic-csstext');
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');
const target = wrapper.querySelector('#ctTarget');
const playBtn = wrapper.querySelector('#ctPlay');
playBtn.addEventListener('click', () => {
target.classList.remove('is-styled');
void target.offsetWidth;
setTimeout(() => { target.classList.add('is-styled'); }, 150);
});
})();
</script>Explanation
cssTextworks like writing CSS inside thestyleattribute.All styles are applied in one line.
It overwrites previous inline styles.
🔹 3. Styling using CSS Classes (classList.add())
Why this is best?
Keeps CSS separate from JavaScript
Easier to maintain and reuse
<div class="infographic-classlist">
<style>
.infographic-classlist {
--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-classlist[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-classlist * { box-sizing: border-box; }
.infographic-classlist h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-classlist p { margin: 0; }
.infographic-classlist button { font-family: inherit; }
.cla-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.cla-label { font-family: 'IBM Plex Mono', monospace; font-size: 0.6rem; color: var(--ink-soft); margin-bottom: 0.3rem; display: block; }
.cla-code { background: #1e1e1e; color: #d4d4d4; border-radius: 5px; padding: 0.6rem 0.8rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.72rem; line-height: 1.75; margin-bottom: 1rem; white-space: pre; overflow-x: auto; }
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.tok-str { color: #ce9178; }
.tok-tag { color: #569cd6; }
.tok-attr { color: #9cdcfe; }
.tok-aval { color: #ce9178; }
.tok-prop { color: #dcdcaa; }
.tok-sel { color: #d7ba7d; }
.tok-cssprop { color: #9cdcfe; }
.tok-cssval { color: #ce9178; }
.cla-page { border: 1.5px solid var(--line); background: var(--paper-alt); border-radius: 6px; overflow: hidden; margin-bottom: 1rem; }
.cla-page-bar { background: #2b2b2b; padding: 0.4rem 0.6rem; display: flex; gap: 0.3rem; }
.cla-page-dot { width: 8px; height: 8px; border-radius: 50%; background: #555; }
.cla-page-body { padding: 1.2rem; background: var(--paper); text-align: center; }
.cla-target { display: inline-block; padding: 0.3rem 0.5rem; color: var(--ink); font-size: 15px; transition: color 0.4s ease, font-size 0.4s ease; }
.cla-target.is-styled { color: green; font-size: 22px; }
.cla-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; }
.cla-play:active { transform: scale(0.96); }
@media (prefers-reduced-motion: reduce) {
.infographic-classlist *, .infographic-classlist *::before, .infographic-classlist *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="cla-wrap">
<span class="cla-label">HTML</span>
<div class="cla-code"><<span class="tok-tag">p</span> <span class="tok-attr">id</span>=<span class="tok-aval">"msg"</span>>Welcome</<span class="tok-tag">p</span>></div>
<span class="cla-label">CSS</span>
<div class="cla-code"><span class="tok-sel">.highlight</span> <span class="tok-punc">{</span>
<span class="tok-cssprop">color</span><span class="tok-punc">:</span> <span class="tok-cssval">green</span><span class="tok-punc">;</span>
<span class="tok-cssprop">font-size</span><span class="tok-punc">:</span> <span class="tok-cssval">22px</span><span class="tok-punc">;</span>
<span class="tok-punc">}</span></div>
<span class="cla-label">JavaScript</span>
<div class="cla-code"><span class="tok-kw">const</span> <span class="tok-var">msg</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">getElementById</span><span class="tok-punc">(</span><span class="tok-str">"msg"</span><span class="tok-punc">);</span>
<span class="tok-var">msg</span><span class="tok-punc">.</span><span class="tok-var">classList</span><span class="tok-punc">.</span><span class="tok-fn">add</span><span class="tok-punc">(</span><span class="tok-str">"highlight"</span><span class="tok-punc">);</span></div>
<div class="cla-page">
<div class="cla-page-bar"><div class="cla-page-dot"></div><div class="cla-page-dot"></div><div class="cla-page-dot"></div></div>
<div class="cla-page-body">
<p class="cla-target" id="claTarget">Welcome</p>
</div>
</div>
<button class="cla-play" id="claPlay" type="button">run</button>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-classlist')
|| document.querySelector('.infographic-classlist');
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');
const target = wrapper.querySelector('#claTarget');
const playBtn = wrapper.querySelector('#claPlay');
playBtn.addEventListener('click', () => {
target.classList.remove('is-styled');
void target.offsetWidth;
setTimeout(() => { target.classList.add('is-styled'); }, 150);
});
})();
</script>Explanation
CSS class
.highlightdefines the style.classList.add()attaches the class to the element.Browser applies the CSS automatically.
🔹 4. Removing Styles (classList.remove())
<div class="infographic-classlist">
<style>
.infographic-classlist {
--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-classlist[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-classlist * { box-sizing: border-box; }
.infographic-classlist h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-classlist p { margin: 0; }
.infographic-classlist button { font-family: inherit; }
.cla-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.cla-label { font-family: 'IBM Plex Mono', monospace; font-size: 0.6rem; color: var(--ink-soft); margin-bottom: 0.3rem; display: block; }
.cla-code { background: #1e1e1e; color: #d4d4d4; border-radius: 5px; padding: 0.6rem 0.8rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.72rem; line-height: 1.75; margin-bottom: 1rem; white-space: pre; overflow-x: auto; }
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.tok-str { color: #ce9178; }
.tok-tag { color: #569cd6; }
.tok-attr { color: #9cdcfe; }
.tok-aval { color: #ce9178; }
.tok-prop { color: #dcdcaa; }
.tok-sel { color: #d7ba7d; }
.tok-cssprop { color: #9cdcfe; }
.tok-cssval { color: #ce9178; }
.cla-page { border: 1.5px solid var(--line); background: var(--paper-alt); border-radius: 6px; overflow: hidden; margin-bottom: 1rem; }
.cla-page-bar { background: #2b2b2b; padding: 0.4rem 0.6rem; display: flex; gap: 0.3rem; }
.cla-page-dot { width: 8px; height: 8px; border-radius: 50%; background: #555; }
.cla-page-body { padding: 1.2rem; background: var(--paper); text-align: center; }
.cla-target { display: inline-block; padding: 0.3rem 0.5rem; color: var(--ink); font-size: 15px; transition: color 0.4s ease, font-size 0.4s ease; }
.cla-target.is-styled { color: green; font-size: 22px; }
.cla-play { border: none; background: var(--accent); color: #fff; padding: 0.5rem 1.1rem; font-size: 0.78rem; font-weight: 600; cursor: pointer; }
.cla-play:active { transform: scale(0.96); }
.cla-play.alt { background: var(--paper-alt); color: var(--ink-soft); border: 1px solid var(--line); }
.cla-play.alt:hover { border-color: var(--accent); color: var(--accent); }
.cla-playrow { display: flex; gap: 0.6rem; justify-content: center; flex-wrap: wrap; }
@media (prefers-reduced-motion: reduce) {
.infographic-classlist *, .infographic-classlist *::before, .infographic-classlist *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="cla-wrap">
<span class="cla-label">HTML</span>
<div class="cla-code"><<span class="tok-tag">p</span> <span class="tok-attr">id</span>=<span class="tok-aval">"msg"</span>>Welcome</<span class="tok-tag">p</span>></div>
<span class="cla-label">CSS</span>
<div class="cla-code"><span class="tok-sel">.highlight</span> <span class="tok-punc">{</span>
<span class="tok-cssprop">color</span><span class="tok-punc">:</span> <span class="tok-cssval">green</span><span class="tok-punc">;</span>
<span class="tok-cssprop">font-size</span><span class="tok-punc">:</span> <span class="tok-cssval">22px</span><span class="tok-punc">;</span>
<span class="tok-punc">}</span></div>
<span class="cla-label">JavaScript</span>
<div class="cla-code"><span class="tok-kw">const</span> <span class="tok-var">msg</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">getElementById</span><span class="tok-punc">(</span><span class="tok-str">"msg"</span><span class="tok-punc">);</span>
<span class="tok-var">msg</span><span class="tok-punc">.</span><span class="tok-var">classList</span><span class="tok-punc">.</span><span class="tok-fn">add</span><span class="tok-punc">(</span><span class="tok-str">"highlight"</span><span class="tok-punc">);</span>
<span class="tok-var">msg</span><span class="tok-punc">.</span><span class="tok-var">classList</span><span class="tok-punc">.</span><span class="tok-fn">remove</span><span class="tok-punc">(</span><span class="tok-str">"highlight"</span><span class="tok-punc">);</span></div>
<div class="cla-page">
<div class="cla-page-bar"><div class="cla-page-dot"></div><div class="cla-page-dot"></div><div class="cla-page-dot"></div></div>
<div class="cla-page-body">
<p class="cla-target" id="claTarget">Welcome</p>
</div>
</div>
<div class="cla-playrow">
<button class="cla-play" id="claAdd" type="button">classList.add("highlight")</button>
<button class="cla-play alt" id="claRemove" type="button">classList.remove("highlight")</button>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-classlist')
|| document.querySelector('.infographic-classlist');
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');
const target = wrapper.querySelector('#claTarget');
const addBtn = wrapper.querySelector('#claAdd');
const removeBtn = wrapper.querySelector('#claRemove');
addBtn.addEventListener('click', () => {
target.classList.remove('is-styled');
void target.offsetWidth;
setTimeout(() => { target.classList.add('is-styled'); }, 150);
});
removeBtn.addEventListener('click', () => {
target.classList.remove('is-styled');
});
})();
</script>Explanation
Removes the class from the element.
CSS styles linked to that class are removed.
Element returns to default style.
🔹 5. Toggle Styles (classList.toggle())
Why toggle?
Perfect for dark mode, show/hide, accordion
<div class="infographic-classlist">
<style>
.infographic-classlist {
--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-classlist[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-classlist * { box-sizing: border-box; }
.infographic-classlist h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-classlist p { margin: 0; }
.infographic-classlist button { font-family: inherit; }
.cla-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.cla-label { font-family: 'IBM Plex Mono', monospace; font-size: 0.6rem; color: var(--ink-soft); margin-bottom: 0.3rem; display: block; }
.cla-code { background: #1e1e1e; color: #d4d4d4; border-radius: 5px; padding: 0.6rem 0.8rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.72rem; line-height: 1.75; margin-bottom: 1rem; white-space: pre; overflow-x: auto; }
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.tok-str { color: #ce9178; }
.tok-tag { color: #569cd6; }
.tok-attr { color: #9cdcfe; }
.tok-aval { color: #ce9178; }
.tok-prop { color: #dcdcaa; }
.tok-sel { color: #d7ba7d; }
.tok-cssprop { color: #9cdcfe; }
.tok-cssval { color: #ce9178; }
.cla-page { border: 1.5px solid var(--line); background: var(--paper-alt); border-radius: 6px; overflow: hidden; margin-bottom: 1rem; }
.cla-page-bar { background: #2b2b2b; padding: 0.4rem 0.6rem; display: flex; gap: 0.3rem; }
.cla-page-dot { width: 8px; height: 8px; border-radius: 50%; background: #555; }
.cla-page-body { padding: 1.2rem; background: var(--paper); text-align: center; }
.cla-target { display: inline-block; padding: 0.3rem 0.5rem; color: var(--ink); font-size: 15px; transition: color 0.4s ease, font-size 0.4s ease; }
.cla-target.is-styled { color: green; font-size: 22px; }
.cla-play { display: block; margin: 0 auto; border: none; background: var(--good); color: #fff; padding: 0.5rem 1.2rem; font-size: 0.8rem; font-weight: 600; cursor: pointer; }
.cla-play:active { transform: scale(0.96); }
@media (prefers-reduced-motion: reduce) {
.infographic-classlist *, .infographic-classlist *::before, .infographic-classlist *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="cla-wrap">
<span class="cla-label">HTML</span>
<div class="cla-code"><<span class="tok-tag">p</span> <span class="tok-attr">id</span>=<span class="tok-aval">"msg"</span>>Welcome</<span class="tok-tag">p</span>></div>
<span class="cla-label">CSS</span>
<div class="cla-code"><span class="tok-sel">.highlight</span> <span class="tok-punc">{</span>
<span class="tok-cssprop">color</span><span class="tok-punc">:</span> <span class="tok-cssval">green</span><span class="tok-punc">;</span>
<span class="tok-cssprop">font-size</span><span class="tok-punc">:</span> <span class="tok-cssval">22px</span><span class="tok-punc">;</span>
<span class="tok-punc">}</span></div>
<span class="cla-label">JavaScript</span>
<div class="cla-code"><span class="tok-kw">const</span> <span class="tok-var">msg</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">getElementById</span><span class="tok-punc">(</span><span class="tok-str">"msg"</span><span class="tok-punc">);</span>
<span class="tok-var">msg</span><span class="tok-punc">.</span><span class="tok-var">classList</span><span class="tok-punc">.</span><span class="tok-fn">toggle</span><span class="tok-punc">(</span><span class="tok-str">"highlight"</span><span class="tok-punc">);</span></div>
<div class="cla-page">
<div class="cla-page-bar"><div class="cla-page-dot"></div><div class="cla-page-dot"></div><div class="cla-page-dot"></div></div>
<div class="cla-page-body">
<p class="cla-target" id="claTarget">Welcome</p>
</div>
</div>
<button class="cla-play toggle" id="claToggle" type="button">toggle("highlight")</button>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-classlist')
|| document.querySelector('.infographic-classlist');
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');
const target = wrapper.querySelector('#claTarget');
const toggleBtn = wrapper.querySelector('#claToggle');
toggleBtn.addEventListener('click', () => {
target.classList.toggle('is-styled');
});
})();
</script>Explanation
If class exists → it removes it
If class doesn’t exist → it adds it
🔹 6. Check if a Class Exists (classList.contains())
<div class="infographic-classlist">
<style>
.infographic-classlist {
--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-classlist[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-classlist * { box-sizing: border-box; }
.infographic-classlist h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-classlist p { margin: 0; }
.infographic-classlist button { font-family: inherit; }
.cla-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.cla-label { font-family: 'IBM Plex Mono', monospace; font-size: 0.6rem; color: var(--ink-soft); margin-bottom: 0.3rem; display: block; }
.cla-code { background: #1e1e1e; color: #d4d4d4; border-radius: 5px; padding: 0.6rem 0.8rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.72rem; line-height: 1.75; margin-bottom: 1rem; white-space: pre; overflow-x: auto; }
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.tok-str { color: #ce9178; }
.tok-tag { color: #569cd6; }
.tok-attr { color: #9cdcfe; }
.tok-aval { color: #ce9178; }
.tok-prop { color: #dcdcaa; }
.tok-sel { color: #d7ba7d; }
.tok-cssprop { color: #9cdcfe; }
.tok-cssval { color: #ce9178; }
.cla-page { border: 1.5px solid var(--line); background: var(--paper-alt); border-radius: 6px; overflow: hidden; margin-bottom: 1rem; }
.cla-page-bar { background: #2b2b2b; padding: 0.4rem 0.6rem; display: flex; gap: 0.3rem; }
.cla-page-dot { width: 8px; height: 8px; border-radius: 50%; background: #555; }
.cla-page-body { padding: 1.2rem; background: var(--paper); text-align: center; }
.cla-target { display: inline-block; padding: 0.3rem 0.5rem; color: var(--ink); font-size: 15px; transition: color 0.4s ease, font-size 0.4s ease; }
.cla-target.is-styled { color: green; font-size: 22px; }
.cla-play { border: none; background: var(--good); color: #fff; padding: 0.5rem 1.1rem; font-size: 0.78rem; font-weight: 600; cursor: pointer; }
.cla-play:active { transform: scale(0.96); }
.cla-play.alt { background: var(--paper-alt); color: var(--ink-soft); border: 1px solid var(--line); }
.cla-play.alt:hover { border-color: var(--accent); color: var(--accent); }
.cla-playrow { display: flex; gap: 0.6rem; justify-content: center; flex-wrap: wrap; }
.cla-console { margin: 1rem auto 0; max-width: 260px; 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.72rem; }
.cla-console .cla-cline { transition: color 0.3s ease; color: var(--ink-soft); }
.cla-console .cla-cline.is-true { color: var(--good); font-weight: 700; }
.cla-console .cla-cline.is-false { color: var(--ink-soft); }
@media (prefers-reduced-motion: reduce) {
.infographic-classlist *, .infographic-classlist *::before, .infographic-classlist *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="cla-wrap">
<span class="cla-label">HTML</span>
<div class="cla-code"><<span class="tok-tag">p</span> <span class="tok-attr">id</span>=<span class="tok-aval">"msg"</span>>Welcome</<span class="tok-tag">p</span>></div>
<span class="cla-label">CSS</span>
<div class="cla-code"><span class="tok-sel">.highlight</span> <span class="tok-punc">{</span>
<span class="tok-cssprop">color</span><span class="tok-punc">:</span> <span class="tok-cssval">green</span><span class="tok-punc">;</span>
<span class="tok-cssprop">font-size</span><span class="tok-punc">:</span> <span class="tok-cssval">22px</span><span class="tok-punc">;</span>
<span class="tok-punc">}</span></div>
<span class="cla-label">JavaScript</span>
<div class="cla-code"><span class="tok-kw">const</span> <span class="tok-var">msg</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">getElementById</span><span class="tok-punc">(</span><span class="tok-str">"msg"</span><span class="tok-punc">);</span>
<span class="tok-var">msg</span><span class="tok-punc">.</span><span class="tok-var">classList</span><span class="tok-punc">.</span><span class="tok-fn">toggle</span><span class="tok-punc">(</span><span class="tok-str">"highlight"</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">msg</span><span class="tok-punc">.</span><span class="tok-var">classList</span><span class="tok-punc">.</span><span class="tok-fn">contains</span><span class="tok-punc">(</span><span class="tok-str">"highlight"</span><span class="tok-punc">));</span></div>
<div class="cla-page">
<div class="cla-page-bar"><div class="cla-page-dot"></div><div class="cla-page-dot"></div><div class="cla-page-dot"></div></div>
<div class="cla-page-body">
<p class="cla-target" id="claTarget">Welcome</p>
</div>
</div>
<div class="cla-playrow">
<button class="cla-play" id="claToggle" type="button">toggle("highlight")</button>
<button class="cla-play alt" id="claContains" type="button">check contains("highlight")</button>
</div>
<div class="cla-console"><span class="cla-cline" id="claOut">false</span></div>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-classlist')
|| document.querySelector('.infographic-classlist');
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');
const target = wrapper.querySelector('#claTarget');
const toggleBtn = wrapper.querySelector('#claToggle');
const containsBtn = wrapper.querySelector('#claContains');
const out = wrapper.querySelector('#claOut');
function updateOut() {
const has = target.classList.contains('is-styled');
out.textContent = has ? 'true' : 'false';
out.classList.toggle('is-true', has);
out.classList.toggle('is-false', !has);
}
toggleBtn.addEventListener('click', () => {
target.classList.toggle('is-styled');
updateOut();
});
containsBtn.addEventListener('click', () => {
updateOut();
});
})();
</script>Explanation
Checks whether the element has the class
Returns a boolean value
🔹 7. Reading Styles with getComputedStyle()
Why needed?
Inline styles may not exist
Final styles come from CSS, classes, browser defaults
<div class="infographic-classlist">
<style>
.infographic-classlist {
--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-classlist[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-classlist * { box-sizing: border-box; }
.infographic-classlist h1 { font-family: 'Fraunces', Georgia, serif; font-weight: 600; margin: 0; }
.infographic-classlist p { margin: 0; }
.infographic-classlist button { font-family: inherit; }
.cla-wrap { padding: clamp(1.25rem, 5vw, 2.5rem) clamp(1.1rem, 5vw, 3rem) 2rem; }
.cla-label { font-family: 'IBM Plex Mono', monospace; font-size: 0.6rem; color: var(--ink-soft); margin-bottom: 0.3rem; display: block; }
.cla-code { background: #1e1e1e; color: #d4d4d4; border-radius: 5px; padding: 0.6rem 0.8rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.72rem; line-height: 1.75; margin-bottom: 1rem; white-space: pre; overflow-x: auto; }
.tok-kw { color: #569cd6; }
.tok-fn { color: #dcdcaa; }
.tok-var { color: #9cdcfe; }
.tok-punc { color: #d4d4d4; }
.tok-str { color: #ce9178; }
.tok-tag { color: #569cd6; }
.tok-attr { color: #9cdcfe; }
.tok-aval { color: #ce9178; }
.tok-prop { color: #dcdcaa; }
.tok-sel { color: #d7ba7d; }
.tok-cssprop { color: #9cdcfe; }
.tok-cssval { color: #ce9178; }
.tok-com { color: #6a9955; }
.cla-page { border: 1.5px solid var(--line); background: var(--paper-alt); border-radius: 6px; overflow: hidden; margin-bottom: 1rem; }
.cla-page-bar { background: #2b2b2b; padding: 0.4rem 0.6rem; display: flex; gap: 0.3rem; }
.cla-page-dot { width: 8px; height: 8px; border-radius: 50%; background: #555; }
.cla-page-body { padding: 1.2rem; background: var(--paper); text-align: center; }
.cla-target { display: inline-block; padding: 0.3rem 0.5rem; color: var(--ink); font-size: 15px; transition: color 0.4s ease, font-size 0.4s ease; }
.cla-target.is-styled { color: green; font-size: 22px; }
.cla-play { display: block; margin: 0 auto; border: none; background: var(--good); color: #fff; padding: 0.5rem 1.1rem; font-size: 0.78rem; font-weight: 600; cursor: pointer; }
.cla-play:active { transform: scale(0.96); }
.cla-play.alt { background: var(--paper-alt); color: var(--ink-soft); border: 1px solid var(--line); }
.cla-play.alt:hover { border-color: var(--accent); color: var(--accent); }
.cla-playrow { display: flex; gap: 0.6rem; justify-content: center; flex-wrap: wrap; }
.cla-console { margin: 1rem auto 0; max-width: 300px; 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.7rem; line-height: 1.7; }
.cla-console .cla-cline { display: block; transition: color 0.3s ease; color: var(--ink-soft); }
.cla-console .cla-cline.is-true { color: var(--good); font-weight: 700; }
@media (prefers-reduced-motion: reduce) {
.infographic-classlist *, .infographic-classlist *::before, .infographic-classlist *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="cla-wrap">
<span class="cla-label">HTML</span>
<div class="cla-code"><<span class="tok-tag">p</span> <span class="tok-attr">id</span>=<span class="tok-aval">"msg"</span>>Welcome</<span class="tok-tag">p</span>></div>
<span class="cla-label">CSS</span>
<div class="cla-code"><span class="tok-sel">.highlight</span> <span class="tok-punc">{</span>
<span class="tok-cssprop">color</span><span class="tok-punc">:</span> <span class="tok-cssval">green</span><span class="tok-punc">;</span>
<span class="tok-cssprop">font-size</span><span class="tok-punc">:</span> <span class="tok-cssval">22px</span><span class="tok-punc">;</span>
<span class="tok-punc">}</span></div>
<span class="cla-label">JavaScript</span>
<div class="cla-code"><span class="tok-kw">const</span> <span class="tok-var">msg</span> <span class="tok-punc">=</span> <span class="tok-var">document</span><span class="tok-punc">.</span><span class="tok-fn">getElementById</span><span class="tok-punc">(</span><span class="tok-str">"msg"</span><span class="tok-punc">);</span>
<span class="tok-var">msg</span><span class="tok-punc">.</span><span class="tok-var">classList</span><span class="tok-punc">.</span><span class="tok-fn">toggle</span><span class="tok-punc">(</span><span class="tok-str">"highlight"</span><span class="tok-punc">);</span>
<span class="tok-kw">const</span> <span class="tok-var">styles</span> <span class="tok-punc">=</span> <span class="tok-fn">getComputedStyle</span><span class="tok-punc">(</span><span class="tok-var">msg</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">styles</span><span class="tok-punc">.</span><span class="tok-var">color</span><span class="tok-punc">);</span></div>
<div class="cla-page">
<div class="cla-page-bar"><div class="cla-page-dot"></div><div class="cla-page-dot"></div><div class="cla-page-dot"></div></div>
<div class="cla-page-body">
<p class="cla-target" id="claTarget">Welcome</p>
</div>
</div>
<button class="cla-play" id="claToggle" type="button">toggle("highlight")</button>
<div class="cla-console">
<span class="cla-cline" id="claOutComputed">styles.color: rgb(0, 0, 0)</span>
</div>
</div>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-classlist')
|| document.querySelector('.infographic-classlist');
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');
const target = wrapper.querySelector('#claTarget');
const toggleBtn = wrapper.querySelector('#claToggle');
const outComputed = wrapper.querySelector('#claOutComputed');
toggleBtn.addEventListener('click', () => {
target.classList.toggle('is-styled');
const isHighlighted = target.classList.contains('is-styled');
const color = isHighlighted ? 'rgb(0, 128, 0)' : 'rgb(0, 0, 0)';
outComputed.textContent = 'styles.color: ' + color;
outComputed.classList.toggle('is-true', isHighlighted);
});
})();
</script>Explanation
getComputedStyle()reads final applied CSSColor is returned in RGB format
Works even if style came from a stylesheet
🔹 8. Inline Style vs Class (Best Practice)
Example
// ❌ Inline style (not scalable)
element.style.marginTop = "20px";
// ✅ CSS class (recommended)
element.classList.add("spacing");Explanation
Inline styles are hard to manage
Classes allow reuse and cleaner code
✅ Summary Table
Feature | Use |
|---|---|
| Quick inline changes |
| Multiple inline styles |
| Apply CSS class |
| Remove class |
| Toggle styles |
| Read final styles |
📌 Key Takeaways
✔️ JavaScript uses camelCase for CSS
✔️ Prefer CSS classes over inline styles
✔️ getComputedStyle() shows actual applied CSS