SASS - використання змінних у кількох файлах


217

Я хотів би зберегти один центральний .scss файл, який зберігає всі визначення змінних SASS для проекту.

// _master.scss 

$accent: #6D87A7;           
$error: #811702;
$warning: #F9E055;
$valid: #038144;
// etc... 

Проект матиме велику кількість файлів CSS, що обумовлено його характером. Важливо, щоб я оголосив всі змінні стилі загального проекту в одному місці.

Чи є спосіб це зробити в SCSS?


Я майже впевнений, що це неможливо, я те ж саме спробував ще деякий час тому і не зміг змусити його працювати.
DrCord

8
@DrCord навпаки, це центральна особливість SASS: sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#partials
Ennui

Солодке! Я думаю, що я, можливо, неправильно прочитав це твердження: "Директиви, які дозволені лише на базовому рівні документа, наприклад, mixin чи charset, не дозволяються у файлах, імпортованих у вкладеному контексті". і не правильно прочитати частину "вкладеного контексту".
DrCord

Відповіді:


325

Ви можете це зробити так:

У мене папка з назвою утиліти, і всередині мене є файл з ім'ям _variables.scss

у цьому файлі я оголошую такі змінні:

$black: #000;
$white: #fff;

тоді у мене є файл style.scss, в який я імпортую всі інші мої файли scss, як це:

// Utilities
@import "utilities/variables";

// Base Rules
@import "base/normalize";
@import "base/global";

то в межах будь-якого із імпортованих файлів я маю змогу отримати доступ до оголошених змінних.

Просто переконайтеся, що ви імпортуєте файл змінної перед будь-яким з інших, у яких ви хочете використовувати його.


4
Ідеально. Тільки те, що я мав на увазі і потрібно. Останнє запитання: Чи очікується, що всі імпортовані файли почнуться з підкреслення? Ви підкреслюєте своє ім'я файлу, але не вказуєте на декларації @import.
dthree

46
ці файли вважаються частковими файлами, і назви повинні починатися з підкреслення, ви не залишаєте їх під час імпорту. є дійсно гарна стаття, яка детально пояснює, чому тут: alistapart.com/article/getting-started-with-sass
Джоель

7
Зверніть увагу , що ви можете оголосити по замовчуванням в ваших модулях: $black: #000 !default;. Річ !defaultне дозволяє скинути змінну, якщо вона вже існує.
Андрій Михайлов - lolmaus

2
Чому нам доводиться скидати всі змінні в один файл? Чи не можемо ми розділити їх і перенести у відповідний файл, який їм потрібен? Наприклад, змінні, необхідні для модального діалогу, чи не можемо ми розмістити їх у _modal.scss?
VJAI

3
Ця відповідь більше не є рекомендованим способом повторного використання змінних у кількох файлах. Будь ласка , дивіться stackoverflow.com/a/61500282/7513192
whiscode

82

Ця відповідь показує, як я закінчився використанням цього та додаткових підводних каменів, в які я потрапив.

Я створив головний файл 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; }

ВАЖЛИВО

Не включайте у свій _master.scssфайл нічого, крім змінних, декларацій функцій та інших функцій SASS . Якщо ви включите фактичний CSS, він буде дублювати цей CSS у кожному файлі, в який ви імпортуєте головний код.


5
Дякую за ваш коментар щодо файлу, який потрібно починати з підкреслення! Я щойно витратив близько 3 годин, намагаючись зрозуміти, чому мені не вистачає купки стилів Foundation. Змінили ім’я мого файлу налаштувань фонду, щоб почати з підкреслення та ей престо! Але тепер, коли я знову змінюю ім'я файлу, він все ще працює? Що за....? Ну добре ... Зітхає і приймає, що це зараз працює
poshaughnessy

4
Не змінюйте його назад - це, ймовірно, «спрацьовує» якийсь створений CSS з вашого файлу SCSS, коли він працював. Просто використовуйте підкреслення. Але в іншому випадку, чудово, щоб він працював!
dthree

@poshaughnessy це може працювати, тому що sass використовує кеш, тому він може кешуватися. Не на 100% впевнений.
PeterM

те ж саме для sass ??
Martian2049

1
Правильно ти @rinogo.
dthree

19

Це питання було задано дуже давно, тому я думав, що опублікую оновлену відповідь.

Тепер вам слід уникати використання @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;
}

1
Тепер це має бути обрана відповідь, оскільки "імпорт" позначений як застарілий і буде видалений у майбутньому.
TyrionGraphiste

Цьому потрібно більше оновлень
ludovico

3

Створіть 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

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']);

1
Чи не слід випускати підкреслення з заяв @import?
Quantum7

1
Sass '@import' працює в будь-якому випадку. ви можете написати URI з підкресленням або без нього. також із закінченням .scss або без нього.
Поні

1

Як щодо запису деяких кольорових класів у глобальний файл sass, тому нам не потрібно дбати про те, де знаходяться змінні. Як і в наступному:

// base.scss 
@import "./_variables.scss";

.background-color{
    background: $bg-color;
}

і тоді ми можемо використовувати background-colorклас у будь-якому файлі. Моя думка, що мені не потрібно імпортувати variable.scssжоден файл, просто використовувати його.


Очевидно, що це погана ідея, ви можете мати багато змінних, і більш чисто, щоб зберігати індекс за допомогою лише імпорту, і кожен файл, який потрібно мати, є власним пропозицією.
Карнару Валентин
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.