SvelteKit использует уникальный подход к стилям, сочетая преимущества локальной изоляции CSS с возможностью глобального применения стилей. Понимание различий между scoped и глобальными стилями критично для построения масштабируемых интерфейсов и предотвращения конфликтов CSS в крупных приложениях.
Scoped стили — это локальные стили компонента, которые применяются
только внутри текущего .svelte файла. Такой подход
автоматически предотвращает утечки CSS и гарантирует, что стили одного
компонента не затронут другие компоненты.
Пример использования scoped стилей:
<script>
let active = false;
</script>
<style>
button {
background-color: blue;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
}
button.active {
background-color: green;
}
</style>
<button class:active={active} on:click={() => active = !active}>
{active ? 'Активен' : 'Не активен'}
</button>
Ключевой момент: SvelteKit автоматически добавляет уникальные
атрибуты к каждому компоненту, например data-svelte-hash,
что позволяет стилям оставаться изолированными. Это избавляет от
необходимости придумывать уникальные классы для каждого компонента.
Для глобальных стилей используется специальный синтаксис
:global. Он позволяет явно указать, что определённые
правила должны применяться во всём приложении, а не ограничиваться
локальным компонентом.
Пример глобального CSS внутри компонента:
<style>
:global(body) {
margin: 0;
font-family: 'Arial', sans-serif;
background-color: #f5f5f5;
}
:global(.container) {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
</style>
<div class="container">
<h1>Пример глобального стиля</h1>
</div>
Можно также полностью отделять глобальные стили в отдельные файлы и
подключать их через +layout.svelte или
app.css, чтобы управлять базовыми стилями приложения
централизованно. Это удобно для reset CSS,
variables и utility classes.
Часто возникает необходимость сочетать локальные и глобальные
правила. В SvelteKit это реализуется легко, через комбинированное
использование обычных селекторов и :global.
<style>
.card {
background: white;
padding: 15px;
border-radius: 8px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
}
:global(.highlight) {
border: 2px solid red;
}
</style>
<div class="card highlight">
Контент с локальными и глобальными стилями
</div>
В этом примере .card — локальный стиль, применяемый
только внутри компонента, а .highlight — глобальный класс,
который может использоваться в других частях приложения.
CSS-переменные отлично интегрируются с глобальными стилями. Их удобно
определять в :root глобально, а затем использовать локально
в scoped стилях:
<style>
:global(:root) {
--primary-color: #3498db;
--secondary-color: #2ecc71;
}
button {
background-color: var(--primary-color);
color: white;
padding: 10px 15px;
border-radius: 4px;
}
</style>
<button>Кнопка с переменной</button>
Такой подход позволяет поддерживать единый theme приложения, при этом сохраняя изоляцию локальных компонентов.
SvelteKit позволяет импортировать глобальные стили сторонних библиотек через Jav * aScript:
// +layout.js
import 'bootstrap/dist/css/bootstrap.min.css';
После этого классы Bootstrap становятся доступны глобально во всех компонентах. При этом локальные scoped стили компонента сохраняют свою изоляцию, что позволяет сочетать кастомные стили с внешними библиотеками.
reset, variables, typography и
layout лучше держать глобально.:global в компонентах:
глобальные стили лучше централизовать, а не распределять по множеству
компонентов.Scoped и глобальные стили в SvelteKit создают гибкую систему управления CSS, обеспечивая баланс между изоляцией компонентов и централизованной настройкой внешнего вида всего приложения.