Naive UI предоставляет богатый набор компонентов, каждый из которых имеет встроенные темы и переменные CSS, что позволяет гибко управлять внешним видом без необходимости переписывать компоненты. Основной подход к переопределению стилей в Naive UI заключается в использовании следующих инструментов:
style и class —
стандартные способы Vue для добавления inline-стилей или классов к
компоненту.theme-overrides — специфичный для
Naive UI механизм для изменения переменных темы на уровне отдельного
компонента.global-theme-overrides) — позволяют
переопределять стили на уровне всего приложения.theme-overridesКаждый компонент Naive UI поддерживает объект
theme-overrides, который может включать:
color, background-color)text-color, label-color)padding, margin,
border-radius)box-shadow, border)Пример переопределения темы для кнопки:
<template>
<n-button :theme-overrides="buttonTheme">Click me</n-button>
</template>
<script setup>
const buttonTheme = {
common: {
primaryColor: '#1E90FF',
primaryColorHover: '#1C86EE',
borderRadius: '8px'
},
Button: {
textColor: '#FFFFFF',
fontWeight: '600'
}
};
</script>
В этом примере изменяется основной цвет кнопки, цвет текста и скругление углов, не трогая остальную логику компонента.
global-theme-overridesЕсли требуется унифицировать стили для всех компонентов приложения,
используется объект global-theme-overrides, который
передаётся через n-config-provider:
<template>
<n-config-provider :global-theme-overrides="globalTheme">
<App />
</n-config-provider>
</template>
<script setup>
const globalTheme = {
common: {
primaryColor: '#FF6347',
fontFamily: 'Inter, sans-serif'
},
Button: {
borderRadius: '12px'
},
Input: {
borderColor: '#FF6347',
hoverBorderColor: '#FF4500'
}
};
</script>
Такой подход обеспечивает консистентный внешний вид всех компонентов без необходимости изменять каждый отдельно.
Naive UI активно использует CSS-переменные для своих тем. Каждая
переменная имеет префикс --n- и доступна для
переопределения в стилях:
:root {
--n-primary-color: #32CD32;
--n-border-radius: 10px;
}
.n-button {
background-color: var(--n-primary-color);
border-radius: var(--n-border-radius);
}
Это позволяет совмещать мощь стандартного CSS с возможностями Naive UI.
Компоненты часто имеют состояния: hover,
active, disabled. Для каждого состояния можно
задать отдельные значения в theme-overrides:
const buttonTheme = {
Button: {
color: '#FFFFFF',
colorHover: '#F0F0F0',
colorPressed: '#DCDCDC',
colorDisabled: '#A9A9A9'
}
};
Важно помнить, что Naive UI учитывает приоритеты:
локальные theme-overrides перекрывают глобальные, а inline
style перекрывает оба.
style и class для локальных измененийДля мелких корректировок можно использовать обычные Vue-механизмы:
<n-button class="custom-btn" style="font-size: 18px;">Click</n-button>
<style>
.custom-btn {
padding: 12px 24px;
border-radius: 16px;
}
</style>
Этот способ полезен, когда изменения не зависят от темы и нужны только для конкретного экземпляра компонента.
Часто оптимальным является комбинированное использование:
global-theme-overrides для общей стилистики
приложения.theme-overrides для переопределения отдельных
компонентов.Пример комплексного подхода для формы с кнопкой:
<n-config-provider :global-theme-overrides="globalTheme">
<n-form :theme-overrides="formTheme">
<n-form-item label="Username">
<n-input placeholder="Enter username" />
</n-form-item>
<n-button :theme-overrides="buttonTheme">Submit</n-button>
</n-form>
</n-config-provider>
Такой подход обеспечивает гибкость и консистентность одновременно.
ref или reactive) при задании
theme-overrides.С этим подходом Naive UI позволяет создавать полностью кастомизированные интерфейсы, сохраняя при этом преимущества готовых компонентов и стандартной темизации.