Skip to content
tezvyn:
Menu

CSS-in-JS: Scoped Styles via JavaScript

Source: Wikipedia: CSS-in-JSMediumHow cards are made

CSS-in-JS lets components own their styles in JavaScript, generating CSS and injecting it into the DOM at runtime. It prevents global namespace collisions in component frameworks. The footgun is runtime overhead and bigger bundles.

Why it exists

Traditional CSS operates in a global namespace where rules can collide across files. As interfaces decompose into reusable components, maintaining separate style sheets becomes fragile because a change in one file can leak and break another. CSS-in-JS was created to colocate a component's logic and its visual rules so that ownership is explicit and side effects are contained.

The mental model

Think of it as moving the stylesheet from a static file into a factory function that lives next to your component. Instead of writing selectors that reach across the DOM, you describe styles as data inside JavaScript. The browser never sees that raw JavaScript; it sees the CSS that the JavaScript emits.

How it works

You write style declarations using JavaScript syntax. When the code is parsed, the library generates actual CSS rules and attaches them into the DOM. This happens at runtime, so the styles are generated and attached dynamically rather than loaded from a separate static file. The abstraction ties each set of rules to its component, preventing the global leakage that makes large codebases fragile.

When to use it

Reach for CSS-in-JS when you are building an application made of many reusable components and you want to eliminate global namespace collisions. It is also useful when you need styles that depend on runtime state, because the JavaScript layer can compute values before generating the final CSS. Teams that value colocation of logic and presentation often prefer this tight coupling.

When not to use it

Avoid it when every byte of JavaScript matters, because the parsing and injection step adds runtime overhead and increases bundle size compared to plain CSS files. It also introduces a dependency that can complicate caching strategies. If your project uses mostly static pages with minimal interactivity, the abstraction may cost more than it saves.

One canonical example

A button component written with a library like Styled Components, Emotion, or JSS keeps its hover, focus, and size variants in the same file as its markup logic. When the application renders, the library generates CSS and attaches it into the DOM alongside the component. If the button is removed from the page, its styles disappear with it, leaving no orphaned rules behind.

Interview question

When should a team accept CSS-in-JS's runtime cost?

  • a.When the project consists of mostly static pages with minimal interactivity
  • b.When the team wants to eliminate global namespace collisions without adding JavaScript to the bundle
  • c.When long-term caching of CSS files is a critical architectural requirement
  • d.When building many reusable components whose styles depend on runtime stateCorrect
Why?

CSS-in-JS trades runtime overhead for scoped, dynamic component styles, so it is justified when components are reusable and state-dependent. Option B is tempting because it names the exact collision problem CSS-in-JS solves, but achieving that scoping inherently requires adding JavaScript to the bundle.

Just read this? Test yourself on what you have been reading.

Read the original → en.wikipedia.org

Put your scrolling time to good use

Learn one idea, try a quiz and save useful cards for revision. Tezvyn makes it easy to learn and stay current in your tech field, a few minutes at a time.

The iPhone app is on the way

We are building it. Until it lands, nothing here is held back from you: every interview card, your saved cards, streaks and the job board all work in Safari, plus hundreds of free practice quizzes of thirty questions each. Sign in and it all carries over to the app the day it arrives.

Want it as an icon? Tap Share at the bottom of Safari, then Add to Home Screen. It opens full screen and the cards you have read stay available offline.

Get it on Google PlayiPhone app coming soon

We are hiring for this. Open roles that interview on css — each one lists the topics its interview covers.

See open roles