Методологии: БЭМ, scoped styles, CSS Modules
↑ 1.3 CSS и SASS · ← Предыдущая · → Следующая
Зачем это на собесе
Как организовать CSS в большом проекте и не конфликтовать по именам.
Объяснение
Проблема CSS — глобальная область видимости. Способы изоляции:
| Подход | Суть |
|---|---|
| БЭМ (Block__Element—Modifier) | договорённость по именам: .card, .card__title, .card--featured |
Vue <style scoped> | компилятор добавляет data-v-xxx к элементам и селекторам |
| CSS Modules | локальные хэшированные имена классов (styles.card) |
| Shadow DOM | полная изоляция (Web Components) |
| CSS-in-JS | стили в JS (styled-components, Emotion) |
| Utility-first (Tailwind, UnoCSS) | маленькие атомарные классы |
@layer, @scope | контроль каскада и области |
<div class="card card--featured">
<h3 class="card__title">Заголовок</h3>
</div><template><button class="btn">OK</button></template>
<style scoped>
.btn { padding: 8px 16px; } /* только этот компонент */
:deep(.q-field__native) { color: red; } /* пробить в дочерние (осторожно) */
:slotted(.item) { margin: 0; }
</style>
<style module>.title { font-weight: 600; }</style> <!-- CSS Modules: $style.title -->Выбор: во Vue — scoped + токены/переменные; для библиотечных компонентов — БЭМ/@layer; для утилитарной вёрстки — Tailwind/UnoCSS.
Нюансы и подводные камни
scopedувеличивает специфичность и усложняет переопределение стилей UI-библиотек (нужен:deep).- Слишком глубокая БЭМ-вложенность (
.a__b__c) — признак плохой декомпозиции. - Глобальные стили (reset, токены, типографика) — отдельным слоем.
- Утилитарные классы ускоряют разработку, но перегружают шаблон — извлекайте компоненты.
- CSS-in-JS в рантайме дороже по производительности.
Практика
- Перепишите компонент на БЭМ и на
scoped, сравните. - Настройте
:deepдля кастомизации Quasar-компонента. - Ввести
@layerдля сторонних стилей.
Вопросы с ответами
Как работает scoped во Vue?
К элементам компонента добавляется атрибут
data-v-*, а к селекторам — соответствующий атрибутный селектор.
Зачем БЭМ?
Предсказуемые имена без вложенных селекторов и конфликтов.