SASS - использовать переменные в нескольких файлах
Я хотел бы сохранить один центральный файл.scss, в котором хранятся все определения переменных SASS для проекта.
// _master.scss
$accent: #6D87A7;
$error: #811702;
$warning: #F9E055;
$valid: #038144;
// etc...
Проект будет иметь большое количество CSS-файлов, что связано с его природой. Важно, чтобы я объявлял все переменные стиля проекта в одном месте.
Есть ли способ сделать это в SCSS?
8 ответов
Вы можете сделать это так:
У меня есть папка с именем утилиты и внутри нее у меня есть файл с именем _variables.scss
в этом файле я объявляю переменные так:
$black: #000;
$white: #fff;
тогда у меня есть файл style.scss, в который я импортирую все мои другие файлы scss, как это:
// Utilities
@import "utilities/variables";
// Base Rules
@import "base/normalize";
@import "base/global";
затем в любом из импортированных мной файлов я смогу получить доступ к объявленным мной переменным.
Просто убедитесь, что вы импортируете файл переменной, прежде чем любой другой, в котором вы хотели бы использовать его.
Этот вопрос был задан давно, поэтому я решил опубликовать обновленный ответ.
Теперь вам следует избегать использования@import
. Взято из документов:
В течение следующих нескольких лет Sass постепенно откажется от него и в конечном итоге полностью удалит его из языка. Вместо этого предпочтите правило @use.
Полный список причин можно найти здесь
Теперь вы должны использовать @use
как показано ниже:
_variables.scss
$text-colour: #262626;
_otherFile.scss
@use 'variables'; // Path to _variables.scss Notice how we don't include the underscore or file extension
body {
// namespace.$variable-name
// namespace is just the last component of its URL without a file extension
color: variables.$text-colour;
}
Вы также можете создать псевдоним для пространства имен:
_otherFile.scss
@use 'variables' as v;
body {
// alias.$variable-name
color: v.$text-colour;
}
Этот ответ показывает, как я в конечном итоге использовал это и дополнительные ловушки, которые я попал.
Я сделал основной файл SCSS. Этот файл должен иметь подчеркивание в начале, чтобы импортировать его:
// assets/_master.scss
$accent: #6D87A7;
$error: #811702;
Затем в заголовке всех других моих файлов.SCSS я импортирую мастер:
// When importing the master, you leave out the underscore, and it
// will look for a file with the underscore. This prevents the SCSS
// compiler from generating a CSS file from it.
@import "assets/master";
// Then do the rest of my CSS afterwards:
.text { color: $accent; }
ВАЖНЫЙ
Не включайте ничего, кроме переменных, объявлений функций и других функций SASS в ваш _master.scss
файл. Если вы включите фактический CSS, он будет дублировать этот CSS во всех файлах, в которые вы импортируете мастер.
В angular v10 я сделал что-то вроде этого, сначала создал master.scss
файл и включил следующие переменные:
master.scss
файл:
$theme: blue;
$button_color: red;
$label_color: gray;
Затем я импортировал master.scss
файл в моем style.scss
на вершине:
файл style.scss:
@use './master' as m;
Убедитесь, что вы импортировали master.scss
на вершине.
m
это псевдоним для пространства имен;
Использовать @use
вместо того @import
согласно официальным документам ниже:
https://sass-lang.com/documentation/at-rules/import
Тогда в вашем styles.scss
файл вы можете использовать любую переменную, которая определена в master.scss
как показано ниже:
someClass {
backgroud-color: m.$theme;
color: m.$button_color;
}
Надеюсь, это поможет...
Удачного кодирования:)
Создайте index.scss и там вы сможете импортировать всю имеющуюся у вас структуру файла. Я вставлю вам свой индекс из корпоративного проекта, возможно, он поможет другим, как структурировать файлы в css:
@import 'base/_reset';
@import 'helpers/_variables';
@import 'helpers/_mixins';
@import 'helpers/_functions';
@import 'helpers/_helpers';
@import 'helpers/_placeholders';
@import 'base/_typography';
@import 'pages/_versions';
@import 'pages/_recording';
@import 'pages/_lists';
@import 'pages/_global';
@import 'forms/_buttons';
@import 'forms/_inputs';
@import 'forms/_validators';
@import 'forms/_fieldsets';
@import 'sections/_header';
@import 'sections/_navigation';
@import 'sections/_sidebar-a';
@import 'sections/_sidebar-b';
@import 'sections/_footer';
@import 'vendors/_ui-grid';
@import 'components/_modals';
@import 'components/_tooltip';
@import 'components/_tables';
@import 'components/_datepickers';
И вы можете смотреть их с gulp / grunt / webpack и т. Д., Например:
gulpfile.js
// SASS Task
var gulp = require('gulp');
var sass = require('gulp-sass');
//var concat = require('gulp-concat');
var uglifycss = require('gulp-uglifycss');
var sourcemaps = require('gulp-sourcemaps');
gulp.task('styles', function(){
return gulp
.src('sass/**/*.scss')
.pipe(sourcemaps.init())
.pipe(sass().on('error', sass.logError))
.pipe(concat('styles.css'))
.pipe(uglifycss({
"maxLineLen": 80,
"uglyComments": true
}))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest('./build/css/'));
});
gulp.task('watch', function () {
gulp.watch('sass/**/*.scss', ['styles']);
});
gulp.task('default', ['watch']);
Как упоминалось ранее, использование
@import
не рекомендуется в более новых версиях SASS. Использовать
@use "path to SASS partial file"
вместо этого в верхней части файла.*
Вам нужно импортировать (используя ) частичный файл SASS в каждый файл SASS, который его использует, а не только в ваш основной.
Допустим, у нас есть файл SASS с именем в папке с именем
partials
которые мы хотим использовать в . Итак, в
header.scss
ты пишешь:
@use "partials/variables" as *
Теперь вы можете использовать все переменные, определенные в with
$variable
(без префикса). В качестве альтернативы вы можете использовать пространство имен (например, уже упомянутый Кристиан)
@use "partials/variables" as v
ссылаться на переменные внутри
_variables.scss*
с
v.$variable
.
* Обратите внимание, что компилятор SASS игнорирует символы подчеркивания, поэтому для каждого частичного файла SASS не создается отдельный файл CSS. Вместо этого вы можете просто импортировать их все в свой основной файл SASS с помощью
@use
.
Как насчет записи какого-либо цветового класса в глобальный файл sass, поэтому нам не нужно заботиться о том, где находятся переменные. Так же, как следующие:
// base.scss
@import "./_variables.scss";
.background-color{
background: $bg-color;
}
и тогда мы можем использовать background-color
класс в любом файле. Я хочу сказать, что мне не нужно импортировать variable.scss
в любом файле, просто используйте его.
Я нашел решение для vue3, используя vite. Если вы используете dart-sass, вы можете обойти глобальное ограничение модулей sass с помощью@forward
и@use
.
_master.scss
$accent: #6D87A7;
$error: #811702;
$warning: #F9E055;
$valid: #038144;
// etc...
_global.scss
@forward '_master.scss';
// etc...
Затем в vite.config.js настройте параметры css как
export default defineConfig({
css: {
preprocessorOptions: {
scss: {
additionalData: `
@use "./<path-to-file>/_globals.scss" as *;
`,
},
},
},
// etc...
});
Как упоминалось в документах sass при импорте модулей без пространства имен.
Однако мы рекомендуем вам делать это только для таблиц стилей, написанных вами; в противном случае они могут ввести новых членов, которые вызовут конфликты имен!
Затем вы можете использовать другие модули @use в любых других таблицах стилей или компонентах, как показано ниже.
// component file needing a function module
@use 'functions.scss';