К содержимому

5. CSS Scoping

Блок <style> в .sharq — часть SFC (тот же файл, что и <template> и <script>). Есть два режима: global (по умолчанию) и scoped.

Глобальный <style> (по умолчанию, рекомендуется)

Без атрибута scoped CSS выводится как есть (raw) в сгенерированный USS компонента. Селекторы совпадают по имени класса в любом месте поддерева компонента, поэтому BEM-именование уже изолирует ваши стили:

xml
<style>
.card { flex-grow: 1; background-color: #1f1f1f; }
.card__title { font-size: 18px; color: white; }
.card__title:hover { opacity: 0.8; }
</style>
css
/* Compiled Card.g.uss — identical, no rewriting: */
.card { flex-grow: 1; background-color: #1f1f1f; }
.card__title { font-size: 18px; color: white; }
.card__title:hover { opacity: 0.8; }

Совпадают и корневое правило (.card), и дочерние правила (.card__title), потому что элементы несут эти классы (из class="…" в шаблоне). Это надёжный вариант по умолчанию — предпочитайте его, используя уникальные BEM-имена классов (component__part) для изоляции.

Scoped <style scoped>

С scoped компилятор добавляет к каждому селектору class-scope компонента .s-{hash} и добавляет этот scope-класс только корню компонента (ApplyScopedAttributeAddToClassList("s-xxxxxx") в сгенерированном Build()):

xml
<style scoped>
.card { flex-grow: 1; }
.card:hover { opacity: 0.9; }
</style>
css
/* Compiled Card_scoped.g.uss: */
.card.s-a1b2c3 { flex-grow: 1; }
.card.s-a1b2c3:hover { opacity: 0.9; }

Поскольку scope-класс оказывается на корне, .card.s-a1b2c3 корректно совпадает с корнем.

Важное ограничение. Только корневой элемент получает .s-{hash} — дочерние элементы нет. Поэтому scoped-селектор для дочернего элемента, например .card__title, превращается в .card__title.s-a1b2c3, что требует обоих классов на одном и том же элементе и, соответственно, не будет совпадать с дочерними элементами. Используйте scoped-стили только для правил уровня root/host. Для стилизации дочерних элементов используйте глобальный <style> с BEM- именами классов (которые надёжно совпадают с дочерними элементами).

Компаньон-USS без scope (запасной вариант)

Для правил, которые нельзя выразить ни в одном из блоков — например, таргетинг компонента снаружи, или theme-уровневые переменные :root — положите рядом с компонентом unscoped USS (Resources/SusRuntime/Card.uss); он автоматически загружается в рантайме через LoadCompanionStyleSheets().

Имена сгенерированных файлов

ИсточникСгенерированный USS
Глобальный <style>Component.g.uss
<style scoped>Component_scoped.g.uss
inline style="…" на элементах шаблонаComponent_static.g.uss

См. также формат .sharq — раздел Style.