"매 modular CSS = scope by component, not by selector convention". 매 BEM/SMACSS — 매 naming convention — 매 human discipline. 매 modern (2026) = 매 build-time scoping (CSS Modules, Vue/Svelte SFC, CSS-in-JS, Tailwind utility, @scope native).
매 핵심
매 진화
Global (no scope) — 매 conflict 지옥.
BEM/SMACSS — naming convention — 매 human-enforced.
CSS Modules — build-time hash — 매 automated.
CSS-in-JS (Emotion, styled-components) — 매 runtime + scope.
Tailwind utility — 매 inline atomic.
Native @scope (Chrome 118+) — 매 browser scope.
Shadow DOM — 매 web component native scope.
매 트레이드오프
매 scope 강도 vs runtime cost vs DX.
CSS Modules — 매 zero runtime, 매 build only.
CSS-in-JS — 매 dynamic, 매 runtime cost.
Tailwind — 매 zero CSS bundle (used 만), 매 HTML 매 noisy.
importstylesfrom'./Button.module.css';exportconstButton=()=><buttonclassName={`${styles.button}${styles.primary}`}>Click</button>;// 매 빌드 후: class="Button_button__a1b2c Button_primary__d3e4f"
Native @scope (modern)
<style>@scope(.card){h2{color:#111;font-size:1.25rem;}/* 매 .card 내부 h2 만 — 매 outer h2 의 X */}</style><articleclass="card"><h2>Title</h2><!-- 매 styled --></article><h2>Outside</h2><!-- 매 unstyled -->
Vue SFC scoped
<template><buttonclass="btn">Click</button></template><stylescoped>.btn{padding:0.5rem1rem;}/* 매 빌드: .btn[data-v-abc123] — 매 component 만 */</style>
Svelte (auto-scoped)
<button>Click</button><style>button{padding:0.5rem1rem;}/* 매 빌드: button.svelte-abc123 — 매 자동 */</style>
Tailwind utility (atomic)
<buttonclassName="px-4 py-2 rounded bg-blue-500 text-white hover:bg-blue-600">Click</button>/* 매 component CSS file 의 X — 매 utility 만 */
@layerreset,base,components,utilities;@layerreset{/* normalize */}@layerbase{body{font:16px/1.5system-ui;}}@layercomponents{.button{...}}@layerutilities{.text-center{text-align:center;}}/* 매 specificity 매 layer order — 매 명확 */