Узнайте, как структурировать ваши SCSS-файлы и использовать переменные Bootstrap по всему Angular-проекту для масштабируемых и настраиваемых дизайн-систем.

В предыдущей части мы рассмотрели, как настроить UI-библиотеку в проекте, используя Bootstrap в качестве примера. Результатом стал новый проект Angular с установленным пакетом NG Bootstrap и возможностью добавлять или удалять выбранные компоненты.

SCSS variables

Структура ваших стилей

Обычно я использую следующую структуру глобальных стилей в проекте. Такой подход обеспечивает гибкую, читаемую и легкую в поддержке систему стилей — что критично для крупных проектов, которые могут длиться месяцами или даже годами:

/src
  /styles
    /common
    /components
    /forms
    /mixins
    /variables
    /vendor
    ├── app.scss
    ├── vendor.scss
  styles.scss

Разберём каждую папку:

  • Common: содержит типографику, подключённые шрифты, иконки и базовые стили, используемые по всему проекту (например, container.scss или helpers.scss).

  • Components: хранит стили, относящиеся к конкретным компонентам.

  • Forms: включает стили для элементов форм, которые требуют дополнительной кастомизации помимо того, что можно сделать с помощью переменных Bootstrap.

  • Mixins: содержит миксины для переиспользуемых паттернов. Папка необязательна, если вы не используете их.

  • Variables: хранит переменные Bootstrap и любые другие переменные, необходимые для проекта.

  • Vendor: содержит измененные компоненты Bootstrap, которые нельзя настроить только через переменные.

Мы подробно рассмотрим каждую из них в следующих статьях. Пока все папки, кроме variables, следует оставить пустыми.


Переменные Bootstrap

Ключевая часть нашей настройки — файл с переменными Bootstrap. Как и многие другие CSS-фреймворки, Bootstrap имеет большое количество внутренних переменных, которые являются фундаментом их дизайн-системы. Это позволяет кастомизировать множество элементов без написания дополнительного CSS-кода. Файл с переменными содержит более 1000 значений для компонентов, что позволяет гибко их изменять.

Пример — фрагмент с настройками стилей кнопок. Здесь можно кастомизировать цвета, отступы, размеры шрифта и другие параметры:

// Buttons
//
// For each of Bootstrap's buttons, define text, background, and border color.

// scss-docs-start btn-variables
$btn-color:                   var(--#{$prefix}body-color) !default;
$btn-padding-y:               $input-btn-padding-y !default;
$btn-padding-x:               $input-btn-padding-x !default;
$btn-font-family:             $input-btn-font-family !default;
$btn-font-size:               $input-btn-font-size !default;
$btn-line-height:             $input-btn-line-height !default;
$btn-white-space:             null !default; // Set to `nowrap` to prevent text wrapping

$btn-padding-y-sm:            $input-btn-padding-y-sm !default;
$btn-padding-x-sm:            $input-btn-padding-x-sm !default;
$btn-font-size-sm:            $input-btn-font-size-sm !default;

$btn-padding-y-lg:            $input-btn-padding-y-lg !default;
$btn-padding-x-lg:            $input-btn-padding-x-lg !default;
$btn-font-size-lg:            $input-btn-font-size-lg !default;

$btn-border-width:            $input-btn-border-width !default;

Добавление переменных Bootstrap в проект

Чтобы использовать переменные Bootstrap, скопируйте файл _variables.scss из пакета Bootstrap:

/node_modules/bootstrap/scss/_variables.scss

Переименуйте его и поместите в:

/src/styles/variables/_bootstrap.scss

Важный момент: удалите все флаги !default после копирования файла. Эти флаги мешают перезаписыванию переменных и не дадут вашим изменениям вступить в силу. Подробнее об этом можно прочитать в официальной документации Sass.

Далее обновите vendor.scss:

...
@import 'bootstrap/scss/functions';
@import 'bootstrap/scss/variables';
// @import 'bootstrap/scss/variables-dark';
@import 'bootstrap/scss/maps';
@import 'bootstrap/scss/mixins';
@import 'bootstrap/scss/utilities';

// custom variables
@import 'variables/_bootstrap';
...

Таким образом, мы сначала импортируем дефолтные переменные Bootstrap, чтобы сохранить совместимость с будущими версиями, а затем импортируем собственный файл _bootstrap.scss для их переопределения.


Кастомизация переменных Bootstrap

Давайте попробуем поменять основной цвет проекта. В файле _bootstrap.scss  измените следующее:

...
$primary: $red; // поменяйте значение с $blue на $red 
$secondary: $gray-600;
$success: $green;
...
Кнопка Primary
Кнопка Primary

Теперь фон кнопки Primary поменялся с синего на красный без дополнительных стилей. Более того, вся дизайн-система поменялась соответствующе — обновились состояния кнопок hoveractivedisabled, а также все компоненты Bootstrap (input, checkbox, datepicker и др.), которые используют переменную $primary.


Стили компонентов Angular

В Angular каждый компонент может иметь не только HTML-шаблон, но и собственные CSS-стили, написанные на SCSS или LESS. Стили, определённые в файле компонента, применяются только к нему и не влияют на глобальные стили или другие страницы.

Однако, при построении дизайн-системы важно переиспользовать SCSS-переменные по всему проекту. В нашем случае важно, чтобы переменные Bootstrap были доступны внутри стилей компонентов. Это позволит менять внешний вид проекта через переменные, а не писать новый CSS-код.

Для этого импортируйте файл с переменными в SCSS-файл компонента:

@import 'variables/bootstrap';

// вы можете использовать переменные Bootstrap внутри своего компонента
.hero {
  background-color: $primary;    
  color: $white;    
  padding: 20px;
}

Чтобы не использовать относительные пути при импортах, обновите angular.json:

"build": {  
  ...  
  "options": {    
    ...    
    "stylePreprocessorOptions": {      
      "includePaths": [        
        "src/styles/"      
      ],    
    }    
    ...  
  }
}

Теперь обновите styles.scss:

@import 'vendor.scss';
@import 'app.scss';

После этого вы сможете использовать переменные Bootstrap в любом Angular-компоненте без указания относительных путей.


Использование того же подхода в NX

Для проектов, использующих архитектуру NX, настройка похожа, но с некоторыми нюансами. Вместо хранения стилей в папке приложения, создайте отдельную общую библиотеку для стилей и обновите project.json.

NX — это мощный монорепозиторный фреймворк для управления несколькими приложениями в одном репозитории. Он предоставляет инструменты для шаринга кода, оптимизированной сборки и модульной архитектуры, что делает его отличным выбором для крупных проектов Angular.

"build": {  
  ...  
  "options": {    
    ...    
    "stylePreprocessorOptions": {      
      "includePaths": [        
        // ui-styles — название библиотеки со стилями        
        "libs/ui-styles/src/lib"      
      ],    
    }    
    ...  
  }
}

Таким образом, стили и переменные можно переиспользовать в нескольких приложениях или библиотеках внутри рабочего пространства NX.


Заключение

В этой статье мы рассмотрели, как использовать переменные Bootstrap в вашем проекте. В итоге, вы получили:

  1. Структурированный подход к организации стилей.

  2. Единый файл для управления переменными Bootstrap, упрощающий кастомизацию.

  3. Возможность использовать Bootstrap-переменные внутри стилей компонентов Angular.

В следующей статье мы поговорим о работе с цветовыми палитрами и о том, как поддерживать единую цветовую систему в проекте. Следите за обновлениями!

Комментарии (7)


  1. Elendiar1
    17.10.2025 14:40

    С современным css лучшее что можно сделать, так это перестать множить сущности и отказаться от css-фреймворков.


    1. m_ig Автор
      17.10.2025 14:40

      А что использовать вместо них?
      Все равно же нужны какие-то компоненты, которые можно переиспользовать от проекта к проекту?


  1. dlartagnan
    17.10.2025 14:40

    Важный момент: удалите все флаги !default после копирования файла. 

    Надо просто импортировать свои переопределения до импорта переменных bootstrap. Это написано в документации bootstrap https://getbootstrap.com/docs/5.3/customize/sass/#importing


    1. m_ig Автор
      17.10.2025 14:40

      И да, и нет :)
      Все равно придется импортировать сначала как минимум Bootstrap функции - bootstrap/scss/functions потому что они используются внутри файла с переменными. Но вариант должен быть рабочим.
      ---
      Хотя сам Bootstrap в документации настаивает на удалении default флага. Это оттуда же:
      > Copy and paste variables as needed, modify their values, and remove the !default flag.


      1. dlartagnan
        17.10.2025 14:40

        Просто вы предлагаете странный порядок. Не надо копировать все переменные и подключать их после bootstrap переменных. Лучше вынести только нужные вам переменные и подключить их перед переменными bootstrap.

        Так вы видите, что вы конкретно переопределели. Ну, и конечно в этом файле вам нужно убрать default.


        1. m_ig Автор
          17.10.2025 14:40

          Такой вариант тоже возможен и я не раз пробовал его. Но он хорош когда количество таких переопределенных переменных меньше 100, а еще лучше пара десятков. Если таких переменных больше, то лучше копировать сразу все. Вот основные моменты из моего опыта:

          1) если активно использовать переменные, то постоянно надо обращаться к оригинальному файлу с ними, чтобы их копировать оттуда к себе и переопределять. Проще сразу забрать все.

          2) если работаете с командой над одним проектом, то некоторые разработчики вообще забивают на них и сразу пишут нужный им css вместо того чтобы найти нужную переменную которую можно использовать. Если держать все переменные в одном месте, то выше шанс что они будут использованы.

          3) ну и структура оригинального файла. Если ее сохранить и скопировать целиком к себе, то потом будет гораздо проще понять через сравнение с оригинальным файлом, то было изменено через переменные, а что в кастомных файлах.


          1. dlartagnan
            17.10.2025 14:40

            Да, с такой точки зрения, действительно лучше скопировать все.