Skip to content

Можливості CSS одно-файлових компонент

Область CSS

Якщо тег <style> має атрибут scoped, його CSS застосовуватиметься лише до елементів поточного компонента. Це схоже на інкапсуляцію стилю в Shadow DOM. Він поставляється з деякими застереженнями, але не вимагає жодних поліфілів. Це досягається за допомогою PostCSS для перетворення наступного:

vue
<style scoped>
.example {
  color: red;
}
</style>

<template>
  <div class="example">hi</div>
</template>

У наступне:

vue
<style>
.example[data-v-f3f3eg9] {
  color: red;
}
</style>

<template>
  <div class="example" data-v-f3f3eg9>hi</div>
</template>

Кореневі елементи дочірнього компонента

З scoped стилі батьківського компонента не потраплять у дочірні компоненти. Однак на кореневий вузол дочірнього компонента впливатимуть CSS як батьківського, так і дочірнього CSS. Це призначено для того, щоб батьківський елемент міг стилізувати дочірній кореневий елемент для цілей макета.

Глибокі селектори

Якщо ви хочете, щоб селектор у стилях scoped був «глибоким», тобто впливав на дочірні компоненти, ви можете використати псевдоклас :deep():

vue
<style scoped>
.a :deep(.b) {
  /* ... */
}
</style>

Вищезазначене буде скомпільовано в:

css
.a[data-v-f3f3eg9] .b {
  /* ... */
}

TIP

Стилі з обмеженою областю не впливають на вміст DOM, створений за допомогою v-html, але його все одно можна стилізувати за допомогою глибоких селекторів.

Селектори слотів

За промовчанням стилі з обмеженою областю не впливають на вміст, відтворений <slot/>, оскільки вони вважаються належними батьківському компоненту, який їх передає. Щоб явно націлити вміст слота, використовуйте псевдоклас :slotted:

vue
<style scoped>
:slotted(div) {
  color: red;
}
</style>

Глобальні селектори

Якщо ви хочете, щоб лише одне правило застосовувалося глобально, ви можете використовувати псевдоклас :global замість створення іншого <style> (див. нижче):

vue
<style scoped>
:global(.red) {
  color: red;
}
</style>

Поєднання локальних та глобальних стилів

Ви також можете включити в той самий компонент як стилі з областю, так і без неї:

vue
<style>
/* глобальні стилі */
</style>

<style scoped>
/* локальні стилі */
</style>

Поради щодо використання стилів з обмеженою областю

  • Стилі з областю видимості не усувають потреби в класах. Через те, як браузери рендерять різні селектори CSS, p { color: red } буде працювати набагато повільніше при використанні scoped (тобто у поєднанні з селектором атрибутів). Якщо натомість ви використовуєте класи чи ідентифікатори, як-от у .example {color: red }, то ви практично усуваєте цю втрату продуктивності.

  • Будьте обережні з селекторами-нащадками в рекурсивних компонентах! Для правила CSS із селектором .a .b, якщо елемент, який відповідає .a, містить рекурсивний дочірній компонент, тоді всі .b у цьому дочірньому компоненті відповідатимуть правилу.

CSS Модулі

Тег <style module> скомпільовано як модулі CSS і надає отримані класи CSS компоненту як об’єкт під ключем $style:

vue
<template>
  <p :class="$style.red">Це повинно бути червоним</p>
</template>

<style module>
.red {
  color: red;
}
</style>

Отримані класи хешуються, щоб уникнути колізій, досягаючи такого ж ефекту, коли CSS охоплює лише поточний компонент.

Зверніться до специфікацій модулів CSS, щоб отримати додаткові відомості, наприклад глобальні винятки й композиція.

Впровадження користувацького імені

Можна налаштувати ключ властивості об'єкта з класами, що впроваджуються, вказавши значення атрибуту module:

vue
<template>
  <p :class="classes.red">червоний</p>
</template>

<style module="classes">
.red {
  color: red;
}
</style>

Використання з композиційним API

Класи, що впроваджуються, доступні в setup() і <script setup> через API useCssModule. Для секцій <style module> з користувацьким іменем, useCssModule приймає в якості першого аргументу відповідне значення атрибуту module як перший аргумент:

js
import { useCssModule } from 'vue'

// всередині setup() scope...
// за промовчанням, повертає класи для <style module>
useCssModule()

// при вказівці імені, повертає класи для <style module="classes">
useCssModule('classes')

v-bind() in CSS

Теги одно-файлового компонента <style> підтримують зв'язування значень CSS зі станом динамічного компонента за допомогою функції CSS v-bind:

vue
<template>
  <div class="text">привіт</div>
</template>

<script>
export default {
  data() {
    return {
      color: 'red'
    }
  }
}
</script>

<style>
.text {
  color: v-bind(color);
}
</style>

Синтаксис працює з <script setup> і підтримує вирази JavaScript (має бути взято в лапки):

vue
<script setup>
const theme = {
  color: 'red'
}
</script>

<template>
  <p>привіт</p>
</template>

<style scoped>
p {
  color: v-bind('theme.color');
}
</style>

Фактичне значення буде скомпільовано в хешовану спеціальну властивість CSS, тому CSS залишається статичним. Настроювана властивість буде застосована до кореневого елемента компонента за допомогою вбудованих стилів і негайно оновлена, якщо вихідне значення зміниться.

Можливості CSS одно-файлових компонент has loaded