SASS - 在多个文件中使用变量

dth*_*ree 184 css sass

我想保留一个中心.scss文件,该文件存储项目的所有SASS变量定义.

// _master.scss 

$accent: #6D87A7;           
$error: #811702;
$warning: #F9E055;
$valid: #038144;
// etc... 
Run Code Online (Sandbox Code Playgroud)

由于其性质,该项目将包含大量CSS文件.重要的是我在一个位置声明所有项目范围的样式变量.

有没有办法在SCSS中做到这一点?

Joe*_*oel 293

你可以这样做:

我有一个名为utilities的文件夹,里面有一个名为_variables.scss的文件

在该文件中我声明变量如下:

$black: #000;
$white: #fff;
Run Code Online (Sandbox Code Playgroud)

然后我有style.scss文件,我在其中导入我的所有其他scss文件,如下所示:

// Utilities
@import "utilities/variables";

// Base Rules
@import "base/normalize";
@import "base/global";
Run Code Online (Sandbox Code Playgroud)

然后,在我导入的任何文件中,我应该能够访问我声明的变量.

只需确保在您想要使用它的任何其他文件之前导入变量文件.

  • 这些文件被认为是部分文件,名称必须以下划线开头,但是在导入它时会将其遗漏.有一篇非常好的文章详细说明了原因:http://alistapart.com/article/getting-started-with-sass (44认同)
  • 请注意,您可以在模块中声明[defaults](http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#variable_defaults_):`$ black:#000!default;`.`!default` thingie阻止变量被重置(如果它已经存在). (7认同)
  • 这个答案不再是跨多个文件重用变量的推荐方法。请参阅/sf/answers/4305019771/ (6认同)
  • 完善.正是我的意思和需要.最后一个问题:导入的所有文件是否都以下划线开头?您强调您的文件名,但未能在@import声明. (4认同)
  • 为什么我们必须将所有变量转储到单个文件中?我们不能将它们拆分并放在需要它们的相应文件中吗?例如,模态对话框所需的变量不能将它们放在_modal.scss中吗? (2认同)

whi*_*ode 89

这个问题很久以前就被问到了,所以我想我会发布一个更新的答案。

您现在应该避免使用@import. 取自文档:

Sass 将在未来几年逐步淘汰它,并最终将其从语言中完全删除。更喜欢@use 规则。

可以在此处找到完整的原因列表

您现在应该使用@use如下所示:

_variables.scss

$text-colour: #262626;
Run Code Online (Sandbox Code Playgroud)

_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;
}
Run Code Online (Sandbox Code Playgroud)

您还可以为命名空间创建别名:

_otherFile.scss

@use 'variables' as v;

body {
  // alias.$variable-name
  color: v.$text-colour;
}
Run Code Online (Sandbox Code Playgroud)

编辑正如@und3rdg 在撰写本文时(2020 年 11 月)所指出的,@use目前仅适用于 Dart Sass,而不适用于LibSass(现已弃用)或 Ruby Sass。有关最新兼容性,请参阅https://sass-lang.com/documentation/at-rules/use

  • 这应该是现在选择的答案,因为“导入”被标记为已弃用,并将在将来删除。 (4认同)
  • 对于全局变量,我倾向于使用“@use 'variables' as *”,因为它不需要为每个使用的变量添加前缀。 (2认同)

dth*_*ree 75

这个答案显示了我最终如何使用这个以及我遇到的额外陷阱.

我制作了一个主SCSS文件.此文件必须在开头有一个下划线才能导入:

// assets/_master.scss 
$accent: #6D87A7;           
$error: #811702;
Run Code Online (Sandbox Code Playgroud)

然后,在我所有其他.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; }
Run Code Online (Sandbox Code Playgroud)

重要

除文件中的变量,函数声明和其他SASS功能外,不要包含任何内容_master.scss.如果您包含实际的CSS,它将在您导入master的每个文件中复制此CSS.

  • 非常感谢您对需要以下划线开头的文件的评论!我花了大约3个小时试图找出为什么我错过了一堆基金会风格.将我的Foundation设置文件的文件名更改为以下划线开头,嘿presto!但现在当我再次更改文件名时,它仍在工作?什么......?哦,好吧......*叹了口气,接受它现在正在工作* (5认同)
  • 不要改回来 - 它可能在你工作时从你的SCSS文件中"生效"了一些生成的CSS.只需使用下划线.但除此之外,很高兴让它工作! (4认同)
  • 正确,你是@rinogo。 (2认同)

小智 5

在 Angular v10 中,我做了类似的事情,首先创建一个master.scss文件并包含以下变量:

master.scss文件:


$theme: blue;

$button_color: red;

$label_color: gray;
Run Code Online (Sandbox Code Playgroud)

然后我将master.scss文件导入style.scss到顶部:

style.scss 文件:

@use './master' as m;
Run Code Online (Sandbox Code Playgroud)

确保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;

}
Run Code Online (Sandbox Code Playgroud)

希望它会有所帮助...

快乐编码:)