CSS Modules — это метод организации CSS, при котором стили локализуются для конкретного компонента. В Vue.js они позволяют создавать компоненты с уникальными классами, предотвращая конфликты имен и обеспечивая изоляцию стилей.
В Vue компоненты обычно определяются в формате .vue,
содержащем три секции: <template>,
<script> и <style>. Для
использования CSS Modules в секции <style> необходимо
добавить атрибут module:
<template>
<div :class="$style.container">
Пример использования CSS Modules
</div>
</template>
<script>
export default {
name: 'CssModuleExample'
}
</script>
<style module>
.container {
padding: 20px;
background-color: #f0f0f0;
border-radius: 8px;
}
</style>
$style, доступный внутри шаблона. Класс передается
динамически через :class="$style.className".<div :class="[$style.container, $style.active]">Контент</div>
<div :class="{ [$style.container]: true, [$style.active]: isActive }">Контент</div>
CSS Modules позволяют смешивать локальные и глобальные стили. Для
этого используется специальный синтаксис :global:
<style module>
:global(.global-class) {
color: red;
}
.localClass {
font-size: 16px;
}
</style>
:global делает класс доступным глобально, исключая его
из процесса генерации уникальных имен.$style.CSS Modules полностью совместимы с препроцессорами, такими как SCSS
или LESS. Для этого достаточно указать язык в атрибуте
lang:
<style module lang="scss">
$primary-color: #3498db;
.container {
padding: 20px;
background-color: $primary-color;
border-radius: 8px;
}
</style>
Сборщики вроде Vite или Webpack автоматически обрабатывают модули и преобразуют SCSS в CSS, сохраняя уникальность классов.
CSS Modules позволяют динамически применять стили на основе состояния компонента:
<template>
<button :class="[$style.button, isActive ? $style.active : '']">
Кнопка
</button>
</template>
<script>
export default {
data() {
return {
isActive: true
}
}
}
</script>
<style module>
.button {
padding: 10px 20px;
border: none;
background-color: #ccc;
}
.active {
background-color: #42b983;
color: white;
}
</style>
Это позволяет легко управлять стилями без глобальных селекторов и сложных каскадов.
При работе с внешними библиотеками CSS Modules можно использовать
:global для классов, которые необходимо оставить
неизменными:
<style module>
:global(.external-library-class) {
font-weight: bold;
}
</style>
Также можно комбинировать локальные и глобальные стили в одном элементе:
<div :class="[$style.localClass, 'external-library-class']">Текст</div>
CSS Modules в Vue.js представляют собой мощный инструмент для организации стилей компонентов, обеспечивая чистую архитектуру и предсказуемое поведение CSS без глобального загрязнения пространства имен.