SASS-複数のファイルで変数を使用する


216

プロジェクトのすべてのSASS変数定義を格納する1つの中央.scssファイルを保持したいと思います。

// _master.scss 

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

その性質上、プロジェクトには多数のCSSファイルが含まれます。プロジェクト全体のすべてのスタイル変数を1つの場所で宣言することが重要です。

SCSSでこれを行う方法はありますか?


それは不可能だと私は確信しています。しばらく前に同じことを試しましたが、うまくいきませんでした。
DrCord 2013

8
@DrCordはSASSの中心的な機能です:sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#partials
Ennui

甘い!「ドキュメントのベースレベルでのみ許可されているディレクティブ(ミックスインや文字セットなど)は、ネストされたコンテキストでインポートされたファイルでは許可されていません。「ネストされたコンテキスト」の部分を適切に読み取らない。
DrCord 2013

回答:


325

あなたはこのようにそれを行うことができます:

私はutilitiesという名前のフォルダーがあり、その中に_variables.scssという名前のファイルがあります

そのファイルでは、次のように変数を宣言します。

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

次に、style.scssファイルがあり、次のように他のすべてのscssファイルをインポートします。

// Utilities
@import "utilities/variables";

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

次に、インポートしたすべてのファイル内で、宣言した変数にアクセスできるはずです。

変数ファイルを使用する前に、変数ファイルをインポートするようにしてください。


4
完璧です。まさに私が意味し、必要としていたこと。最後の質問:インポートされたすべてのファイルはアンダースコアで始まると予想されますか?あなたはあなたのファイル名を強調しますが、@ import宣言で失敗します。
dthree 2013

46
これらのファイルは部分的なファイルと見なされ、名前はアンダースコアで始まる必要がありますが、インポート時には省略します。その理由を詳しく説明した本当に良い記事があります:alistapart.com/article/getting-started-with-sass
Joel

7
モジュール内でデフォルトを宣言できることに注意してください$black: #000 !default;!defaultthingieは、それがすでに存在する場合はリセットされてから変数を防ぎます。
Andrey Mikhaylov-lolmaus 2013

2
すべての変数を単一のファイルにダンプする必要があるのはなぜですか?それらを必要とするそれぞれのファイルに分割してドロップできませんか?たとえば、モーダルダイアログに必要な変数を_modal.scssに配置できませんか?
VJAI 2017年

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スタイルが欠けている理由を突き止めようとしました。Foundation設定ファイルのファイル名を変更して、アンダースコアとちょっとプレストで始まるようにしました!しかし、ファイル名をもう一度変更しても、まだ機能していますか?何だ……?
ええと

4
元に戻さないでください。おそらく、SCSSファイルから生成されたCSSが機能していたときに、それが「機能」している可能性があります。アンダースコアのみを使用してください。しかし、それ以外の場合は、それを機能させるのに最適です!
dthree 2015年

@poshaughnessy sassはキャッシュを使用するため、動作する可能性があるため、キャッシュできます。100%確実ではありません。
PeterM

サスも同じ?
Martian2049

1
あなたは@rinogoです。
3

18

この質問はずっと前に尋ねられたので、私は更新された回答を投稿したいと思いました。

の使用は避けてください@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、2017

1
Sass '@import'はどちらの方法でも機能します。アンダースコアの有無にかかわらず、URIを記述できます。また、「。scss」で終わるかどうかは関係ありません。
ポニー

1

グローバルsassファイルに色ベースのクラスを書き込むのはどうですか?したがって、変数がどこにあるかを気にする必要はありません。次のように:

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

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

そしてbackground-color、任意のファイルでクラスを使用できます。私のポイントは、variable.scssファイルにインポートする必要はなく、それを使用することです。


明らかなことは悪い考えです。多くの変数を持つことができ、インポートだけでインデックスを維持する方がクリーンであり、持つすべてのファイルは独自の提案です。
Carnaru Valentin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.