Глобальные переменные scss для компонентов Angular без их постоянного импорта

У меня уже есть переменные SCSS, определенные в src/styles/settings/_variables.scss, и я импортирую их в src/styles.scss, но все же эти переменные доступны не для каждого отдельного компонента.

Есть ли способ создать глобальный файл, в котором будут храниться все переменные SCSS для остальных моих компонентов? Потому что писать @import в каждом файле компонента .scss очень неприятно, особенно если у меня много вложенных компонентов.

Я знаю, подобных вопросов много, но вроде все они устарели и не относятся к последним версиям Angular.

Я использую Angular 7.3 с CLI.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
73
0
66 268
5

Ответы 5

Is there any ways to make global file with scss variables available for all components?

Без импорта глобального файла каждый раз в каждом компоненте вы хотите, чтобы эти sass-переменные были доступны, это невозможно.

Как это работает в SASS, при использовании частичных кодов для лучшей организации кода вы можете применить директиву @import для ссылок. Итак, если в shared/_variables.scss есть какие-то переменные sass:

$lightslategray: #778899;
$darkgray: #A9A9A9;

и эти переменные нужно использовать в другой таблице стилей, таблица стилей с ними должна быть сначала @import-ed в нее:

// Shared
@import "shared/variables";

.content {
  background: $lightslategray;
}

В Angular это работает аналогичным образом (связанная ссылка на внешнюю таблицу стилей). Поэтому, если вам нужно, чтобы какие-то sass variables, mixins or functions использовались конкретным component.scss, нет другого простого способа, кроме как сослаться на них в этом component.scss с помощью директивы @import. Чтобы упростить задачу, вы можете создать файл src/_variables.scss и использовать такой синтаксис в своем component.scss:

@import “~variables.scss”;

Вам просто нужно добавить немного больше конфигурации, поэтому, когда вы объявляете свои глобальные переменные, вам нужно обернуть их в :root{}. Итак в src/styles/settings/_variables.scss.

:root 
{
--blue: #00b; // or any global you wish to share with components 
}

Затем, когда вы используете их в SCSS, вам нужно будет получить к ним доступ следующим образом.

.example-class {
  background-color: var(--blue)
}

Чтобы добавить к этому комментарии, этот метод может использовать mixins, @media и keyframes и не ограничивается только цветами/шрифтом. Это был пример.

Насколько я понимаю, вам нужен глобальный файл src/assets/style/global, а затем импортировать каждый файл scss туда, где вы определяете их таким образом.

@import 'filename';

Если вы не хотите, чтобы глобальные переменные использовались внутри компонента, посмотрите, когда у вас работают глобальные переменные. Посмотрите на ViewEncapsulation, так как это можно использовать для их игнорирования.

Я использую то же самое, но знаете ли вы, как использовать определенную переменную в CSS, например box-shadow?

Javascript Hupp Technologies 13.03.2019 06:51

Да, нативные переменные css уже довольно хороши, но это касается не только цветов и размера шрифта, но также некоторых миксинов и функций.

Vladimir Humeniuk 13.03.2019 09:46

попробуйте удалить корень: {} если вам не повезло с вышеуказанным редактированием.

Dince12 13.03.2019 10:14

вау, это сработало. Где это в документации sass? Интересно, каковы его последствия...

Gel 08.04.2020 20:21

поэтому, если бы я использовал эту переменную в моем @mixin в том же глобальном файле scss, завернутом в :root {}, как бы это работало? будет ли это распознано всеми другими компонентами, как если бы оно распознало переменную?

Gel 08.04.2020 20:28

Это не решает проблему. Здесь используются переменные CSS custom-properties, а не переменные SCSS.

Ahmad Alfy 14.10.2021 13:50

В angular 8 у меня работает.

В вашем файле _variable.scss вы должны добавить:

:root{--my-var:#fabada}

После этого перейдите в свой угловой.json и добавьте это в "стили":.

{"input":"yourPath/_variables.scss"}

шаг первый: перейдите в пользовательский файл scss (shared/css/_variable.scss) и напишите эту часть

:root{
  --color-text: red;
  --color-btn-success: green;
}

после перейдите в style.scss (это основной файл) и импортируйте этот файл:

@import './shared/css/Variables';

теперь вы можете использовать переменные во всех компонентах с этим синтаксисом:

.sample{
  color : var(--color-text);
}

Легко получить доступ к стилям sass из глобального файла. с двумя шагами.

  1. Добавьте путь к папке файлов стилей в массив includePaths в файле angular.json.
    1. Импортируйте файл стиля по имени файла в любом компоненте.

angular.json

"architect": {
  "build": {
    ...
    "options": {
      "stylePreprocessorOptions": {
        "includePaths": [
          "src/styles/var" // add path only, do not include file name
        ]
      },
      "styles": [
        ...
      ]
    }
    ...
  }
}

some-component.scss

@import "var";

mat-toolbar {
  height: $toolbar-height;
}

Другие вопросы по теме