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