SASS-여러 파일에서 변수 사용


217

프로젝트의 모든 SASS 변수 정의를 저장하는 하나의 중앙 .scss 파일을 유지하고 싶습니다.

// _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
권태

단! 이 문장을 잘못 읽은 것 같습니다. "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
Joel

7
모듈 내에서 기본값 을 선언 할 수 있습니다 $black: #000 !default;. 문제 !default는 변수가 이미 존재하는 경우 변수가 재설정되는 것을 방지합니다.
Andrey Mikhaylov-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; }

중대한

변수, 함수 선언 및 기타 SASS 기능 외에는 _master.scss파일에 포함시키지 마십시오 . 실제 CSS를 포함하면 마스터를 가져 오는 모든 파일에이 CSS가 복제됩니다.


5
밑줄로 시작해야하는 파일에 대한 귀하의 의견에 감사드립니다. 나는 재단 스타일이 왜 부족한지 알아 내려고 약 3 시간을 보냈습니다. 밑줄로 시작하도록 재단 설정 파일의 파일 이름을 변경했습니다. 그러나 이제 파일 이름을 다시 변경해도 여전히 작동합니까? 무엇 ..? 오 잘 ... 한숨을
쉬고

4
다시 변경하지 마십시오. SCSS 파일에서 생성 된 일부 CSS가 작동 할 때 '작동'할 수 있습니다. 밑줄 만 사용하십시오. 그러나 그렇지 않으면 작동하도록 훌륭합니다!
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

더 많은
투표

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파일 을 가져올 필요가 없다는 것입니다.


분명히 나쁜 생각입니다. 많은 변수를 가질 수 있으며 가져 오기만으로 인덱스를 유지하는 것이 더 깨끗하며 모든 파일은 자체 제안입니다.
Carnaru Valentin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.