我希望能够保留一个中心的.scss文件,用于存储项目中所有SASS变量定义。
// _master.scss
$accent: #6D87A7;
$error: #811702;
$warning: #F9E055;
$valid: #038144;
// etc...
由于项目的性质,它将拥有大量的CSS文件。在一个位置声明所有项目范围内的样式变量非常重要。
在SCSS中有没有这样的方法?
我希望能够保留一个中心的.scss文件,用于存储项目中所有SASS变量定义。
// _master.scss
$accent: #6D87A7;
$error: #811702;
$warning: #F9E055;
$valid: #038144;
// etc...
由于项目的性质,它将拥有大量的CSS文件。在一个位置声明所有项目范围内的样式变量非常重要。
在SCSS中有没有这样的方法?
你可以这样做:
我有一个名为“utilities”的文件夹,里面有一个名为“_variables.scss”的文件。
在那个文件中,我像这样声明变量:
$black: #000;
$white: #fff;
然后我有一个style.scss文件,在该文件中我像这样导入所有其他的scss文件:
// Utilities
@import "utilities/variables";
// Base Rules
@import "base/normalize";
@import "base/global";
接下来,在我导入的任何文件中,我都应该能够访问我声明的变量。
只需确保在您希望在其中使用它的任何其他文件之前导入变量文件即可。
$black: #000 !default;
。 !default
这个东西可以防止变量被重置,如果它已经存在的话。 - Andrey Mikhaylov - lolmaus这个问题很久以前就被问过了,所以我想发布一个更新的答案。
现在应该避免使用@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;
}
@use 'variables' as v;
body {
// alias.$variable-name
color: v.$text-colour;
}
编辑 此文撰写时(2020年11月),如@und3rdg所指出的,@use
仅适用于Dart Sass,而不支持 LibSass(现已弃用)或Ruby Sass。请参阅https://sass-lang.com/documentation/at-rules/use 以获取最新兼容性信息。
@use 'variables' as *
,因为它不需要为每个变量使用前缀。 - theking2这个答案展示了我最终使用它的方式以及我遇到的额外陷阱。
我创建了一个主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。
master.scss
的文件,并包含以下变量:
master.scss
文件:
$theme: blue;
$button_color: red;
$label_color: gray;
接着我在 style.scss
文件的顶部引入了 master.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;
}
希望这能帮到你...
愉快的编程 :)
@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']);
正如先前提到的那样,在较新版本的SASS中不推荐使用@import
。相反,在文件顶部使用@use "SASS局部文件路径"
代替。
你需要将 SASS 局部文件导入(使用@use
)到每个使用它的 SASS 文件中,而不仅仅是你的主文件。
假设我们有一个名为_variables.scss*
的SASS文件在名为partials
的文件夹中,我们想在header.scss
中使用它。因此在header.scss
中编写以下内容:
@use "partials/variables" as *
现在你可以使用所有在_variables.scss*
中定义的变量,只需使用$variable
(无前缀)。或者,您可以使用命名空间(就像Christian已经提到的那样)
@use "partials/variables" as v
使用v.$variable
来引用_variables.scss*
里面的变量。
*注意,SASS编译器会忽略下划线,这样就不会为每个SASS局部文件生成单独的CSS文件。相反,您只需使用@use
将它们全部导入到主SASS文件中即可。
@forward
和@use
来避免sass模块的全局限制。
_master.scss
$accent: #6D87A7;
$error: #811702;
$warning: #F9E055;
$valid: #038144;
// etc...
_global.scss
@forward '_master.scss';
// etc...
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';
我们可以在全局的sass文件中编写一些基于颜色的类,这样我们就不需要关心变量在哪里了。就像下面这样:
// base.scss
@import "./_variables.scss";
.background-color{
background: $bg-color;
}
然后,我们可以在任何文件中使用background-color
类。
我的意思是,我不需要在任何文件中导入variable.scss
,只需使用它即可。