CSS Modules — это подход к стилизации компонентов, позволяющий создавать локальные CSS-классы, уникальные для каждого компонента, что предотвращает конфликты имен. В экосистеме Naive UI это особенно важно, так как библиотека предоставляет большое количество готовых UI-компонентов, а локальная стилизация позволяет изменять их внешний вид без риска затереть глобальные стили.
Для работы с CSS Modules достаточно переименовать файл стилей с
расширением .module.css или .module.scss (если
используется Sass). Пример:
import styles from './Button.module.css';
import { NButton } from 'naive-ui';
export default {
setup() {
return () => (
<NButton class={styles.customButton}>Нажми меня</NButton>
)
}
}
В этом примере styles.customButton автоматически
преобразуется в уникальный класс, например
Button_customButton__abc123, что гарантирует отсутствие
конфликтов с другими стилями на странице.
CSS Modules поддерживает стандартные возможности CSS, включая селекторы, псевдоклассы и медиа-запросы. Например:
/* Button.module.css */
.customButton {
background-color: #42b983;
color: white;
padding: 8px 16px;
border-radius: 4px;
transition: background-color 0.3s ease;
}
.customButton:hover {
background-color: #369870;
}
@media (max-width: 768px) {
.customButton {
width: 100%;
padding: 12px 0;
}
}
Такой подход позволяет точечно управлять стилями компонентов Naive UI, не затрагивая глобальные стили приложения.
CSS Modules позволяет комбинировать несколько классов и применять динамические стили. Синтаксис выглядит следующим образом:
import styles from './Button.module.css';
import { NButton } from 'naive-ui';
import { computed } from 'vue';
export default {
props: {
primary: Boolean
},
setup(props) {
const buttonClass = computed(() => [
styles.customButton,
props.primary ? styles.primary : ''
]);
return () => <NButton class={buttonClass.value}>Кнопка</NButton>;
}
}
Здесь buttonClass будет автоматически объединять нужные
CSS-классы в зависимости от состояния компонента.
Некоторые компоненты Naive UI состоят из нескольких внутренних
элементов. Для их стилизации через CSS Modules используется специальный
селектор ::v-deep (в Vue 3) или :deep() в
<style module>:
/* Modal.module.css */
.modalContent :deep(.n-modal-body) {
padding: 24px;
background-color: #f5f5f5;
}
Это позволяет изменять внутренние части компонентов Naive UI, не ломая структуру и сохраняя локальность стилей.
При использовании SCSS можно добавлять вложенность, переменные и миксины, сохраняя все преимущества CSS Modules:
/* Card.module.scss */
.card {
background: #fff;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
&:hover {
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
.cardHeader {
font-weight: 600;
padding: 12px;
}
.cardBody {
padding: 16px;
font-size: 14px;
}
}
Подключение:
import styles from './Card.module.scss';
import { NCard } from 'naive-ui';
export default {
setup() {
return () => (
<NCard class={styles.card}>
<div class={styles.cardHeader}>Заголовок</div>
<div class={styles.cardBody}>Содержимое карточки</div>
</NCard>
)
}
}
::v-deep можно безопасно стилизовать внутренние части
компонентов.CSS Modules обеспечивает чистую и масштабируемую архитектуру стилей при работе с Naive UI, позволяя сочетать мощь готовых компонентов библиотеки и локальную кастомизацию интерфейса без глобальных конфликтов.