web-dev-qa-db-ja.com

SASS - 複数のファイルにわたって変数を使用する

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

// _master.scss 

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

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

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

172
dthree

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

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

そのファイルで私はそのように変数を宣言する:

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

それから私はこのような私の他のすべてのscssファイルをインポートするstyle.scssファイルを持っています:

// Utilities
@import "utilities/variables";

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

それから、インポートしたファイル内で、宣言した変数にアクセスできるはずです。

あなたがそれを使用したいと思う他のどのものの前にでも必ずあなたがその変数ファイルをインポートするようにしてください。

279
Joel

この答えは、私がこれをどのように使用してしまったのか、そして私が打った追加の落とし穴を示しています。

私はマスター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が複製されます。

68
dthree

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

グローバルなsassファイルに色を基にしたクラスを書くのはどうでしょうか。したがって、変数がどこにあるかを気にする必要はありません。以下のように。

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

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

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

0
gary gao